객체의 형 변환
: 모든 자료형은 형 변환할 수 있다. 객체도 형변환 할 수 있다.
하지만 모든 객체 사이에 형 변환이 가능한 것은 아니고 상속 관계에 있는 클래스 사이에만 형 변환이 가능하다.
클래스의 계층 구조에서 슈퍼클래스와 서브클래스 사이에 형 변환이 가능하다.
- 컴파일러가 자동으로 처리해 주는 확대 형벼환은 작은 크기의 자료가 보다 큰 크기의 자료형으로 바뀌는 것이다.
객체도 마찬가지 원칙이 적용된다. 좁은 범위의 객체가 넓은 범위의 객체로 형 변환될 수 있다.
- 부모 클래스와 자식 클래스 중 부모가 넓은 범위이다.
좁은 범위인 자식 클래스가 넓은 범위를 갖는 부모 클래스로 형 변환 될 수 있다.
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로 전달하고자 작성하였다. 이점을 유의하면서 보기.
생성자의 변수명은 객체마다 달라도 상관 없음.
'KH > JAVA' 카테고리의 다른 글
# 25 Interface (인터페이스) (0) | 2022.07.19 |
---|---|
# 24 Abstract Class (추상 클래스) (0) | 2022.07.19 |
# 22 메소드의 오버라이딩(Overriding) (0) | 2022.07.18 |
# 21 상속 (Inheritance) , final (0) | 2022.07.15 |
#20 this , Garbage Collection(쓰레기수집) , Inner Class(내부클래스) (0) | 2022.07.15 |