점투자 4: 인터페이스 vs 추상클래스

공통점

메소드의 설계도만 제공하고 구체적인 구현은 하지 않음으로써 동일한 메소드를 다양한 형태로 제공할 수 있는 다형성을 제공

차이점

인터페이스는 공통된 기능을 제공하는, 클래스로의 기능은 없는 껍데기 추상클래스는 하나의 클래스로 기능할 수 있으며, 이를 상속 받아서 기능을 확장시키는데 목적이 있음

예시를 통해 알아보기

creature라는 클래스의 자식으로 animal과 plant가 있고, animal의 자식으로 dog, cat이 있으며, plant의 자식으로 tree와 flytrap이 있다고 하자.

  1. 추상클래스를 쓰는 경우

animal이 단지 dog와 cat에게 메소드를 제공하기 위해서만 존재하는 것이 아니라 그 자체로도 하나의 클래스로 기능해야 하는 경우 사용한다.

bark라는 메소드에 다형성을 주고자 한다면, animal을 추상클래스로 선언한 후 bark를 추상메소드로 선언할 수 있다. 그러면, bark의 기능을 dog와 cat이 서로 다르게 구현할 수 있다.

추상클래스 대신 인터페이스를 쓰면 안될까?

a. 공통 메소드 적용 불가

→ 다형성을 주고 싶지 않은, 클래스 간에 공통적으로 쓰고 싶은 메소드가 있는 경우는 쓸 수 없었다. 하지만 Java8 이후로 default 메소드 기능이 추가되면서 옛 말이 되었다.

b. 공통 변수 사용 불가

→ animal에다가 cat과 dog에서 공통적으로 쓰는 변수를 선언해 쓰고 싶다면, 추상클래스 밖에 답이 없다. 인터페이스는 변수 선언이 안 되기 때문.

c. 메소드에 대한 접근 지정자 설정 불가

→ 인터페이스의 메소드는 무조건 public으로 선언된다.

  1. 인터페이스를 쓰는 경우

하나의 상위 클래스로 기능하기 보다, 그냥 공통된 기능을 제공하는 모듈로써 활용하는 경우 사용한다.

위의 예시에서 bark()를 제공하기 보다는, plant와 animal클래스의 하위 자식들(flytrap, dog, cat)에 모두 적용할 수 있는 eatable() 메소드를 제공할 때 쓰는 것이 더 바람직하다.

만약 eatable메소드를 제공할 추상클래스를 만들어 상속시키려고 한다면?

a. 다중 상속 문제

-> 이런 추상 클래스를 여러 개를 상속받으려 한다면, 다중 상속의 문제에 부딫히게 된다. C++은 가상상속을 도입하여 이걸 해결했지만, 자바는 아예 다중 상속 자체를 막아놓았다. 유일하게 다중 상속을 허용한 인터페이스를 쓰는 수 밖에 없다.

Last updated