Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

luke

[자바/Java] - 다형성(1)(다운캐스팅, 업캐스팅) 본문

Study/Java

[자바/Java] - 다형성(1)(다운캐스팅, 업캐스팅)

luke-king 2024. 1. 14. 14:50

다형성

다형성을 이해하기 위해서는 크게 2가지 핵심 이론을 알아야 한다.

  • 다형적 참조
  • 메서드 오버라이딩

먼저 다형적 참조를 알아 보겠다.

다형적 참조: 부모클래스는 자식클래스를 품을 수 있다.

바로 코드로 확인해 보자

 

<부모 클래스>

public class Parent {

 public void parentMethod() {
     System.out.println("Parent.parentMethod");
   }
}

 

 

<자식 클래스>

public class Child extends Parent {

 public void childMethod() {
      System.out.println("Child.childMethod");
    }
}

 

<Main 클래스>

public class PolyMain {

 public static void main(String[] args) {
     //부모 변수가 부모 인스턴스 참조
     System.out.println("Parent -> Parent");
     Parent parent = new Parent();
     parent.parentMethod();
     
     //자식 변수가 자식 인스턴스 참조
     System.out.println("Child -> Child");
     Child child = new Child();
     child.parentMethod();
     child.childMethod();
     
     //부모 변수가 자식 인스턴스 참조(다형적 참조)
     System.out.println("Parent -> Child");
     Parent poly = new Child();
     poly.parentMethod();
     
     //Child child1 = new Parent(); 자식은 부모를 담을 수 없다.
     
     //자식의 기능은 호출할 수 없다. 컴파일 오류 발생
     //poly.childMethod();
 }
}

 

 

<실행 결과>

Parent -> Parent
Parent.parentMethod

Child -> Child
Parent.parentMethod
Child.childMethod

Parent -> Child
Parent.parentMethod

 

 

메인 클래스 코드를 해석해 보겠다.

 

부모 타입의 변수가 부모 인스턴스 참조

- 부모 타입의 변수가 부모 인스턴스를 참조..

- Parent parent = new Parent()

- Parent 인스턴스를 만들었다. 이 경우 부모 타입인 Parent를 생성했기 댸문에 메모리 상에 Parent만 생성 된다.

- 생성된 참조값을 Parent 타입의 변수인 parent에 담아둔다.

- parent.parentMethod()를 호출하면 인스턴스의 Parent 클래스에 있는 parentMethod()가 호출된다.

 

자식 타입의 변수가 자식 인스턴스 참조

- 자식 타입의 변수가 자식 인스턴스를 참조.

- Child child = new Child()

- Child 인스턴스를 만들었다. 이 경우 자식 타입인 Child를 생성했기 때문에 메모리 상에 Child와 Parent가 모두 생성 된다.

- 생성된 참조값을 Child 타입의 변수인 child에 담아둔다.

- child.childMethod()를 호출하면 인스턴스의 Child 클래스에 있는 childMethod()가 호출된다.

 

이제 부터가 중요하다!!!

 

부모 타입의 변수가 자식 인스턴스 참조 (다형적 참조)

- 부모 타입의 변수가 자식 인스턴스를 참조한다.

- Parent poly = new Child()

- Child 인스턴스를 만들었다. 이 경우 자식 타입인 " Child "를 생성했기 때문에 메모리 상에 " Child "와 " Parent "가 모두 생성 된다.

- 생성된 참조값을 " Parent " 타입의 변수인 " poly "에 담아둔다.

 

다음으로 캐스팅 까지 정리해 보겠다.

 

다운캐스팅, 업캐스팅

다운캐스팅

위 부모 클래스와 자식 클래스를 사용해 "다운캐스팅" 먼저 알아 보겠다.

코드를 먼저 살펴 보자.

 

<다운캐스팅 코드>

public class CastingMain {
 public static void main(String[] args) {
     //부모 변수가 자식 인스턴스 참조(다형적 참조)
     Parent poly = new Child();
     //단 자식의 기능은 호출할 수 없다. 컴파일 오류 발생
     //poly.childMethod();
     
     //다운캐스팅(부모 타입 -> 자식 타입)
     Child child = (Child) poly;
     child.childMethod();
   }
}

 

 

Child child = poly;

이 코드는 다음과 같이 자식은 부모를 담을 수 없다.

부모 타입을 사용하는 변수를 자식 타입에 대입하려고 하면 컴파일 오류가 발생한다.

이때는 다운캐스팅 기능을 사용해서 부모 타입을 잠깐 자식 타입으로 변경하면 된다.

 

Child child = (Child) poly;

(타입)처럼 괄호와 그 사이에 타입을 지정하면 참조 대상을 특정 타입으로 변경할 수 있다. 이렇게 특정 타입으로 변경 하는 것을 캐스팅이라 한다.

이렇게 다운캐스팅을 사용한 덕분에 child.childMethod()를 호출할 수 있게 되었다.

 

 

업캐스팅

다운캐스팅과 반대로 현재 타입을 부모 타입으로 변경하는 것을 업캐스팅이라 한다.

바로 코드를 보겠다.

 

<업캐스팅 코드>

public class CastingMain3 {
 public static void main(String[] args) {
     Child child = new Child();
     Parent parent1 = (Parent) child; //업캐스팅은 생략 가능, 생략 권장
     Parent parent2 = child; //업캐스팅 생략

     parent1.parentMethod();
     parent2.parentMethod();
   }
}

 

<실행 결과>

Parent.parentMethod
Parent.parentMethod

 

업캐스팅은 다운캐스팅과 다르게 생략할 수 있다.

 

 

 

 

 

※ 출처: Inflearn 김영한-Java 강의 중