KH/JAVA

# 23 객체의 형변환(Convert) 과 이를 이용한상속 예시들

오늘의 진 2022. 7. 18. 14:59

객체의 형 변환

 

: 모든 자료형은 형 변환할 수 있다. 객체도 형변환 할 수 있다.

하지만 모든 객체 사이에 형 변환이 가능한 것은 아니고 상속 관계에 있는 클래스 사이에만 형 변환이 가능하다.

클래스의 계층 구조에서 슈퍼클래스와 서브클래스 사이에 형 변환이 가능하다.

 

- 컴파일러가 자동으로 처리해 주는 확대 형벼환은 작은 크기의 자료가 보다 큰 크기의 자료형으로 바뀌는 것이다.

객체도 마찬가지 원칙이 적용된다. 좁은 범위의 객체가 넓은 범위의 객체로 형 변환될 수 있다.

 

- 부모 클래스와 자식 클래스 중 부모가 넓은 범위이다.

좁은 범위인 자식 클래스가 넓은 범위를 갖는 부모 클래스로 형 변환 될 수 있다.

super obj = new sup( ) ;     >> 확대 형변환 (자동형변환)
sub obj2 = new super( ) ;   >> 축소 형변환 (명시적으로 적어주어야한다. )

 

 

 

 

 


 

 

 

(예시)

class Con_11 {
	int a = 33;

	void display() {
		System.out.println("Con_11 메소드 display()~~~");
	}

}

class Con_22 extends Con_11 {
	int b = 77;
}

class Con_33 extends Con_11 {
	int a = 45;
	int c = 99;

	void display() {
		System.out.println("Con_33 메소드 display()####");
	}

	void show() {
		System.out.println("Con_33 메소드 show()^^^^");
	}
}

public class Convert_1 {

	public static void main(String[] args) {

		Con_11 obj_1 = new Con_33(); // 확대형변환
		Con_11 obj_2 = new Con_22();

		Con_33 objj33 = (Con_33) obj_1; // 축소 형변환
		Con_22 objj22 = (Con_22) obj_2; // 축소 형변환 , 축소형변환은 명시적으로 형식을적어주어야함

		obj_2.display();
		System.out.println("Con_22 a,b : " + objj22.a + ", " + objj22.b);

		obj_1.display();
		System.out.println("Con_33 a,c : " + objj33.a + ", " + objj33.c);

	}

}
Con_11 메소드 display()~~~
Con_22 a,b : 33, 77
Con_33 메소드 display()####
Con_33 a,c : 45, 99

 

 

 

 

(예제) - 상속에서의 변수들

public class SuperTest_1 {
	public static void main(String[] args) {

		Child obj_1 = new Child();

		obj_1.message();

	}

}

class Parent {
	int x = 888;
	int xx = 0;

}

class Child extends Parent {
	int xx = 3456;

	void message() {
		System.out.println("x = " + x);
		System.out.println("this.x = "+this.x);
		System.out.println("xx = "+xx);
		System.out.println("this.xx = " + this.xx);
		System.out.println("super.x = " + super.x);
	}
}

 this. 이 붙으면 자기자신의 class의 변수가 호출된다 하지만 없는경우 슈퍼클래스의 객체를 찾아감. super.은 부모 객체의 것을 호출하는 것.

똑같은 변수 xx 가 부모 , 서브에 존재한다면 서브에서 호출하면 서브의 것이 우선적으로 호출된다. 

 

 

 

(예제) - 상속에서의 생성자 타입

class AA_5 {
	String str;
	boolean bbb;
	char sex = ' ';

	public AA_5(String str, boolean bbb , char sex) {
		this.str = str;
		this.bbb = bbb;
		this.sex = sex;

		System.out.println("AA_5 생성자 호출 ~~ :" + str + "boolean : " + bbb);
	}
}

class BB_5 extends AA_5 {
	public BB_5(String aa, boolean bbb , char sex) {
		super(aa, bbb , sex);
		System.out.println("BB_5 생성자 호출 $$$ :" + str + "boolean : " + bbb);
	}
}

class CC_5 extends BB_5 {



	public CC_5(String kbs, boolean bbb, char sex) {
		super(kbs, bbb ,sex);
		System.out.println("CC_5 생성자 호출 @@@ :" + kbs + "boolean : " + bbb);
	}

}

public class SuperTest_2 {

	public static void main(String[] args) {

		CC_5 obj_1 = new CC_5("즐거운 화요일", true, 'm');
		System.out.println(obj_1.str);
		System.out.println(obj_1.bbb);
		System.out.println(obj_1.sex);

	}

}
AA_5 생성자 호출 ~~ :즐거운 화요일boolean : true
BB_5 생성자 호출 $$$ :즐거운 화요일boolean : true
CC_5 생성자 호출 @@@ :즐거운 화요일boolean : true
즐거운 화요일
true
m
⇉ 객체는 super class 에서부터 sub class의 순서로 호출된다. 

sex는 CC_5의 객체인 obj_1에 입력하여 AA로 전달하고자 작성하였다. 이점을 유의하면서 보기.

생성자의 변수명은 객체마다 달라도 상관 없음.