📝느낀 점
항상 궁금하였던 부분이다. 둘다 비슷한 기능을 하는거 같은데, 인터페이스만 있으면 되는거 아닌가? 하는 생각을 매번 하여 왔다. 이번에 제대로 알아보고 둘의 차이점을 작성 해볼까 한다. 추상 클래스와 인터페이스는 서로 다른 목적과 사용 사례를 가지고 있다는 것이 포인트이다. 핵심만 정리해 보자면, 추상 클래스는 재정의를 하여 확장 개념에 목적을 두고 있는 것이고, 인터페이스는 구현 클래스들이 같은 동작을 하는 것을 보장하는 것에 목적이 있는 것이다.
차이가 뭔가?
추상 클래스는 abstract 지시자로 정의되어서, 추상 메서드가 하나 이상 포함되는 클래스이고,
인터페이스는 interface 지시자로 정의되어서, 모든 메서드가 추상메서드로 정의되게 된다. -> 하지만
- 자바 8부터 디폴트 메서드가 생겨 인터페이스에서도 메서드 구현이 가능하게 되었다.
그렇기에 둘의 차이는
- 추상 클래스는 상속을 받아서 재활용하고 확장시키는데 목적이 있고,
- 인터페이스는 함수 구현을 강제해서, 구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있다.
추상 클래스의 용도
- 서브 클래스가 상속하고 확장하도록 한다.
- 공통의 속성과 메서드를 추상 클래스에 정의하여 추상 클래스는 일부 메서드를 구현할 수 있다.
- 추상 클래스 내에서 추상 메서드와 구현된 메서드를 모두 포함할 수 있다.
- 추상 클래스를 사용하면 코드 재사용과 확장이 용이하며, 상속을 통해 기본 동작을
제공하고 하위 클래스에서 필요에 맞게 조정할 수 있다.
인터페이스를 왜 사용하는가?
두가지 장점이 있다.
- 인터페이스 중심의 설계를 통해 보다 명확한 프로그램 구성이 가능해 진다.
- 서로 다른 객체에게 연관 관계를 부여하기 때문이다. (=다형성)
- 즉, 업캐스팅이 가능하게 되는 것이다.
인터페이스와 다형성
SmartPhone은 알람 및 전화기, 또는 메신저 타입으로 해석(업캐스팅)될 수 있다.
이렇게 하나의 객체가 다양한 타입으로 해석되는 것을 다형성이라고 한다.
// 스마트폰 객체 생성
SmartPhone sp = new SmartPhone();
// 스마트폰을 다양하게 해석(업캐스팅 - 상위 타입으로 해석)
Alarm a = sp; // 스마트폰은 알람이다. (O)
phone p = sp; // 스마트폰은 전화기이다. (O)
Messanger m = sp; // 스마트폰은 메신저이다. (O)
인터페이스의 용도
- 인터페이스는 클래스가 특정 동작을 지원하거나 어떤 역할을 수행할 수 있음을 선언하는데 사용된다.
- 인터페이스는 메서드 시그니처만을 정의하고, 해당 메서드를 구현하는 클래스가 어떤 클래스인지 신경 쓰지 않는다.
- 인터페이스는 다중 상속을 지원한다
- 인터페이스는 클래스 간에 일관성 있는 프로토콜을 정의하고,
다형성을 통해 객체들을 동일한 방식으로 다루는데 사용된다.
인터페이스의 Default Method는 왜 추가 했을까?
인터페이스에서 몸통이 추가 된 메서드를 Default Method라고 한다.
즉, 메서드를 구현할 수 있다. 또한 이를 구현한 클래스에서는 Default Method를 오버라이딩 할 수 있다
pulbic interface MyInterface {
default void Hello() {
System.out.println("Hello World");
}
}
디폴트 메서드를 왜 추가 했을까?
인터페이스가 변경이 되면, 그 인터페이스를 구현하고 있는 모든 클래스들이 해당 메서드를 구현해야 되는 문제가 있다.
상황을 생각해보자.
A본사(인터페이스)가 있고, A본사를 구현하고 있는
B지점(클래스), C지점(클래스)이 있다고 생각해보자.
(문제점)
A본사 내부에서만 추가해야 될게 생겨 추가 하려고 하는데,
A본사와 모든 지점인 B지점, C지점까지 추가되는 것이다.
이런 문제를 해결하기 위해, 인터페이스에서 메서드를 구현해 놓을 수 있도록 자바8에서 추가해 놓은 것이다.
이런 문제를 해결 하기 위해 몸통이 { } 있는 메서드인 디폴트 메서드가 생긴 것이다.
필수!
메서드 앞에 무조건 default 키워드를 붙여 줘야 된다 → 생략 불가능
정리하면,
추상 클래스는 상속을 통해 공통된 동작을 제공하고, 일부 메서드를 구현하며, 하위 클래스가 재사용 및 확장을 할 수 있게 하는 것이다. 반면, 인터페이스는 클래스가 어떤 역할을 수행할 수 있음을 선언하고, 클래스 간의 일관성 있는 프로토콜을 제공하며, 다중 상속과 다형성을 지원한다. 두 가지 개념은 서로 보완적인 역할을 하며, 코드 재사용과 유연성을 높이기 위해 사용된다.
'Java' 카테고리의 다른 글
제네릭이 필요한 이유는 무엇인가요? (0) | 2023.11.06 |
---|---|
박싱(boxing), 언박싱(un-boxing) (0) | 2023.11.06 |
오버로딩, 오버라이딩 설명 (0) | 2023.11.06 |
변수들은 JVM에서 어디에 할당 되나요? / 클래스와 객체 차이 (0) | 2023.11.06 |
클래스와 메소드의 사용 이유는 무엇인가요? (0) | 2023.11.06 |