Programming Language/Java

다형성(Polymorphism) - 다형성, 형변환, instanceof, 객체배열, 매개변수, 바인딩

Ma_Sand 2022. 3. 5. 13:57
반응형

1. 다형성(Polymorphism)

  : 상속을 이용한 기술로, 부모 클래스로부터 상속 받은 자식 클래스 타입의 객체를 부모 클래스 타입으로

    형변환하여 한번에 다룰 수 있는 기술이다.

 

 (1) 예시

   ① 부모 타입의 참조(레퍼런스)변수로 부모 객체를 다루는 경우

Parent p = new Parent();
p.printP();
p.printParent();
// 부모 객체(Parent())에만 접근 가능하다.

 

   ② 자식 타입의 참조(레퍼런스)변수로 자식 객체를 다루는 경우

Child1 c1 = new Child();
c1.printP();
c1.printParent();
c1.printChild1();
// 자식 객체(Child())와 부모 객체(Parent())에 접근 가능하다.

 

   ③ 부모 타입의 참조(레퍼런스)변수로 자식 객체를 다루는 경우

Parent p2 = new Child1(); // 부모클래스 Parent가 자식클래스 Child1보다 상위 클래스라서 자동 형변환되었다.
p2.printP();
p2.printParent();

// 자식 객체에 있는 메소드는 접근할 수 없음
p2.printChild1();
// 그럼 자식 타입으로 강제 형변환하여 접근할 수 있게 하면 된다.
((Child1)p2).printChild1();

 

 

 (2) 다형성을 사용하는 이유

   : 부모 클래스 타입으로 자식 객체들을 담을 수 있어서 관리가 수월해진다.

 

 

 

2. 클래스 간의 형변환

 (1) 업 캐스팅(Up Casting)

   ① 자동 형변환

   ② 자식 타입에서 부모 타입으로 형변환

       → 상위 타입으로의 형변환이므로 생략이 가능하다.

Parent p = (Parent) new Child();  // (Parent)는 생략 가능

 

 (2) 다운 캐스팅(Down Casting)

   ① 강제 형변환

   ② 부모 타입에서 자식 타입으로 형변환

       → 하위 타입으로의 형변환이므로 생략이 불가하고 반드시 자식 타입을 명시해야 한다.

Parent p = new Child();  // 자동 형변환(업 캐스팅)
((Child)p).Child();  // 자식 메소드를 부모 클래스로 가져와야 하므로 강제 형변환(다운 캐스팅)을 한다.

 

 ☞ 클래스 간의 형변환은 무조건 상속 관계에 있는 클래스끼리만 가능하다.

 

 

 

3. instanceof 연산자

  : 현재 참조(레퍼런스)변수가 어떤 타입을 참조하는지 확인할 때 사용한다.

    결과값이 논리값(true / false)으로 나온다.

 

 (1) 표현법

클래스타입 instanceof 클래스타입

Parent instanceof Child
// 부모 클래스가 자식 클래스를 참조한다.

 

 

 (2) 예시

if(p instanceof Child1) {  // p에 들어있는 객체가 Child1 객체면 true, 아니면 false
    ((Child)p).ch1();
} else if(p instanceof Child2) {  // p에 들어있는 객체가 Child2 객체면 true, 아니면 false
    ((Child)p).ch2();
}

 

 

 

4. 객체배열

  : 다형성을 통해 상속 관계에 있는 부모 클래스 배열 공간에 여러 자식 클래스 객체를 저장할 수 있다.

 

Fruit[] arr = new Fruit[5];

arr[0] = new banana();
arr[1] = new strawberry();
arr[2] = new apple();
arr[3] = new pineapple();
arr[4] = new orange();

 

 

 

5. 매개변수

  : 다형성을 통해 메소드 호출 시 부모 타입의 변수 하나만 사용하여 자식 타입의 객체를 받을 수 있다.

 

public void run() {
    manyFruit(new banana());
    manyFruit(new apple());
    manyFruit(new kiwi());
    manyFruit(new orange());
}
public void manyFruit(Fruit f) {}

 

 

 

6. 바인딩

  : 실행할 메소드 코드와 호출하는 코드를 연결시키는 것을 바인딩이라 하며, 프로그램이 실행되기 전에

    컴파일되면서 모든 메소드는 정적 바인딩이 된다.

 

 ● 동적 바인딩

    : 컴파일할 때 정적 바인딩이 된 메소드를 실행할 그때의 객체 타입을 기준으로 바인딩되는 것을 말한다.

   ▷ 성립 요건

     : 상속 관계에서 다형성이 적용된 경우에 메소드가 오버라이딩 되어 있으면 정적 바인딩된 메소드 코드보다

       오버라이딩이 된 메소드 코드를 먼저 실행한다.

반응형