Programming/JAVA

형변환(메모)

gyu0 2020. 6. 16. 01:23

형변환

-일단은 업캐스팅시 형변환 생략.

-다운캐스팅시 형변환 입력해주어야함.

//이거 외우면 일단 반 먹고 들어간거야.

 

참조변수와 참조변수가 가리키고 있는 인스턴스랑은 전혀 다른 개념이라는 거 명심해둘것.

가리키는 인스턴스가 같아도 참조형 변수타입이 조상클래스타입이면 자손클래스 멤버들을 못쓰고

참조형 변수 타입이 자손클래스이며 가리키는것도 자손클래스이면 그 멤버들을 다 쓸 수 있다.

 

참조형변수에 인스턴스 생성시 참조형 변수가 인스턴스와 비교했을 때 쓸 수 있는 것 보다 같거나 적어야한다.

우리는 무작정 그냥 형태만 외우고 객체생성만 해온거다

ex) 주석 확인

public class test {
	public static void main(String[] args) {
		test2 t2 = new test2();
		t2.test21();
		//test3 t3 = new test2(); << 이게안된다는거

	}
}
class test3 extends test2{
	String test31() {
		return "say";
	}
}
class test2{
	String test21(){
    	return "hi";
    }
}
public class castingtest1 {
	public static void main(String[] args) {
		car c=null;
		fireEngine fe=new fireEngine();
		fe.water();
		c=fe;//
		c.drive();
		//c.water();
		//업캐스팅 fe는 자손 클래스 c는 조상클래스
		//c.water(); 근데 이거는 car타입의 참조변수로는 호출할 수 없어
		//왜냐면 fe안에 c가 있는거고 fe는 c로 형변환을 했으니 갯수도 당연히 c의 멤버개수로 줄었을거.
		//참조변수 형이 달라서 인스턴스를 가리키는 건 똑같은데 참조변수 형때문에 못쓰는중이야
		
		fireEngine fe2=new fireEngine();
		fe2=(fireEngine) c;
		fe2.water();//다운캐스팅이니까 쓸 수 었어.
		fe2.drive();
		fe2.stop();
	}
}

class car{
	String color;
	int door;
	
	void drive() {
		System.out.println("drive, brrrrrr...");
	}
	void stop() {
		System.out.println("stop!");
	}
}
final class fireEngine extends car{
	void water() {
		System.out.println("water!");
	}
}

 

읽는다고 열장짜리 읽었는데 마지막 문장이 요약을 끝냈다.

전에 배운거처럼 조상타입의 인스턴스를 자손타입의 참조변수로 참조하는 것은 허용되지 않는다.

서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.

그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.

ㄴ이건 다음에서 instanceof 연산자 배운다는 걸 암시한다.

 

업캐스팅이랑 다운캐스팅은 별로 내용은 없어서 나만 알아볼 수 있게 메모형식으로 적었다.