티스토리 뷰
▶자바의 다중상속 그리고 모호성(ambiguity)에 대하여
이번 글에서는 다중상속 그리고 이것과 관련된 모호성에 대해 알아보려고 합니다.
🔎 다중 상속
다중 상속이란 여러 부모 클래스를 상속받는 것을 의미합니다.
하지만 자바에서는 모호성(amibiguity) 때문에 다중 상속을 지원하지 않는데요.
❓ 모호성(ambiguity)
모호성이란 하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다며,
어떤 부모의 필드인지 알 수가 없습니다. 이를 모호성이라고 합니다.
두 부모에 동일한 이름과 동일한 매개변수를 가진 메소드가 있을 때 자식 클래스는 어떤 클래스의 메소드인지를 알 수가 없습니다. 이게 바로 모호성을 의미하는데요.
그런데 JDK8 버전 이후부터는 인터페이스에 defualt 메소드를 서언할 수 있습니다.
이말은 즉, 인터페이스에는 상수와 추상 메소드만 선언할 수 있다고 한 점에 대하여
무조건 오버라이딩하여 사용해야만 했던 추상 메소드(abstract)만 선언할 수 있는 것이 아니라
abstract가 아닌 default 메소드를 선언하여 클래스에 implements 하는 것입니다.
그렇다면 여러 개를 지정할 수 있는 인터페이스 특성상 다중 상속을 지원하는 것이나 다름이 없는 것이 되었는데요.
→ 다중상속을 인터페이스에서 default 메소드를 선언하여 사용하자
📌 모호성이 발생하는 경우
1️⃣ 두 개의 인터페이스 내에 이름과 매개변수가 똑같은 메소드가 선언되어 있다.
package ambiguity;
public interface InterA {
default void printName() {
System.out.println("InterA");
}
}
public interface InterB {
default void printName() {
System.out.println("InterB");
}
}
이때 한 클래스에 InterA, InterB 인터페이스를 동시에 implements 하는 경우를 살펴봅시다.
public class ClassC implements InterA, InterB {
}
우선 이렇게 작성하는 순간부터 클래스 이름에 빨간줄이 뜨면서 에러 메세지를 확인할 수 있는데요.
아래처럼 printName 중복된다고 알려주고 있습니다.
해결 방법은 아예 자식 클래스에서 다시 오버라이딩 하여 사용하는 방법인데요.
즉, 자식 클래스에서 누구의 super를 사용하는지 명시해주면 됩니다.
아래처럼 InterA의 printName을 사용하고 싶은 것이라면 InterA의 super를 사용하여 참조하는 부모를 가리켜주는 것입니다.
public class ClassC implements InterA, InterB {
@Override
public void printName() {
InterA.super.printName();
}
}
2️⃣ 부모 클래스의 public 메소드와 인터페이스의 default 메소드의 이름과 매개변수가 똑같이 선언되어 있다.
package ambiguiy;
public class ClassA {
public void printName() {
System.out.println("ClassA");
}
}
public interface InterA {
public default void printName() {
System.out.println("InterA");
}
}
위 코드처럼 이번에는 클래스와 인터페이스에 이름과 매개변수가 같은 메소드가 선언되었을 때 이 둘을 동시에 상속받는 클래스를 살펴보려고 합니다.
public class ClassB extends ClassA implements InterA {
public static void main(String[] args) {
new ClassB.printName();
}
}
실행을 해보면 오류없이 ClassA의 메소드가 실행되었습니다.
그 이유는 부모 클래스가 우선이기 때문인데요.
따라서 이 경우에는 부모 클래스의 메소드를 사용하게 되면 문제 없이 실행되게 됩니다.
'백엔드 > Java' 카테고리의 다른 글
[Java] Try-Catch문 - 예외 처리/커스텀 예외/예외던지기 (0) | 2023.02.09 |
---|---|
[Java] 자바의 함수형 인터페이스(Functional Interface) - 추상 메소드가 오직 한 개인 인터페이스 (0) | 2023.02.05 |
[Java] 마커 인터페이스(Marker Interface)에 대해 알아보자 (0) | 2023.02.03 |
[Java] 자바 어댑터(Adapter) 패턴 (0) | 2023.02.03 |
[Java] 내부 클래스(Inner Class) & 익명 클래스(Anonymous Class) (0) | 2023.02.02 |
- Total
- Today
- Yesterday
- 파이썬
- 스타일 컴포넌트 styled-components
- 자바스크립트
- Python
- TypeScript
- 리액트 훅
- 머신러닝
- 프론트엔드 기초
- react-query
- testing
- styled-components
- jest
- HTML
- 프로젝트 회고
- 데이터분석
- rtl
- JSP
- 타입스크립트
- frontend
- 리액트
- next.js
- 프론트엔드 공부
- 딥러닝
- 자바스크립트 기초
- CSS
- 자바
- 인프런
- 프론트엔드
- react
- 디프만
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |