Contents

Develop
2013.04.23 17:42

[java] Interface 와 abstract

조회 수 8704 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
1. Interface 와 abstract

* 공통점

1) abstract와 interface는 그자체가 instance화 될수가 없다.
즉, TestInterface t = new TestInterface(), TestAbstract a = new TestAbstract();
둘 다 컴파일을 해보면, 에러를 발생시킨다.

2) Prototype만 있고 Body가 없는 메소드를 멤버함수로 가진다.
소스1에서 보는 바와 같이 TestInterface, TestAbstract 는 함수 선언부는 존재하지만, 내용이 없는 함수들을 포함하고 있다.

[소스1]
public interface TestInterface {
    public static int num = 8;
    public void func1();
    public void func2();
}

public abstract class TestAbstract {
    public abstract void func1() ;

    public void func2() {
        System.out.println("func2");
    }
}


3) abstract, interface 클래스를 사용하려면, abstract, interface 위 클래스를 상속받아서, 새로운 클래스를 생성한 후, instance화 할 수 있다.

소스2 에서 보는바와 같이 상속을 받은후, 사용해야 한다.

즉, childclass c = new childclass(); 는 컴파일시 에러가 발생하지 않는다.


[소스2]

class childclass1 extends TestAbstract {
    // Abstrace Method Overriding
    public void func1() { 
        System.out.println("상속 받아서, Body를 채워줌");
    }
}

class childclass2 implements TestInterface {
    public void func1() {
        System.out.println("Class Test1");
    }

    public void func2() {
        System.out.println("Class Test2");
    }
}


* 차이점


1) Prototype만 있고 Body가 없는 메소드 즉, abstract 메소드라고 하는데, Abstract 클래스는 abstract 메소드와 일반 메소드를 혼용해서 가질수 있다. 즉, 일반메소드 + abstract 메소드 형태를 유지한다.

하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 한다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재한다.


2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다르다. 

abstract클래스는 소스2처럼 extends를 사용하고, interface클래스는 implements 을 사용한다.


3) 다중상속 가능유무

Java에서는일반 클래스에서는 다중상속을 지원하지 않는다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있다. 하지만 interface의 경우에는 다중상속이 가능하다.


4) 클래스 시작 키워드가 다르다. 

abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작한다.



* abstract 를 쓰는 이유는?

강제성(자식클래스에게 반드시 오버라이딩을 하게한다)

예로, Car 클래스의 speedUp()메서드는 Truck, Taxi 등의 하위 클래스에서 모두 다르게 구현해야 될 필요가 있는데, Car 클래스에서 이미 메서드가 있다면, 하위 클래스를 구현한느 프로그래머가 해당 메서드를 빼먹을 수 있다. 그러나, 추상 클래스로 최상위 클래스를 정의하면서 speedUp()메서드를 메서드를 추상메서드로 선언하면, 하위 클래스는 추상메서드를 반드시 오버라이딩 해주어야 하기 때문에, 하위의 모든 클래스가 speedUp()메서드를 만들어야 한다.


*abstract는 직접 객체화 될 수 없다.

(추상 메서드가 메서드 안에 내용이 없기 때문에, 메서드를 직접 호출할 수 없기때문이다.)


class A{
    abstract void a();
};
// 에러
// 추상메서드가 하나라도 있으면 그 클래스는 추상 클래스로 해야한다.


아래처럼

abstract class A{
    abstract void a();
}; //OK


new A(); // error 추상클래스는 객체화 될 수 없다.

==> 표준의 의미이다.


자식을 위해 존재하는 클래스(부모와같다.)

자식을 통해서 super의 의미로 객체가 생성이 되긴하지만 자기가 직접 객체생성은 되지 않는다.

구현부가 없다.


하위클래스에게 강제성을 부여하는 것은?

Abstract

abstract class A{
    abstract void a();
};                   

class B extends A{
} // 에러


위 에러 해결하는  두가지 방법은?

1>> B클래스도 abstract로 만들어라

2>> a()메서드를 오버라이딩 해라



?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
1173 System/OS 해커스랩 깨기.. 후후.. ㅋㅋ file hooni 2013.04.23 18413
1172 Etc 플라스터(Plaster) 수업 내용 secret hooni 2016.05.24 0
1171 Develop 프로그램 문서 관리 (Doxygen) hooni 2013.04.23 16385
1170 Develop 프로그래밍에서 foo, bar 함수의 유래 file hooni 2013.06.25 21257
1169 Develop 프로그래밍 소스 관련 사이트.. hooni 2013.04.23 16485
1168 Develop 페이팔에서 돈 찾기 (Paypal withdraw) file hooni 2014.02.20 11374
1167 Etc 티스토리 테이블 html,css 구문 hooni 2013.11.03 15954
1166 System/OS 콘솔에서 패스워드 걸린 zip 압축하는 명령 hooni 2018.03.02 939
1165 System/OS 컴파일러 수업 자료(교재 : 컴파일러 입문) file hooni 2003.04.23 21966
1164 Develop 캘리포니아 운전면허 족보 file hooni 2017.06.12 736
1163 Etc 캘리포니아 운전면허 문제 file hooni 2017.07.22 978
1162 Develop 최근 논문 자료 (2011/01/03, 만현형한테 보낸거..) secret hooni 2013.04.23 10366
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 98 Next
/ 98