개발 서적 기록/오브젝트_조영호

30일차 - 다형성의 종류

밍 끄적 2023. 9. 10. 23:03
728x90

2023.09.10 SUN

390p ~ 402p

 

29일차 내용 ⬇️

2023.09.08 - [개발 서적 기록/오브젝트_조영호] - 29일차 - 믹스인을 통해서 상속 대체하기

 

29일차 - 믹스인을 통해서 상속 대체하기

2023.09.08 FRI 376p ~ 392p 28일차 내용 ⬇️ 2023.09.07 - [개발 서적 기록/오브젝트_조영호] - 27, 28일차 - 합성을 통해 상속의 한계 해결하기 27, 28일차 - 합성을 통해 상속의 한계 해결하기 2023.09.07 THU 346p ~

magenta-ming.tistory.com


상속을 코드를 재사용하기 위해서 사용하면, 변경하기 어렵고 유연하지 않고 결합도가 높은 코드를 작성하기 좋다.

상속은 타입 계층을 구조화하기 위해서 사용해야한다. 왜냐하면 다형성을 제공하기 때문이다.

 

다형성

여러 타입을 대상으로 동작할 수 있는 코드는 다형성을 갖춘 코드다.

하나의 추상 인터페이스에 대해 코드를 작성하고, 이 추상 인터페이스에 대해 서로 다른 구현을 연결할 수 있는 능력이다.

 

이런 다형성은 구체적으로 오버로딩 다형성 / 강제 다형성 / 매개변수 다형성 / 포함 다형성 으로 나눌 수 있다.

 

오버로딩 다형성

오버로딩 다형성은 하나의 클래스에 안에 동일한 이름의 메서드가 존재하는 경우다.

 

강제 다형성

강제 다형성은 언어가 지원하는 자동적인 타입 변환 혹은 사용자가 직접 구현한 타입 변환을 이용해서, 동일한 연산자를 다양한 타입에 사용할 수 있는 방식이다.

 

ex ) + 연산자

+ 연산자는 정수끼리 연산할 경우, 정수를 합하도록 처리한다.

하지만 정수와 문자열끼리 연산할 경우, 정수와 문자열을 잇는 연결 연산자로 동작해, 정수 타입의 피연산자를 문자열 타입으로 강제 형 변환 시킨다.

 

매개변수 다형성

매개변수 다형성은 클래스의 인스턴스변수 혹은 메서드의 매개변수 타입을 임의의 타입으로 선언한 후에, 사용하는 시점에 구체적인 타입으로 지정하는 형식이다.

다양한 타입(의 요소)을 다루기 위해 동일한 오퍼레이션을 사용할 수 있다.

 

제네릭은 매개변수 다형성을 보여준다.

ex ) java.util.List 인터페이스

컬렉션 내 요소의 타입을 제네릭인 임의의 값 T로 지정하고, 실제 인스턴스를 생성할 때에 T를 구체적인 타입으로 지정한다.

 

포함 다형성 / 서브타입 다형성

포함 다형성은 메시지가 동일하더라도, 수신한 객체의 타입에 따라 실제 수행되는 행동이 달라지는 경우다.

어떤 타입 T를 필요로하는 상황의 경우 타입 T를 가지는 객체 뿐만 아니라 서브타입(SubType)을 가지고있는 객체도 대신해서 사용할 수 있다.

 

우리가 클래스를 상속관계로 연결하고 자식 클래스에서 부모 클래스의 메서드를 오버라이딩 한 후 클라이언트는 부모클래스만 참조한다면 쉽게 포함다형성을 구현할 수 있다.

 

ex ) 예제

다른 클래스에서 객체를 생성한 것 같아 보인다.

하지만, 객체가 메세지를 수신할때 메세지를 처리할 적절한 메서드를 상속계층에서도 찾아서 실행하기 때문에 다형성이 보장되어 정상 처리된다.

class T { ... }

class Tcase1 extends T { ... }

class Tcase2 extends T { ... }

Class Main(){
	public static void main(String[] args) {
		T ex1 = new T();
		Tcase1 ex2 = new Tcase1();
		Tcase2 ex3 = new Tcase2();
		
		func(ex1);  //오류안남
		func(ex2);  //오류안남
		func(ex3);  //오류안남
	}

	public func(T param){
		...
	}
}​
728x90