도찐개찐

[JAVA] 클래스 형변환 본문

JAVA

[JAVA] 클래스 형변환

도개진 2022. 7. 7. 10:32

클래스 형변환(Casting)

서로 상속관계에 있는 타입간의 형변환만 가능하다.
자손 타입에서 조상타입으로 형변환하는 경우, 형변환 생략가능

자손타입 → 부모타입 (Up-casting) : 형변환 생략가능
자손타입 ← 부모타입 (Down-casting) : 형변환 생략불가

우선 아래 내용과 같이 클래스 상속 관계를 정의 합니다.

'Car' 라는 부모객체를 상속받고 있는 'FireEngine', 'Ambulance' 객체 형태를 작성해 봤습니다.

class Car {
	String color;
	int door;
	
	void drive() { // 운전
		System.out.println("drive, brooo~");
	}
	
	void stop() { // 멈춤
		System.out.println("stop!!!");
	}
}

class FireEngine extends Car { // 소방차
	void water() { // 물
		System.out.println("water shot!!!");
	}
}

class Ambulance extends Car {
	void siren() {
		System.out.println("biyong~~~");
	}
}

 

1. 묵시적(암묵적) 형변환

더 큰 그릇(부모 클래스)에 작은 그릇(자식 클래스)의 값을 담는 것을 말합니다.

작은 그릇에서 큰 그릇으로 옮기는 것으로 컴파일러는 에러를 발생시키지 않고 형을 바꿔 줍니다. 

class MainClass {
	public static void main(String[] args) {
             // 묵시적 형변환 케이스
             // 자손 > 부모 형 변환 up-casting
             // 담는 그릇은 부모 클래스, 참조 인스턴스는 자식 클래스
             Car c = new FireEngine();
             Car c2 = new Ambulance();	

             // 에러 발생 케이스
             // 부모형으로 선언되어 자식 클래스를 인스턴스 한 경우 자식클래스의 메소드 및 지역변수 사용은 컴파일러 에러가 발생 됩니다.
             //c.warter(); // error msg : The method warter() is undefined for the type Car
             //c2.siren(); // error msg : The method siren() is undefined for the type Car			
	}
}

위 소스에서 알수 있듯이 자식 클래스인 FireEngine, Ambulance 클래스를 부모클래스로 인스턴스 시킴으로써 묵시적 형변환이 발생 되는 것을 알 수 있습니다.

  • 부모형태로 선언 된 변수에 자식 클래스를 인스턴스 하게 되면 자식 클래스에 선언된 메소드 및 지역변수는 사용이 불가능 합니다. 

2. 명시적 형변환

반대로 큰그릇(부모 클래스)에서 작은 그릇(자식 클래스)으로 옮기는 담는 것을 말합니다.

큰 그릇의 값에 따라서 실행시 오류가 발생할수 있습니다. 따라서 컴파일러는 컴파일 시 오류를 발생시키고 명시적으로 형변환을 요구합니다

class MainClass {
	public static void main(String[] args) {
             // 묵시적 형변환 케이스
             // 자손 > 부모 형 변환 up-casting
             // 담는 그릇은 부모 클래스, 참조 인스턴스는 자식 클래스
             Car c = new FireEngine();
             Car c2 = new Ambulance();	

             // 에러 발생 케이스
             // 부모형으로 선언되어 자식 클래스를 인스턴스 한 경우 자식클래스의 메소드 및 지역변수 사용은 컴파일러 에러가 발생 됩니다.
             //c.warter(); // error msg : The method warter() is undefined for the type Car
             //c2.siren(); // error msg : The method siren() is undefined for the type Car
			
            // 명시적 형변환 케이스
            FireEngine f = (FireEngine)c;
            //FireEngine f2 = (FireEngine)c2; // 에러발생 Ambulance > Car(O) > FireEngine(X)
            f.water();
            //f2.water();
	}
}
  • 부모형태로 선언 된 변수가 다른 자식클래스로 down-casting은 불가능 합니다.
down-casting 가능 : FireEngine f = (FireEngine)c;
down-casting 불가 : FireEngine f2 = (FireEngine)c2;
class MainClass {
	public static void main(String[] args) {
		FireEngine fireEngine = new FireEngine();
		fireEngine.water();
		fireEngine.drive(); // 묵시적 형변환
		
		// 명시적 형변환
		Car car = (Car)fireEngine; // 자식클래스를 참조한 변수를 형변환 가능
		Car car2 = (Car)new Ambulance(); // 자식클래스를 참조함과 동시에 부모형으로 형변환 가능
		car.drive();
		
		// 자식형으로 선언된 변수에 부모클래스를 형변환하여 담는것은 에러 발생
		FireEngine fireEngine2 = (FireEngine)new Car(); 
	}
}

위 내용을 보면 이미 선언 된 자식형의 변수를  형변환하는 것이 가능 하며 선언과 동시에 형변환 하는 것도 가능 합니다.

부모클래스를 선언함과 동시에 자식형으로 변환하는 것은 불가능 합니다.

728x90

'JAVA' 카테고리의 다른 글

[JAVA] 다형성(polymorphism)  (0) 2022.07.07
[JAVA] instanceof  (0) 2022.07.07
[JAVA] 상속(Inheritance)  (0) 2022.07.06
[JAVA] 초기화 블럭(initialization block)  (0) 2022.07.06
[JAVA] 클래스변수, 인스턴스변수, 지역변수  (0) 2022.07.06
Comments