본문 바로가기

JAVA

JAVA 상속관계 자동 타입 변환과 다향성

 

 

 

기본 타입의 변환에 대해서는 java공부 초반부에 학습했을 것이다, 이번에는 기본 타입형 형변환이 아닌,

 

클래스 타입의 변환을 배워 보자 한다.

 

 

 

 

 

기본적으로 클래스 타입의 변환은 상속관계에 있는 클래스 사이에서만 발생한다.

 

부모클래스 타입으로 선언된 객체는 부모 클래스의 필드,메소드만 사용이 가능하다.

단 자식클래스가 부모클래스의 메소드를 오버로드(재정의) 하였다면 부모타입으로 선언된 객채라도 자식클래스에서 재정의 된 필드와 메소드를 사용할 수 있다.

그 외 오버로드 되지 않은 필드와 메소드는 사용이 불가능하다.

하지만 클래스관계의  자동타입 변환을 사용한다면 부모클래스 타입으로 선언된 객체도 부모클래스와 상속자인 자식클래스 둘 다 모두 사용 가능하다,

위와 같은 개념은 객체지향 프로그램이 추구하는 다향성과 매우 밀접하게 관련있다,

다향성은 동일한 타입을 사용하지만 다양한 결과가 나오는 성질을 의미하기 때문이다.

Car c1 = new Tire();
Hip 영역에 생성된 Tire(자식)객체 주소를 참조하지만 실제로 사용가능한 기능(필드,메소드)은 Car(부모)클래스이다.

 

 

 

 

 

허용범위 구조 

// Main 
부모클래스 변수 = new 자식클래스();
변수.부모클래스        필드 or 메소드 = 둘다가능
변수.(오버라이드된)자식클래스     오버라이드된 메소드만 가능 
변수.자식클래스        필드 or 메소드 = 둘다 불가능

 

 

실제 코드로 위 관계를 구현해보자.

 

 

 

 

 

 

 

부모 클래스

public class Car {
public int age = 24;
public void method1(){ System.out.println("메소드 1번입니다 age = "+age); }
public void method2(){ System.out.println("메소드 2번입니다"); }
}

자식 클래스

public class Tire extends Car{
public int CarAge = 240;
public void method1(){System.out.println("1번메소드 Ovrrding되었습니다." + CarAge);}
public void tireKorea(){ System.out.println("Tire 클래스에만 존재하는 메소드");}
}
    
  

Main 클래스

public class Main {
    public static void main(String[] args){
    
// 부모클래스 변수 = new 자식클래스();
        Car c1 = new Tire(); 
        
 // Car 메소드,필드
        c1.method2();  
        System.out.println(c1.age); 

//Tire 메소드,필드
        c1.tireKorea(); = 컴파일 오류  
        System.out.println(c1.CarAge); = 컴파일 오류 
       
// Tire 클래스에서 오버로드된 메소드
        c1.method1(); 
    }
}

 

 

 

 

오늘의 결론!

부모객체 타입으로 자식객체를 지정한다면 부모객체 필드 및 메소드, 자식객체 오버로드된 메소드 만을 사용 할 수 있지만

부모객체로 타입선언후 자식객체를 지정하였다면, 형변환을 할 수 있어 자식객체의 필드 및 메소드도 사용이 가능해진

클래스간의 형변환 선언방식은 기존에 배웠던 일반적인 자동타입변환 방식과 똑같다. 

Car c1 = new Tire();
Tire t1 = (Tire)c1; 
t1. 부모,자식 필드 메소드 모두 사용가능.

 

 

해피엔딩:)