문홍의 공부장

[Java] 추상클래스와 인터페이스의 공통점과 차이점 본문

개발/Java

[Java] 추상클래스와 인터페이스의 공통점과 차이점

moonong 2020. 2. 8. 17:27
반응형

공통점

  • 추상클래스와 인터페이스는 선언부만 있고 구현 내용이 없는 클래스이다.
  • 자기 자신이 직접 객체를 생성할 수 없으며, 자식 클래스가 추상클래스를 상속(extends)받거나, 인터페이스를 구현(implements)하여 객체를 생성할 수 있다.
  • 선언된 type과 자식의 type이 같아야만 한다.

차이점

추상클래스(Abstract Class)

추상 메소드를 하나라도 가지고 있는 클래스라고 정의하는 경우가 있는데, 명확하게 말하자면 이는 틀린 말이다. 추상클래스는 추상 메소드가 없어도 무방하다. 하지만, 추상메소드를 하나라도 가지고 있는 클래스는 무조건 추상클래스여야 한다.

추상클래스는 non-static과 non-final 필드 및 public, protected, private 메소드를 사용할 수 있다.
추상 클래스를 상속받은 클래스는, 반드시 추상 메소드를 구현하여야 한다. 또한, 다중 상속이 불가하다.

추상클래스와 인터페이스의 차이점에서 키워드는 목적, 그리고 어떨 때 사용하는지이다.
추상클래스의 목적은 말 그대로 공통적인 기능을 하는 객체들의 추상화이다.

예를 들어, 전자기기라는 클래스가 있고, 하위 클래스로는 텔레비젼, 휴대전화 등의 클래스가 있다. 전자기기들은 공통적인 기능(turnOn, turnOff 등)을 가지고 있다. 각각의 클래스에 중복하여 구현할 필요 없이, 공통적인 기능을 관리하기 위해 상위 클래스인 전자기기 클래스를 만드는 것이다.

인터페이스와 추상클래스를 단순하게 자식클래스에서 반드시 구현하게 위임시키는 것만 생각하면 비슷하지만 용도를 봤을 때 다르다. 추상클래스는 말그대로 추상화 시킬 때 사용하면 된다.

책에서 보는 is-a 관계가 핵심이다.
쉽게 말하면 만들어야 할 여러 클래스들의 공통점을 찾아 추상화시켜서 사용하는 것이 개발에서 이득일 때!
위의 예시와 같이 TV, 냉장고, 휴대전화 등의 클래스를 만들어야 할 일이 있을 때, 전자기기라는 추상 클래스로 추상화 시켜서 사용하면 좋을 때 사용한다.

전자기기가 공통적으로 사용되는 메소드(turnOn, turnOff 등)를 추상 클래스에 선언하고, 각 기기가 가진 고유의 기능은 각 클래스에 나누어 적는다. 그리고, 상위 클래스를 상속받아 공통 기능을 구현할 때에, 각 기기가 가진 구체적인 동작을 추가하여 기능을 확장시킬 수 있다. 상속 받아서 기능을 확장시키는 전형적인 상속의 목적을 달성하는 것이다.

1
2
3
4
5
6
7
public abstract class ElectronicDevice {    
    public abstract void turnOn();
    abstract void turnOff();
    public void aa() {
        //
    }
}
cs

 

위와 같이 전자기기 추상 클래스를 생성하고, TV, 핸드폰 클래스가 이를 상속한다고 하자.
각각 turnOn(), turnOff() 메소드를 오버라이딩 하며, 각각의 클래스에 맞게 내용을 구체화 할 수 있다.
'전원을 켠다' 라는 기능은 기본적으로 존재하지만, TV의 경우 1) 직접 TV 하단의 전원 버튼을 누른다. 2) 리모콘의 전원 버튼을 누른다. 3) 기가지니 같은 IoT를 불러내 TV를 키도록 명령한다, 와 같이 기능을 구체화 할 수 있다. 핸드폰 클래스에서도 역시 마찬가지로 '전원을 켠다'라는 기본 기능을 자기 자신에 맞게 재정의하게 될 것이다.

인터페이스(Interface)

상수(final, static final), 추상 메소드만 가지고 있는 클래스.
인터페이스를 구현하는 클래스는, 인터페이스의 모든 메소드를 구현하여야 한다. 인터페이스는 다중 상속이 가능하다.

사용 목적에 다시 한 번 집중해보면, 인터페이스는 구현하는 모든 클래스에 대해 특정 메소드가 반드시 존재하도록 강제하는 역할. 즉, 구현 객체가 같은 동작을 한다는 것을 보장하기 위한 목적이다.

탈 것을 예로 들어보자.
탈 것이라는 클래스에는 자전거, 자동차, 비행기 등이 있다. 이들은 타다, 속도를 올린다와 같은 공통 기능이 존재한다. 탈 것이 지닌 공통 행위를 각각의 클래스마다 수행한다고 보장하기 위한 목적으로 한다면, 인터페이스로 ride() 를 선언하여 각 클래스들이 이를 구현하도록 할 수 있다.

1
2
3
4
5
public interface Vehicle {
    public void ride();
    public void speedUp();
    public void speedDown();
}
cs

 

상속과 마찬가지로 is-a 관계이다.
Thread는 runnable이다. 라고 했을 때 인터페이스도 상속이니 is-a관계로 볼 수 있다.
Inheritance (IS-A) vs. Composition (HAS-A) Relationship 으로 상속과 관련되면 is-a로 보고, 멤버 변수로 사용되면 has-a로 본다.

추상클래스 (abstract class) 인터페이스 (interface)
선언부만 있고 구현 내용이 없는 클래스.
자기 자신이 직접 객체를 생성할 수 없음 (하위클래스의 상속(extends)/ 구현(implements) 필요)
선언된 type과 자식의 type이 같아야만 한다.
추상 메소드를 하나라도 가지고 있는 클래스는 무조건 추상 클래스여야 한다. 추상메소드만 가지고 있는 클래스
추상 클래스를 상속받는 클래스는 반드시 추상 메소드를 구현해야 한다. 인터페이스를 구현하는 클래스는 인터페이스의 모든 메소드를 구현하여야 한다.
다중 상속 불가 다중 상속 가능
상속받아 기능을 확장 시키는 것이 목적 구현 객체가 같은 동작을 한다는 것을 보장하기 위한 목적

References:

https://jeong-pro.tistory.com/82
https://hamait.tistory.com/650?category=79137

 

반응형