Developer/JAVA

JAVA , 클래스의 다형성, 타입 캐스팅(형변환) , 종단 클래스

단님 2024. 8. 7. 23:25
728x90
상속 클래스의 구성
  • 할아버지 : Animal
  • 아버지 : Mammal
  • 나 : Pet

우리가 일반적으로 사용할때 타입과 생성을 동일하게 사용했었다.

Mammal ma1 = new Mammal(); //순수 Mammal 타입
Pet pe1 = new Pet(); //순수 pet 타입

 

 

다형성 법칙
1. 후손은 조상의 타입이 될 수 있다 = 상속관계는 같은 타입이 될 수 있다.
2. 조상은 후손의 타입이 될 수 없다.

타입 변수 = 생성 기본생성자 ;
Animal a0 = new Animal(); → Animal 에 정의된것 만큼 접근 가능
Animal a1 = new Pet(); → Animal 에 정의된것 만큼 접근 가능

 

타입으로 정의된 만큼 멤버들에게 접근이 가능함을 알 수 있다.

정의된 멤버는 코드의 우측 만큼 접근이 된다.

즉 , 쉽게 말해 aninal 에 정의된 변수를 사용할 수 있는데 그 변수를 사용하면 생성한 인스턴스의 변수로 사용하게 된다.

 

자바의 다형성이란 왼쪽의 타입이 그대로 이기 때문에 우측의 대입이 다양해질 수있다는 것이다.

 

  • 비교구문
Mammal ma1 = new Mammal(); //순수 Mammal 타입
Animal a2 = new Mammal();

a2 와 ma1은 접근 가능 멤버의 범위가 다르다.

 

하위의 타입으로 상위의 인스턴스를 담는것이 불가하다.

하위의 멤버들이 상위의 인스턴스에 없는 멤버들을 사용하게 된다면 그 자체가 불가지 않을까 ?

Mammal ma1 = new Mammal(); 
Animal a2 = new Mammal();
Mammal ma1 = a2;

컴파일 오류가 발생하게 된다 . ma2가 아빠타입이고 a2는 할아버지 타입이기 때문에 , 타입 미스매치가 뜨게 된다.

 

하지만 생성은 똑같이 아빠인스턴스으로 생성하였다.

이 부분을 타입캐스팅을 통해 대입이 가능하다.

Mammal ma1 = new Mammal(); //순수 Mammal 타입
Animal a2 = new Mammal();
ma1 = (Mammal)a2;

 

mammal로 인스턴스로 만들어 놓은것을 animal의 타입은 mammal 타입으로 변경가능하다.

 

인스턴스의 계보와 클래스가 맞아야 형변환이 가능한데 , 다른인스턴스로 만들어 놓은것은 런타임시 오류가 발생한다.

Mammal ma1 = new Mammal(); //순수 Mammal 타입
Animal a0 = new Animal();
ma1 = (Mammal)a0; // 런타임 오류

즉 , 같은 계보의 인스턴스 참조는 형변환이 가능한 것을 볼 수 있다.

 

단 , 형제관계에서는 되지 않고 상위 하위로의 개념으로만 가능하다.

 


종단 클래스 (=단종 클래스)
Final의 적용

 

1. 클래스에 Final 을 적용할 경우 상속이 불가능하다.

(대표적인 클래스로는 String 클래스가 있다.)

 

2. 메서드에 Final을 적용할 경우 오버라이딩이 불가능 하다.

조상이 Final 메서드를 적용할 경우 후손에 오버라이딩이 된 메서드들이 오류가 나는 것을 볼 수 있다.