Java 다형성 - 문법과 이해
객체지향의 프로그래밍의 대표되는 기술로 캡슐화, 상속, 다형성이 있다. 어떤 개발자에게는 다형성이 있어서 객체지향으로 프로그래밍을 한다고 한다.
그렇지만 사용하기 복잡하여 활용하는 것과 이해하기가 어렵다.
다형성에 대해서 알아보도록 하자.
다형성은 영문으로 Polymorphism 이름으로 "다양한 형태", "여러 형태" 뜻한다.
다형성 기능은 한 객체가 여러 타입의 객체로 취급할 수 있는 능력을 만든다. 보통 하나의 객체는 하나의 타입으로 고정되어있다. 그런데 다형성을 사용한 경우 하나의 객체가 다른 타입으로 사용될 수 있다.
자바의 다형성 전체를 알기 위해서는 필요한 사전 지식이 필요하다.
사전 지식
- 다형적 참조
- 메소드 오버라이딩
사전 지식은 다음 글에서 계속 이어나갈 것이다.
다형적 참조
객체를 생성 과정에서 변수를 만들고 객체 값을 참조하지만, 다형적 참조는 다양하게 참조한다.
상속 관계를 코드로 점진적으로 살펴보면서 다형성에 대해 알아보자.
아래 그림처럼 부모와 자식이 있는 각각의 클래스를 만들었다.

Parent To Parent
Parent 타입을 선언한 변수에게 Parent 클래스 인스턴스를 생성하고, 할당하는 코드부터 살펴보도록 한다. 주요 코드는 아래와 같다.
Parent parent;
parent = new Parent();
생성한 코드와 경로
src
└Poly
├Parent.java
├Child.java
└PolyMain.java
Parent.java
package poly;
public class Parent {
void parentMethod() {
System.out.println("This is Parent");
}
}
Child.java
package poly;
public class Child extends Parent{
void childMethod() {
System.out.println("This is Child");
}
}
PolyMain.java
package poly;
public class PolyMain {
public static void main(String[] args) {
// 부모 변수 생성
// 생성한 부모 변수 인스턴스 참조
System.out.println("== Parent To Parent ==");
Parent parent = new Parent();
parent.parentMethod();
System.out.println("======================");
System.out.println();
}
}
실행 결과
== Parent To Parent ==
This is Parent
======================
생성한 메모리 살펴보기
- 부모 타입의 변수가 부모 인스턴스를 참조한다.
- Parent 인스턴스를 생성.
부모 타입이 Parent 이므로 메모리에는 Parent 만 생성되어 있다. - 생성한 Parent 참조 값을 변수 parent 할당한다.
- 인스턴스 parent 변수에서 parentMethod() 호출 요청하였다.
Parent 클래스에 있는 parentMethod() 메소드를 호출하였다.

Child To Child
타입의 Child 변수 선언한 다음 Child 클래스 인스턴스를 생성하여 할당하였다.
Child child;
child = new Child();
이전 코드를 이어서 사용하고 PolyMain.java 코드만 변경하였다.
PolyMain.java
package poly;
public class PolyMain {
public static void main(String[] args) {
// 자식 변수 생성
// 생성한 자식 변수에게 인스턴스 참조
System.out.println("== Child To Child ==");
Child child = new Child();
child.childMethod();
child.parentMethod();
System.out.println("======================");
System.out.println();
}
}
실행결과
== Child To Child ==
This is Parent
This is Child
======================
생성한 메모리 살펴보기
- 자식 타입의 변수가 자식 인스턴스를 참조한다.
- Child 인스턴스를 생성.
자식 타입이 Child 이므로 메모리에는 Child, Parent 2개가 생성되어 있다. - 생성한 Child 참조 값을 변수 child 할당한다.
- 인스턴스 child 변수에서 childMethod() 호출 요청하였다.
child 클래스에 있는 chidldMethod() 메소드를 호출하였다. - 자식 타입인 child 변수에서 parentMethod() 호출 요청하였다.
child 클래스에서 parentMethod() 메소드가 없음. 부모 클래스 해당 메소드를 찾아 호출한다.

Parent To Child
여기부터 다형적 참조를 시작한다.
Parent parent;
parent = new Child();
호출부 코드 변경
PolyMain.java
package poly;
public class PolyMain {
public static void main(String[] args) {
// 자식 변수 생성
// 생성한 자식 변수에게 인스턴스 참조
System.out.println("== Parent To Child ==");
Parent parent = new Child();
parent.parentMethod();
System.out.println("======================");
System.out.println();
}
}
출력 결과
== Parent To Child ==
This is Parent
======================
생성한 메모리 살펴보기
- 부모 타입의 변수가 자식 인스턴스를 참조한다.
- Child 인스턴스를 생성.
자식 타입이 Child 이므로 메모리에는 Child, Parent 2개가 생성되어 있다. - 생성한 Child 참조 값을 변수 parent 할당한다.
- 인스턴스 parent 변수에서 parentMethod() 호출 요청하였다.
Parent 클래스에 있는 parentMethod() 메소드를 호출하였다.

부모 타입인 변수는 자식 인스턴스를 할당할 수 있다.
- 부모타입이 자식 타입을 담았다.
- Parent parent 부모 타입 변수이다. new Child() 생성된 결과는 Child 타입으로 parent 변수에 담았다.
Parent parent = new Child();
성공
- 반대로 자식 타입 변수는 부모 타입을 할당할 수 없다.
Child child = new Parent();
컴파일 오류 발생
다형적 참조
한가지 타입을 같은 변수에 할당하는 것은 문제가 없고, 아래 코드는 다형적 참조는 사용하지 않은 예시이다.
Parent parent = new Parent();
Child child = new Child();
이어서 다형적 참조는 아래 코드 예시이다.
Parent poly = new Parent();
Parent poly = new Child();
Parent poly = new Junior();
// Child 의 자식 클래스
Parent 타입의 변수는 Parent 뿐 아니라 Child 필요하다면, Child를 상속한 Junior 타입도 담을 수 있어서 다양한 형태로 참조하는 것이다. 이것을 다형적 참조라 한다.
다형적 참조의 한계
앞 서 말한 코드에서 Parent 타입 변수를 Child 자식의 childMethod() 메소드 호출하면 어떻게 될까?

- childMethod() 실행하면 참조값을 이용해 x0001 값인 인스턴스를 찾는다.
- 인스턴스는 Child 클래스로 만들었으므로 인스턴스 내부에는 Child과 Parent 과 있다. 호출자인 변수가 Parent 이므로 실행할 타입으로 Parent 바로 선택한다.
- Parent 클래스에는 childMethod 메소드가 없다. 상속 관계를 보았더니 Parent 클래스는 상속한 클래스가 없다. 이로 인해 결국 컴파일 오류가 발생한다.
- [참고] 부모클래스에서 실행할 메소드가 없는 경우, 자식클래스에게 찾지 않는다.
만약 childMethod() 호출하고 싶다면 캐스팅을 기능을 이용해야 한다.
다형적 참조 핵심
다형적 참조 핵심은 부모는 자식을 담을 수 있다는 것이다.
그런데 이것이 왜 필요하지 의문점이 있다.
미래의 나에게 다형성이 무엇이냐고 화났을텐데, 진정하고
앞서 말한 설명은 기초적인 문법과 이해로 끊어 놓은 것이다. 다형성에 대해서는 다른 글에서 추가로 읽어주어야 한다.