Java Interface
자바를 하면서 추상 클래스와 인터페이스의 차이에 대해서 항상 고민 해왔다.
추상클래스는 상속관계에서 자주 사용되고 정의 되지 않은 메소드를 자식 클래스에서 오버라이드하여 재정의한다. 이때 오버라이드 해도 되고 그렇지 않아도 상관없다 오버라이드 하지 않았을때는 자동으로 부모클래스의 메소드를 정의하게된다.
하지만 반대로 인터페이스는 모든 메소드들이 추상클래스로 되어 있으며 모든 메소드들을 오버라이드 하여야 한다 (자바 1.8부터는 default 접근지정자로 모든 메소드를 implements 한 클래스에서 재정의 하지 않아도 된다.)
여기서 가장 큰 차이점은 추상클래스는 다중상속이 되지 않는다. 인터페이스는 다중상속이 가능하다. 일반적인 이론이지만 위의 애기를 듣고는 감이 오질 않는다.
개인적으로 가장 큰 차이점은 추상클래스는 상속이 전제 되어야 한다.
상속이 전제되기 때문에 부모추상클래스와 자식 클래스간에는 Is A 관계가 성립한다.
추상클래스로 정의한 기능은 자식클래스와의 관계가 있다는 애기가된다.
부모추상클래스를 사람에 대한 인스턴스변수와 메소드들을 정의한다고 한다.
이때 자식클래스는 자동차나 비행기가 되기엔 애매모호함이 존재한다.
하지만 인터페이스는 기능만을 정의하여 어떤 기능이 던간에 implements 하는 부분에 대하여는 이상할 것이 없다.
이때 가장 큰 또하나의 차이점은 추상클래스에는 인스턴스 변수가 존재 할 수 있다.
인터페이스에는 인스턴스 변수 자체의 존재가 없다.
위의 기술한 부분에서 오는 가장 큰 차이점은 그위에 애기한 관계에 있다.
인스턴스 변수로 인한 관계가 상속으로 성립할수 있고 인터페이스는 단순히 기능을 붙이기
위한 내용이다.
솔직히 이렇게 글을 읽는것만으로 이해하기 쉽지않을 것이다.
ex) 혼자 개인적으로 스타크래프트를 생각하게 되었다.
테란의 경우 모든 건물을 띄울수는 없지만 띄울수 있는 건물들이 많다.
이때 부모클래스에 건물이라는 클래스는 만들어 건물을 뜨게하는 메소드를 정의한다.
이때 서플라이디폿 클래스를 만들어서 건물이라는 클래스에 extends 를 받게되면
fly() 라는 메소드를 오버라이드해야할 것이다.
이때 서플라이디폿은 fly() 할수 없는데 빈 메소드만 서술하여 구현할수는 있을 것이다
하지만 이는 올바르지 않다고 생각한다 이때 fly() 메소드는 flyable 로 날수 있는 인터페이스를 구현하여 각 따로 날수있는 건물과 날수없는 건물에 대하여 구분하여 implements 시키는 것이 올바르다고 판단된다. 부모 클래스인 건물 클래스에 fly() 메소드는 빼고 interface를 생성하여 implements 를 하는게 옳다고 생각한다.
ps : 위의 부분에서 혹시 다른 생각이나 놓치고 있는 부분들에 대한 답변도 들을수 있었으면 좋겠습니다.!!
'Java' 카테고리의 다른 글
Java Calendar Date (0) | 2015.07.22 |
---|---|
Java Wrapper Class & 오토박싱 언박싱 (2) | 2015.07.20 |
Java 추상 클래스 (abstract class) (0) | 2015.07.16 |
Java 메소드 오버라이딩 (3) | 2015.07.15 |
Java 배열 선언 (0) | 2015.07.13 |