-
자바 인터페이스와 추상클래스 차이점Java 2023. 10. 10. 19:20
* 인터페이스와 추상클래스는 추상 메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다.
인터페이스와 추상클래스 공통점
- new 연산자로 인스턴스 생성 불가능
- 사용하기 위해서는 하위 클래스에서 확장/구현이 필요
인터페이스와 추상클래스 차이점
- 가장 큰 차이점은 사용 목적에 중점을 두고 봐야한다.
- 인터페이스
- 다중상속이 가능
- 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함
- 모든 메소드가 추상 메소드로만 이루어져 있는 것
- implements라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현
- 추상클래스
- 다중상속이 불가능
- 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용
- 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우
- extends 키워드를 사용해 자신의 기능들을 하위 클래스로 확장
추상클래스를 사용하는 경우
- 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버 통합을 할때
- 멤버에 private, default, protected 접근자 선언이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우 (인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
- 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을때
- 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
- 객체의 공통점을 찾아 상속 관계를 타고 올라갔을 때, 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.
abstract class Exam { /* Exam 시험 클래스에서 공통적으로 보는 kor, eng, math 멤버 필드를 상속(extends)을 통해 상위 클래스로 묶음 */ int kor; int eng; int math; /* 메서드도 통합하며 추상화(abstract)를 해주면서 나중에 다른 종류의 Exam 클래스를 추가/확장 하는데 있어 유연한 구조적인 객체 지향 설계 */ abstract void total(); abstract void avg(); } class NewlecExam extends Exam { int com; void total(){} void avg(){} } class YBMExam extends Exam { int toeic; void total(){} void avg(){} }인터페이스를 사용하는 경우
- 어플리케이션의 기능을 정의해야 하지만 구현 방식이나 대상에 대해 추상화 할 때
- 서로 관련성이 없는 클래스들을 묶어주고 싶을때 (자유롭게 / 형제 관계)
- 다중 상속을 통한 추상화 설계를 해야할때
- 특정 데이터 타입이 어디서 구현되는지 신경쓰지 않은 경우
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해
abstract class Creature { } abstract class Animal extends Creature { } abstract class Fish extends Creature { } // 수영 동작 추상 메소드를 따로 인터페이스를 만들어 넣는다. interface Swimmable { void swimming(); } class Tiger extends Animal { } class Parrot extends Animal { } // 인터페이스를 구현함으로써 동작이 필요한 클래스에만 따로 상속에 구애받지않고 묶음 class People extends Animal implements Swimmable{ @Override public void swimming() {} } // 인터페이스를 구현함으로써 동작이 필요한 클래스에만 따로 상속에 구애받지않고 묶음 class Whale extends Fish implements Swimmable{ @Override public void swimming() {} }- swimming 인터페이스를 추상메소드로 구현한다면, Creature 추상 클래스에 추상 메소드를 추가하고 이를 상속하는 모든 자손/자식 클래스에서 반드시 메소드를 구체화 해야한다는 규칙 때문에 실제로 수영을 못하는 호랑이(Tiger)와 앵무새(Parrot) 클래스에서도 메소드를 구현해야 하는 강제성이 생기게 된다.
// 추상 클래스 (조상 클래스) abstract class Creature { abstract void swimming(); // 수영 동작을 하는 추상 메소드 } // 추상 클래스 (부모 클래스) abstract class Animal extends Creature { } abstract class Fish extends Creature { } // 자식 클래스 class Parrot extends Animal { // 앵무새는 수영을 할수 없지만 상속 관계로 인해 강제적으로 메소드를 구현해야하는 사태가 일어난다. void swimming() {} } class Tiger extends Animal { // 호랑이는 수영을 할수 없지만 상속 관계로 인해 강제적으로 메소드를 구현해야하는 사태가 일어난다. void swimming() {} } class People extends Animal { void swimming() { // ... } } class Whale extends Fish { void swimming() { // ... } }출처)
'Java' 카테고리의 다른 글
자바 new String()과 리터럴("")의 차이 (0) 2023.10.12 자바 URL 통신 사용법 및 총 정리 (0) 2023.10.12 자바 불변 객체와 final에 대한 개념 (0) 2023.10.09 자바 try-with-resources 알아보기 (1) 2023.10.09 자바 오버라이딩(Overriding)과 오버로딩(Overloading) 차이점 (0) 2023.10.09