Luver Duck 2022. 8. 10. 20:40

다형성 (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 : 인터페이스의 인스턴스 생성 (익명 클래스 활용) + 람다식