추상 클래스
abstract class AbstractExample {...}
- 추상적인 개념을 제공하는 클래스로서 실체인 인스턴스가 존재하지 않음
- 상속을 목적으로 사용되며 부모 클래스 역할을 담당
- 클래스 선언 시 abstract 키워드를 사용
- 기존 클래스와 완전히 같지만 new 클래스명() 과 같이 직접 인스턴스를 생성하지 못하는 제약이 추가됨
- 추상 클래스 생성 시 cannot be instantiated 컴파일 오류가 발생하므로 인스턴스를 생성할 문제를 근본적으로 방지
- 메모리 구조는 기존 클래스와 동일
추상 메서드
public abstract void testMethod();
- 추상적인 개념을 제공하는 메서드로서 실체가 존재하지 않고, 메서드 바디가 없음
- 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 함
- 그렇지 않을 경우 컴파일 오류 발생
- 추상 메서드는 메서드 바디가 없기 때문에 작동하지 않는 메서드를 가진 불완전한 클래스이므로 직접 생성하지 못하도록 추상 클래스로 선언이 필요
- 추상 클래스 내 추상 메서드와 기존 메서드 둘 다 선언 가능
- 추상 메서드는 상속 받는 자식 클래스가 반드시 오버라이딩 해서 사용해야 함
- 그렇지 않을 경우 컴파일 오류 발생
- 오버라이딩 하지 않으면 자식도 추상 클래스가 되어야 함
- 기존 메서드와 완전히 같지만 메서드 바디가 없고, 자식 클래스가 해당 메서드를 반드시 오버라이딩 해야 한다는 제약이 추가됨
순수 추상 클래스
public abstract class AbstractExample {
public abstract void sound();
public abstract void move();
}
- 모든 메서드가 추상 메서드인 클래스
- 자식 클래스는 모든 메서드를 오버라이딩 해서 사용해야 함
- 실행 로직을 전혀 가지고 있지 않으며, 단지 다형성을 위한 부모 타입으로써 껍데기 역할만 제공
- 자바는 순수 추상 클래스를 더 편리하게 사용할 수 있는 인터페이스라는 기능을 제공
인터페이스
public interface class AbstractExample {
// public abstract void sound();
// public abstract void move();
void sound();
void move();
}
- class 대신 interface 키워드를 사용
- 인터페이스의 모든 메서드는 public, abstract
- public abstract 키워드 생략 가능
- 생략되어 있지만 abstract 이기 때문에 상속 받는 곳에서 모든 메서드를 오버라이딩 해서 사용해야 함
- 다중 구현(다중 상속)을 지원
인터페이스를 사용해야 하는 이유
- 제약 : 인터페이스를 구현하는 곳에서 인터페이스의 모든 메서드를 반드시 구현하라는 제약을 주는 것. 순수 추상클래스의 경우 누군가 그곳에 실행 가능한 메서드를 선언할 수 있으며, 이런 경우 추가된 기능을 자식 클래스에서 구현하지 않을 수도 있고, 또 더는 추상 클래스가 아니게 된다.
- 다중 구현 : 클래스 상속은 부모를 하나만 지정 가능하나 인터페이스의 경우 다중 구현(다중 상속)이 가능하다.
인터페이스 구현(상속)
public class AbstractExample implements AbstractExample {
@Override
void sound(){
...
}
@Override
void move(){
...
}
}
- 인터페이스를 상속 받을 때는 extends 대신에 implements 라는 구현 키워드를 사용
- 그래서 인터페이스는 상속 대신 구현이라고 칭함
인터페이스 다중 구현
다중 상속
- 다중 상속을 사용하게 되면 AirplaneCar 클래스에서 move()를 호출 시 어떤 부모의 move()를 사용해야 하는지 문제 발생(다이아몬드 문제)
- 또한, 클래스 계층 구조가 매우 복잡해질 수 있음
- 이러한 문제점 때문에 자바는 클래스의 다중 상속을 허용하지 않음
다중 구현
- 인터페이스는 구현하는 곳에서 해당 기능을 모두 구현해야 함
- Child 클래스에서 methodCommon() 호출 시 오버라이딩에 의해 어차피 Child에 있는 methodCommon()을 사용
- 결과적으로 두 부모 중 어떤 부모의 methodCommon()을 선택하는 것이 아닌 자신이 구현한 methodCommon()을 사용
- 이러한 이유로 인터페이스는 다이아몬드 문제가 발생하지 않음
메모리 구조
'Java > Basic' 카테고리의 다른 글
다형성과 메서드 오버라이딩 (0) | 2024.12.31 |
---|---|
instanceof (0) | 2024.12.31 |
다형성과 캐스팅 (0) | 2024.12.30 |
상속 (0) | 2024.12.12 |
static (1) | 2024.12.08 |