본문 바로가기
Java

[Java] 상속 관계의 다형성과 참조형 형 변환

by 스응 2023. 2. 9.
728x90
728x90

#  관련 포스팅

  - 상속 : https://young0105.tistory.com/42

 


다형성 (Polymorphism)

  - 하나의 코드 형태가 다양한 자료형으로 구현되어 실행될 수 있음

    (자료형을 다양한 형태로 바라볼 수 있음)

    → 같은 코드에서 여러 실행 결과가 나타남

  - 하나의 타입에 여러 객체를 대입할 수 있게 하여, 다양한 형태로 동작하게 함

      → 부모 타입으로 자식 객체를 참조할 수 있게 함

           or 같은 인터페이스를 구현하는 여러 객체를 같은 타입으로 참조할 수 있게 함

  - 객체지향 프로그래밍의 큰 특징 중 하나

  - [장점]

      i. 유연성

      ii. 확장성

          : 새로운 하위 클래스를 추가하더라도, 기존의 코드를 변경하지 않고 사용할 수 있음

      iii. 재사용성 및 유지보수성

          : 한 가지 타입의 변수/메서드를 사용하여 다양한 객체와 상호 작용할 수 있음

      iv. 추상화

          : 어떤 클래스가 어떻게 구현되었는지보다, 무엇을 하는지에 더 집중할 수 있게 함

              → 코드의 가독성 및 이해도 향상

#  상속 관계에서의 다형성

  - 자식 클래스는 부모 클래스를 확장한 형태임

      → '자식 클래스'는 '부모 클래스'라고 할 수 있음  ex) '호랑이'는 '동물'이다

           (반대로 '부모 클래스'는 '자식 클래스'라고 할 수 없음)

      → 자식 클래스는 자신의 클래스로도 볼 수 있고, 부모 클래스로도 볼 수 있음

  - 메서드 선언 시 매개변수로 부모 클래스를 기입한 경우, 자식 클래스도 매개변수로 입력될 수 있음

 

// 인스턴스화 : 메모리에 로드하는 것

부모클래스 참조변수 = new 자식클래스();

// 메서드 선언 시 매개변수에 부모 클래스를 입력
public void 메서드명(부모클래스 매개변수) {
    // 매개변수 자리에 자식 클래스 객체가 들어가도 정상 작동
    코드; 
    // this를 사용하면 매개변수에 들어온 자식 클래스 객체를 가리킴
}

 

  - 다형성을 사용하더라도 실제 기능은 초기화된 객체(자식 클래스)의 메서드를 우선적으로 따름

    (존재하지 않는다면 부모 클래스의 메서드로)

  - 부모 클래스에서는 공통적인 부분을 제공하고, 자식 클래스에서는 각 클래스에 맞는 기능 구현
  - 여러 클래스를 하나의 상위 클래스로 다룰 수 있음

 

 


배열에서의 다형성 활용

  - 같은 부모 클래스를 가진, 연관된 자료형들을 배열에 모아서 관리할 수 있음

 

// 예시 //

Animal animalH = new Human();
Animal animalT = new Tiger();

// Animal을 부모 클래스로 갖는 자식 클래스 객체들을 배열에 할당 가능
Animal[] arrayAnimal = new Animal[10];
arrayAnimal[0] = animalH;  
arrayAnimal[1] = animalT;

 

 


참조형 형 변환 (Reference Type Casting)

  - 상속 관계에서, 부모 클래스와 자식 클래스 간의 형 변환

#  업 캐스팅

부모클래스 참조변수 = new 자식클래스();
// ex) Fruit fruit1 = new Banana();

 

  - 부모 클래스 타입으로 변수를 선언하고, 자식 클래스의 생성자로 인스턴스를 생성함

  - 해당 참조변수는 자식 클래스의 멤버변수에 접근할 수 없음

      : 컴파일 시점에는 컴파일러가 앞에 선언된 타입(부모 클래스)만 확인하기 때문임

        → 다운 캐스팅 필요

 

#  다운 캐스팅

((자식클래스) 참조변수).멤버변수  // ex) ((Banana) fruit1).origin

 

  - 부모 클래스의 참조를 자식 클래스의 참조로 변환하는 과정

  - 업 캐스팅된 참조변수에 대해, 지금은 '자식 클래스'로 사용하겠다고 컴파일러에게 명시함

  - 자식 클래스에 정의된 메서드나 멤버변수를 사용하기 위해 수행됨

  - 강제 형 변환과 유사함 : https://young0105.tistory.com/9

 

 

320x100
반응형

'Java' 카테고리의 다른 글

[Java] final 키워드  (0) 2023.02.11
[Java] 문자열 자료형 (String)  (0) 2023.02.10
[Java] 상속 관계와 메서드 오버라이드  (0) 2023.02.09
[Java] 배열  (0) 2023.02.09
[Java] static 키워드  (0) 2023.02.09

댓글