새소식

Java

[Java] 업캐스팅과 다운캐스팅

  • -

 

캐스팅 (Casting)

 '어떤 배우를 캐스팅했다'라는 말에도 쓰이는 캐스팅은 영어 단어로 '배역 선정'이다. 말의 뜻과 비슷하게 자바에서도 캐스팅은 타입 변환을 의미한다. 특정 타입의 객체 또는 변수가 다른 타입으로 바뀌는 것인데, 인스턴스(클래스 객체)에도 업캐스팅, 다운캐스팅이라는 총 두 가지 방법을 이용할 수 있다. 이 캐스팅 작업을 통해 메소드에서 객체를 사용할 때 특정 클래스로 보편화하여 그 클래스의 메소드를 사용하는 등 코드 일반화를 할 수 있다. 이 부분은 추후에 제네릭 클래스와 메소드에서 다룰 예정이다.

 

업캐스팅 (Upcasting)

 자바에서 서브 클래스(자식 클래스)는 슈퍼 클래스(부모 클래스)로부터 모든 멤버와 메소드를 상속받는다. 따라서 부모 클래스로 변환해도 아무런 문제가 없다. 오히려 업캐스팅을 하면 슈퍼 클래스의 멤버와 메소드 밖에 못 쓰게 되기 때문에 더 불편해지는 것처럼 느껴질 수 있다.

// laptopInfo 와 Macbook Class 선언

class laptopInfo {
	private float price;
	private int published_year;
	
	laptopInfo(float price, int published_year) {
		this.price = price;
		this.published_year = published_year;
	}
	
	int getPublished_year() {
		return published_year;
	}
}

class Macbook extends laptopInfo {
	private String company = "Apple"; 
	Macbook (float price, int published_year) {
		super(price, published_year);
	}
}

 

 업캐스팅의 예제를 위해 노트북의 정보를 저장하는 클래스인 laptopInfo 와 그걸 상속 받는 서브 클래스인 Macbook 을 선언해두었다. 생성자로 private 변수를 초기화하고 String 멤버를 제작해두는 등 약간의 차별점을 두었다.

 업캐스팅은 간단하다. 슈퍼 클래스의 레퍼런스에 서브 클래스를 대입해주면 된다. 이러면 업캐스팅한 레퍼런스로는 서브 클래스의 필드나 메소드에는 접근할 수 없게 되며 슈퍼 클래스의 필드와 메소드에만 접근 가능하다.

// 업케스팅 예제 main

public class ExUpDownCasting {
	public static void main(String[] args) {
    
		Macbook Macbook4th = new Macbook((float)15.4, 2011);
		laptopInfo Info4th = (laptopInfo)Macbook4th; // 명시적 형변환
		Info4th = Macbook4th; // 명시적 형변환을 하지 않아도 됨
		System.out.println(Info4th.getPublished_year());
		//System.out.println(Info4th.company); // 서브 클래스 필드에 접근 불가
	}
}

 

laptopInfo 의 인스턴스인 Info4th 에 Macbook 의 인스턴스인 Macbook4th 가 대입됐다. 슈퍼 클래스에 서브 클래스가 들어가는 업캐스팅이 이루어진 것이다. 이때 서브 클래스가 슈퍼 클래스가 되는 것은 당연히 가능하므로 명시적 형변환을 해주지 않아도 된다.

 

다운캐스팅 (Downcasting)

 다운캐스팅은 업캐스팅된 레퍼런스를 다시 원래 타입의 레퍼런스로 변환하는 것이다. 다운캐스팅 후에는 서브 클래스의 필드와 메소드를 모두 사용할 수 있다.

public class ExUpDownCasting {
	public static void main(String[] args) {
		
		Macbook Macbook4th = new Macbook((float)15.4, 2011);
		laptopInfo Info4th = Macbook4th; // 업캐스팅
		System.out.println(Info4th.getPublished_year());
		Macbook Macbook5th = (Macbook)Info4th; // 새로운 Macbook 레퍼런스로 다운캐스팅
		System.out.println(Macbook5th.company); // 서브 클래스에 접근 가능
		System.out.println(Macbook4th.hashCode() == Macbook5th.hashCode()); 
		// 다운캐스팅된 객체와 원본 객체의 주솟값이 같은가? : true
		
	}
}

 

 본 코드문에서는 다운캐스팅을 새로운 Macbook 타입의 레퍼런스에 적용해보았다. 그리고 원본 레퍼런스의 해쉬코드와 비교해보았더니 true가 나왔다. 즉, 같은 주솟값을 가지고 있다는 의미이다. 

코드의 업캐스팅과 다운캐스팅 과정

 

업캐스팅과 다운캐스팅의 실전 사용 예

 이러한 캐스팅 작업은 조직 내 직급 변환이 이루어질 때 사용할 수 있다. 예를 들어 일반 직원인 A가 팀장으로 직책이 변경됐을 경우 Company - Employee - Normal_employee 에서 Company - Employee - Teamheader 로 바뀌는 과정으로 볼 수 있다. 이때 Employee 로 업캐스팅 후 정보를 새로운 Teamheader 에 넣어준다면 기존의 정보를 가지고 새로운 직책을 부여할 수 있게 될 것이다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.