코딩항해기

[JAVA] Up casting, Down casting 본문

JAVA

[JAVA] Up casting, Down casting

miniBcake 2024. 7. 4. 13:55

 

Up casting

상속 관계인 자식의 값을 부모 타입으로 형변환 (자동형변환)

부모 클래스에 있는 변수나 메소드만 사용할 수 있다.

ex) 부모타입 a = new 자식생성자();

 

Down casting

업캐스팅된 객체를 다시 자식 타입으로 형변환 (강제형변환)

자식 클래스에만 있는 변수나 메소드를 사용할 수 있다.

ex) 부모타입 a = new 자식생성자();

자식타입 b = (자식타입) a;

 


 

 

Casting

하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변환 혹은 형변환(캐스팅)이라고 한다.

 

(원시타입, 문자열 형변환은 이전 발행글 참조)

 

[JAVA] 자동형변환, 강제형변환, 문자열(String)형변환

Java에는 데이터 타입을 바꾸는 형변환(casting)이 있다. 오늘은 그 중 세 가지 형변환에 대해 정리해보겠다. 첫째는 별 다른 조치 없이 자동으로 변환되는 자동형변환, 둘째는 특수한 조치를 취

minibcake.tistory.com

 

클래스 자료형 간의 형변환의 경우에는 상속관계에 있는 클래스끼리만 캐스팅이 가능하고,

이를 업캐스팅 Up casting, 다운캐스팅 Down casting이라고 한다.

형제 관계의 클래스의 경우는 아예 타입이 다르므로 형변환이 되지 않는다.

 

 

 

Up casting

업캐스팅은 자식의 값을 부모타입으로 형변환하는 것이다.

상위의 타입으로 변경되는 것이기 때문에 자동형변환이 일어나게 된다.

부모타입의 변수 = 자식타입의 객체;
부모타입의 변수 = new 자식생성자();

 

대신 부모 타입으로 변경되었기 때문에 부모로부터 상속받은 필드와 메소드만 사용할 수 있다.

오버라이딩을 진행한 경우, 오버라이딩 된 메소드로 사용가능하다.

자식 클래스에만 선언되어있는 필드나, 메소드는 업캐스팅하게 되면 사용할 수 없다.

 

 

Down casting

다운캐스팅은 업캐스팅된 객체를 다시 자식타입으로 형변환시키는 것이다.

부모 객체를 자식 타입으로 형변환시키는 것이 아니며, 형제 타입으로 변경하는 것도 불가하다. (형제는 아예 다른 타입)하위로 타입을 변환하는 것이기 때문에 강제형변환을 시켜줘야한다. (앞에 타입명시)

부모타입 변수a = new 자식생성자();   //업캐스팅
자식타입 변수b = (자식타입) 변수a;    //다운캐스팅

 

 

+) instanceof

자식 클래스 타입의 객체는 부모 클래스 타입도 동시에 갖는다. (업캐스팅 상태일 때도 동일함)

instanceof를 이용하면 객체가 어떤 클래스 타입을 가지고 있는지 알 수 있다.

객체 instanceof 클래스명

 

[객체 instanceof 클래스명]은 boolean 타입의 값을 반환하며, 객체가 뒤에 오는 클래스 타입을 가지고 있다면 true를 반환한다.

 


 

사용하는 이유

부모타입인 하나의 저장공간에 여러 자식 타입의 참조값을 업캐스팅하여 저장할 수 있다. (참조변수의 다형성)

만약 하나의 기능을 하는 메소드를 만들 때 매개변수로 여러 자식 타입을 받아야한다고 가정하면,

자식끼리는 타입이 다르기 때문에 메소드를 타입별로 각각 만들어야하는 번거로움이 생기게 된다.

업캐스팅을 활용하면 부모타입의 매개변수를 가진 하나의 메소드만 만들면 된다.

(가장 자주 쓰이는 방식이 Object(모든 클래스의 최상위 클래스)타입으로 업캐스팅해 값을 받는 방식이다.)

 

주의사항

업캐스팅하여 자식 참조값을 저장했더라도, 오버라이딩하였다면 자식 클래스에서 오버라이딩한 기능으로 실행된다.

업캐스팅으로 자식 참조값을 저장했다면 자식 클래스에 새로 선언한 필드, 기능들은 사용할 수 없다.

이 경우 down casting을 통해서 다시 사용할 수 있다.

 

'JAVA' 카테고리의 다른 글

[JAVA] 자바 프로그래밍의 기초  (0) 2024.07.12
[JAVA] 다형성  (0) 2024.07.07
[JAVA] 자바의 Call by Value, Call by Reference  (0) 2024.07.03
[JAVA] 메소드 / 메서드  (0) 2024.07.03
[JAVA] 추상클래스, 추상메소드  (0) 2024.07.03