티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
인터페이스의 다중 구현이다.
원래 자바는 다중 상속을 허용하지 않는다.
그렇다면 인터페이스는 어떻게 다중 구현을 허용할 수 있는 것일까?
이는 메모리관점에서 접근하면 쉽게 이해할 수 있다.
일단 자바에서는 상속을 받은 객체 생성 시 힙영역에 자식과, 연결된 모든 부모의 참조를 힙영역에 적재하게 된다.
하지만 과거에 배웠던 것 중, 오버라이딩된 메서드는 항상 실행 우선권을 가진다고 배웠었다.
이를 통해 인터페이스는 다중 구현을 허용할 수 있는 것이다.
조금 더 자세히 알아보자.
일단 인터페이스에는 기본적으로 기능을 가진 메서드를 구현할 수 없다.
이 인터페이스를 구현한 자식 Class에서는 반드시 메서드 오버라이딩을 진행해야 했기 때문이다.
따라서 객체 타입을 물고 힙영역에 진입하여 서치를 시작하지만, 오버라이딩 된 메서드를 우선적으로 실행하기 때문에 자식의 참조값을 따라간다.
(오버라이딩이 된 경우에만 힙 영역 서치 진행 시, 상위가 아닌 하위로 접근 허용 부모 -> 자식)
그렇기 때문에 다중 상속의 다이아몬드 문제에 봉착하지 않고, 개발자가 의도한 자식 오버라이드 메서드로 진입을 가능하게 한다.
추가적으로 이해를 돕기 위해, InterfaceA와 B에 모두 methodCommon()이라는 메서드가 선언되어 있으면, 이를 구현한 Child에서는 반드시 인터페이스의 메서드를 오버라이딩 해야 하기 때문에, methodCommon()이라는 메서드를 가져야만 하며 구현은 한 번만 하면 된다.
예시코드를 보자.
InterfaceA
public interface InterfaceA {
void methodA();
void methodcommon();
}
InterfaceB
public interface InterfaceB {
void methodB();
void methodcommon();
}
Child implemetns InterfaceA, InterfaceB
public class Child implements InterfaceA, InterfaceB{
@Override
public void methodA() {
System.out.println("Child.methodA");
}
@Override
public void methodB() {
System.out.println("Child.methodB");
}
@Override
public void methodcommon() {
System.out.println("Child.methodCommon");
}
}
Main Class
public class DiamodMain {
public static void main(String[] args) {
InterfaceA a = new Child();
a.methodA();
a.methodcommon();
InterfaceB b = new Child();
b.methodB();
b.methodcommon();
Child c = new Child();
c.methodcommon();
}
}
실행 결과
인터페이스에 대한 설명은 끝났다.
다만 메모리 관점에서 한 번만 더 설명해 보자.
InterfaceA 타입의 Child() 객체를 생성하였다.
객체의 인스턴스가 Child() 이기 때문에, Child, InterfaceA, InterfaceB의 참조가 모두 힙영역에 적재되었다.
a.methodA()를 통해 메서드를 호출하였지만, 원래 자바의 힙 영역 메모리 접근 시스템에 의하면 객체 타입이 Interface이기 때문에, 자식으로 갈 수가 없다.
하지만 Interface의 모든 메서드는 반드시 오버라이딩 되어야만 하고, 오버라이딩 된 경우에는 실행 우선권을 갖기 때문에 객체 타입이 interfaceA 여도 우선권을 가진 Child Class의 methodA가 정상적으로 참조되어 실행된 것을 볼 수 있다.
우리는 이제 자바의 상속과 인터페이스를 모두 학습하였다.
예제를 통해 간단히 확인해 보자.
추상 Class
public abstract class AbstractAnimal {
public abstract void sound();
public void move(){
System.out.println("동물이 이동합니다.");
}
}
인터페이스
public interface Fly {
void fly();
}
자식 Class + 추상 클래스
public class Dog extends AbstractAnimal{
@Override
public void sound() {
System.out.println("강아지 멍멍");
}
}
자식 Class + 추상 클래스 + 인터페이스
public class Bird extends AbstractAnimal implements Fly{ // 상속이 먼저 나와야함
@Override
public void sound() {
System.out.println("새 짹짹");
}
@Override
public void fly() {
System.out.println("새 날기");
}
}
자식 Class + 추상 클래스 + 인터페이스
public class Chicken extends AbstractAnimal implements Fly{
@Override
public void sound() {
System.out.println("닭 꼬끼오");
}
@Override
public void fly() {
System.out.println("닭 날기");
}
}
Main 클래스
public class SoundFlyMain {
public static void main(String[] args) {
Dog dog = new Dog();
Bird bird = new Bird();
Chicken chicken = new Chicken();
soundAnimal(dog);
soundAnimal(bird);
soundAnimal(chicken);
flyAnimal(bird);
flyAnimal(chicken);
}
// AbstractAnimal 사용 가능
private static void soundAnimal(AbstractAnimal animal){
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
//Fly 인터페이스가 있으면 사용 가능한 메서드
private static void flyAnimal(Fly fly){
System.out.println("날기 테스트 시작");
fly.fly();
System.out.println("날기 테스트 종료");
}
}
위 코드는 간단히, Fly 인터페이스, Abstract Animal 추상 클래스, 자식 Dog/Bird/Chicken 클래스가 있다.
상속과 구현을 동시에 받으려면 상속을 먼저 선언해주어야 한다.
public class Bird extends AbstractAnimal implements Fly
실행 결과
Dog 클래스는 Fly를 구현하지 않았기 때문에 fly 메서드에 접근할 수 없다.
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 최상위 Class Object (3) | 2025.02.11 |
---|---|
자바 OCP(Open - Closed Principle)원칙 (3) | 2025.02.11 |
자바 인터페이스(Interface) (0) | 2025.02.11 |
자바 추상 클래스 (Abstract Class) (0) | 2025.02.11 |
자바 다형성(Polymorphism) (2) | 2025.02.11 |
- Total
- Today
- Yesterday
- 상속
- static
- zixem
- 프로그래머스
- 김영한 실전 자바 기초
- 백준 피보나치
- webhacking.kr
- ys.k
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- samron3
- lord of sql
- Los
- spring
- 김영한
- extends
- los 15
- 상품을 구매한 회원 비율 구하기 파이썬
- 백준
- 스프링
- 김영한 실전 자바 기본
- 자바
- los 15단계
- java
- 프로그래머스 상품을 구매한 회원 비율 구하기
- samron
- 기술스택
- 백준 피보나치 수열
- 코딩테스트 준비
- 코딩테스트
- 김영한 실전 자바 중급
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |