day13 - 0810
다형성 (Polymorphism)
다형성
- 여러가지 타입을 한가지 타입으로 처리할 수 있는 기술 (한 타입의 참조변수로 여러 타입의 인스턴스를 참조)
- 상위클래스 타입의 참조변수로 하위클래스의 인스턴스를 참조할 수 있다
- 상속 관계인 여러 하위클래스들을 묶어 하나의 상위클래스 타입의 참조변수로 관리할 수 있다
정적 객체 생성
- 자신 클래스와 동일한 타입의 인스턴스를 생성하는 것
동적 객체 생성
- 자신 클래스의 상위 클래스 타입의 인스턴스를 생성하는 것
** 하위 클래스 타입의 인스턴스를 상위 클래스 타입으로 형 변환(casting)하는 것을 업 캐스팅(up-casting)이라 한다
다형성의 조건
1) 상속 관계
2) 메소드 오버라이딩 - 상위 클래스의 메소드를 하위 클래스에서 재정의
day13_oop.poly1 : 다형성(Polymorphism)
day13_oop.poly2 : 다형성 예제 - Phone 클래스의 상속을 받은 하위 클래스에서 각각의 오버라이딩 된 메소드 출력
다중 상속
Java에서 다중상속을 금지하는 이유 - 모호성
다이아몬드 문제(Diamond Problem)
슈퍼 클래스가 superMethod()라는 메소드에 대해 A 클래스와 B 클래스 각각은 superMethod()를 상속받는다
만약 다중상속을 허용하여 클래스 C가 클래스 A와 클래스 B를 동시에 상속받는다면
어떤 상위 클래스의 superMethod()를 상속받아야 하는가? (모호성)
** 다중 상속을 구현할 수 있는 방법 : 인터페이스 이용
인터페이스(Interface)
- 오직 상수(public static final)와 추상 메소드만 가지고 있는 추상 클래스
- 슈퍼 클래스와의 모호성을 없애기 위해 필드와 생성자를 제거
- 추상 메소드 작성시 public abstract를 자동생성하므로 따로 입력할 필요가 없다
- 인터페이스의 상속은 인터페이스를 구현한다라는 의미의 키워드 implements로 구현한다
- 인터페이스의 상속을 받는 클래스에서는 메소드 오버라이딩(재정의)를 해야 한다
인터페이스 상속의 예시
- Singer 인터페이스 (직업)
public class Singer {
void sing(); // 추상 메소드
}
- Magician 인터페이스 (직업)
public interface Magician {
void show(); // 추상 메소드
}
- Person 클래스 (인터페이스인 Singer와 Magician의 상속을 받는 클래스)
public class Person implements Singer, Magician {
@Override
public void sing() {
System.out.println("죽을만큼 보고싶다~");
}
@Override
public void show() {
System.out.println("나와라 비둘기~");
}
}
day13_oop.multi1 : Java의 클래스 다중상속 금지와 인터페이스를 이용한 다중상속 구현
day13_oop.multi2 : 인터페이스 예제
중첩 클래스(Nested class)
내부 클래스(Inner class)
- 클래스 내부에 선언된 클래스
- 내부 클래스에서 외부 클래스의 멤버에 쉽게 접근할 수 있다
- 코드의 복잡성을 줄일 수 있다 (캡슐화)
내부 클래스의 종류
1) 인스턴스 클래스(instance class)
- 외부 클래스의 멤버변수 선언 위치에 선언
- 외부 클래스의 인스턴스 멤버처럼 다뤄진다
2) 스태틱 클래스(static class)
- 외부 클래스의 멤버변수 선언 위치에 선언
- 외부 클래스의 static 멤버처럼 다뤄진다 (특히 클래스 메소드(static 메소드)에서 사용)
3) 지역 클래스(local class)
- 외부 클래스의 메소드나 초기화블럭 안에 선언
- 선언된 영역 내부에서만 사용 가능
4) 익명 클래스(anonymous class)
- 클래스 선언과 동시에 인스턴스를 생성하는 이름없는 클래스
- 인스턴스를 생성하면서 즉석에서 클래스를 구성하여 특정 메소드를 재정의
- 1회용 상속 효과
** 추상 클래스는 원래 인스턴스 생성이 불가능하지만
익명 클래스로서 메소드 오버라이딩만 해주면 인스턴스 생성이 가능하다
** 인터페이스 또한 인스턴스 생성이 불가능하지만
익명 클래스로서 메소드 오버라이딩만 해주면 인스턴스 생성이 가능하다
중첩 클래스의 종류
1) 일반 중첩 클래스 : 내부 클래스가 인스턴스 클래스인 경우
2) 스태틱 중첩 클래스 : 내부 클래스가 스태틱 클래스인 경우
3) 지역 중첩 클래스 : 내부 클래스가 지역 클래스인 경우
4) 익명 중첩 클래스 : 내부 클래스가 익명 클래스인 경우
day13_oop.inner1 : 중첩 클래스(nested class)와 내부 클래스(inner class)
day13_oop.inner2 : 익명 클래스
day13_oop.inner3 : 추상 클래스의 인스턴스 생성 (익명 클래스 활용)
day13_oop.inner4 : 인터페이스의 인스턴스 생성 (익명 클래스 활용) + 람다식