celina의 이것저것

[다형성] 객체지향의 꽃 본문

CS/JAVA

[다형성] 객체지향의 꽃

celinayk 2025. 4. 2. 12:20
반응형

다형성은 객체지향의 꽃이라고도 할 수 있다.

 

 

다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 것이다.

가장 쉬운 예시를 들자면, 부모 타입의 객체가 자식 인스턴스를 참조할 수 있는것이다!

 

 

다형성을 완성해주는 핵심 이론은 2가지이다.

1. 다형적 참조: 하나의 변수 타입으로 다양한 자식 인스턴스를 참조하는 것(부모 - 자식 예시)
2. 메서드 오버라이딩

 

1. 다형적 참조

 

이 예시이다. 

우선, 상속 관계에서 메모리가 어떻게 생성되는지 알아야한다.

부모클래스와 부모를 상속받은 자식클래스에서 자식인스턴스가 생성이 될때, 자식 인스턴스는 부모 인스턴스까지 모두 포함해서 생성이된다. 부모 클래스의 메서드만 상속받는게 아닌, 부모 자체가 같이 생성이된다. 자식안에 부모, 자식 두 개의 클래스가 생성되는 것!

 

 

 

Parent poly = new Child();
poly.parentMethod();

 

부모 타입의 poly 변수가 자식 인스턴스를 참조하는 다형적 참조의 경우이다.

생성된 참조값을 Parent 타입의 변수인 poly에 담는것이다.

 

 

그리고 중요한건

 

 

부모는 자식을 담을 수 있지만, 그 반대는 불가능이다.

지금 이렇게 되어 있는데

new Child()를 통해 생성된건 Child 타입이다. 

Parent poly는 부모 타입이다.

부모타입은 자식타입을 담을 수 있다. -> 그래서 Parent poly  = new Child() 가 가능하다.

하지만 자식은 부모를 담을 수 없다 -> Child child1 = new Parent()는 불가능! 

그리고 그림처럼  poly는 부모타입이라서 child인스턴스의 parent에 접근할 수 있고, child 인스턴스의 메서드에는 접근 할 수 없다! 왜냐하면 부모 입장에서는 누가 상속을 받았는지 알 필요도 없고, 모르기 때문이다. 

 

그래서 자식에게 접근 할 수 있도록 하기 위해 다운캐스팅의 개념이 등장한다.

 

 

원래 poly 변수는 Parent타입이다. 근데 poly를 Child타입으로 변경하면 자기의 Child인스턴스에 접근할 수 있다!

 

Child child = (Child) poly

 

이렇게 다운캐스팅을 한다. poly는 부모타입인데, 그걸 (Child)타입으로 캐스팅 한 후, Child 타입의 child변수에 할당!!

 

 

여기서 또 중요한게 나오는데 참조값이다.

자바는 항상 변수의 값을 복사해서 대입한다.

다시 말해, poly의 현재 참조값 x001을 꺼내고, 이 참조값(복사본임)을 Child타입의 child변수에 대입하는 것이다!

 

 

2. 메서드 오버라이딩

다형성과 오버라이딩이 함께하면 비로소 오버라이딩이 빛을 발한다.

가장 중요한건

 

오버라이딩 된 메서드가 가장 우선권을 가진다.

 

부모, 자식이 똑같은 메서드를 가지고 자식이 오버라이딩한 상황이면, 항상 오버라이딩 된 메서드가 우선이기에 자식 클래스의 메서드가 호출된다. 

'CS > JAVA' 카테고리의 다른 글

[String] String 과 StringBuilder의 차이점  (0) 2025.04.14
[다형성] 다형성->추상 클래스->인터페이스  (0) 2025.04.14
[상속]  (0) 2025.04.03
Comments