728x90
★ 형변환 (Type Casting)
- 값형과 참조형끼리는 형변환 불가능
1. 값형 형변환 (Value Type Casting)
- 값형끼리의 형변환
2. 참조형 형변환 (Reference Type Casting)
- 참조형끼리의 형변환
- 상속 관계에 있는 클래스끼리의 형변환 > 직계만 가능(방계는 불가능)
- A클래스 > B클래스
- 1. 업캐스팅(Up Casting)
- 암시적인 형변환
- 자식클래스 > 형변환 > 부모 클래스
- 2. 다운캐스팅(Down Casting)
- 명시적인 형변환
- 부모 클래스 > 형변환 > 자식클래스
- 100%불가능
- 코드의 유연성 부여 > 팁처럼 사용
- ex)
- 소스코드
Parent p1 = new Parent();
p1.a = 10;
p1.b = 20;
Child c1 = new Child();
c1.a = 10;
c1.b = 20;
c1.c = 30;
c1.d = 40;
Parent p2;
Child c2;
c2 = new Child(); //원본
//복사
//Parent = Child
//암시적 형변환
//부모클래스 = 자식클래스
//업캐스팅
p2 = c2; //생략
p2 = (Parent)c2;//원형
//복사 완료 > 제대로 복사 완료 검증? > 복사본의 멤버가 모두 올바르게 사용되는지 확인?
p2.a = 10;
p2.b = 20;
System.out.println(p2.a);
System.out.println(p2.b);
Parent p3;
Child c3;
p3 = new Parent(); //원본
//Child = Parent
//자식클래스 = 부모클래스
//다운 캐스팅
Parent p4;
Child c4;
c4 = new Child();
//업캐스팅(100%)
p4 = c4;
Child c5;
//자식 = 부모
//다운캐스팅(100% 불가능)
c5 = (Child)p4; //실제로는 child 객체를 다시 child 변수로 참조한 것 뿐
c5.a = 10;
c5.b = 20;
c5.c = 30;
c5.d = 40;
class Parent {
public int a;
public int b;
}
class Child extends Parent {
public int c;
public int d;
}
예제 1) 요구사항 : 대리점 운영 > 프린터 판매
- 1. HP600 * 5대, LG500 * 3대
- 2. 주기적으로 제품 점검
- 목적) 제품 점검 > 효율적!! > m1 //변경사항] 브랜드 증가 > BenQ, Asus, MS.. > m3
- 변경사항] 점검 기능 > print(), selfTest(), call()
- 변경사항] 재고 증가 HP600 > 500, LG500 > 300 > m2
- 소스코드
//형변환을 사용하지 않은 코딩 1
private static void m1() {
//Case 1.
//재고 확보
HP600 hp1 = new HP600("black", 2500000, "ink");
HP600 hp2 = new HP600("black", 2500000, "ink");
HP600 hp3 = new HP600("black", 2500000, "ink");
HP600 hp4 = new HP600("black", 2500000, "ink");
HP600 hp5 = new HP600("black", 2500000, "ink");
LG500 lg1 = new LG500("white", 3500000, "lazer");
LG500 lg2 = new LG500("white", 3500000, "lazer");
LG500 lg3 = new LG500("white", 3500000, "lazer");
//점검 x 반복
hp1.print();
hp2.print();
hp3.print();
hp4.print();
hp5.print();
lg1.print();
lg2.print();
lg3.print();
}
//형변환을 사용하지 않은 코딩 2
private static void m2() {
//Case 2.
//재고 확보
HP600 [] hps = new HP600[5];
for (int i=0; i<hps.length; i++) {
hps[i] = new HP600("black", 2500000, "ink");
}
LG500 [] lgs = new LG500[3];
for (int i=0; i<lgs.length; i++) {
lgs[i] = new LG500("whte", 3500000, "lazer");
}
//점검 > 브랜드 1개 > 루프 1개
for(int i=0; i<hps.length; i++) {
hps[i].print();
hps[i].selfTest();
}
for(int i=0; i<lgs.length; i++) {
lgs[i].print();
lgs[i].call();
}
}
//형변환을 사용한 코딩
private static void m3() {
//Case 3.
//형변환 사용
HP600 hp = new HP600("black", 2500000, "ink");
LG500 lg = new LG500("white", 3500000, "lazer");
Printer p1;
//부모 = 자식
//업캐스팅
p1 = hp;
//업캐스팅
Printer p2 = lg;
Printer[] list = new Printer[2];
list[0] = hp;
list[1] = lg;
//list > HP와 LG를 한번에 담은 배열
Printer[] ps = new Printer[8];
for (int i=0; i<ps.length; i++) {
if (i<5) {
ps[i] = new HP600("black", 250000, "ink");
}else {
ps[i] = new LG500("white", 350000, "lazer");
}
}
//************ instanceof : 앞에 있는 객체가 뒤에 있는 타입의 객체에 집어 넣을 수 있냐? 라고 검사
//점검
for(int i=0; i<ps.length; i++) {
ps[i].print(); //오버라이딩 됨.
//다운 캐스팅 > 평소에는 형제들과 같이 부모 배열에 넣어서 관리하다가.. 자식만이 가지고 있는 고유 기능을 사용해야 할 때 > 다운 캐스팅을 사용해서 원래 타입 참조 변수로 형변
if(ps[i] instanceof HP600) {
HP600 hp1 = (HP600)ps[i];
hp1.selfTest();
} else if(ps[i] instanceof LG500){
LG500 lg1 = (LG500)ps[i];
lg1.call();
}
//연산자
//System.out.println(ps[i] instanceof HP600); //instanceof : 앞에 있는 객체가 뒤에 있는 타입의 객체에 집어 넣을 수 있냐? 라고 검사
}
}
}//main class
//부모 클래스
class Printer {
private String color;
private int price;
private String type;
public Printer(String color, int price, String type) {
super();
this.color = color;
this.price = price;
this.type = type;
}
//바지 사장 > 인터페이스 > 통로 역할
public void print() {
}
}
//자식 클래스 1
class HP600 extends Printer {
// private String color;
// private int price;
// private String type;
public HP600(String color, int price, String type) {
super(color, price, type);
// this.color = color;
// this.price = price;
// this.type = type;
}
// @Override
// public String toString() {
// return "HP600 [color=" + color + ", price=" + price + ", type=" + type + "]";
// }
public void print() {
System.out.println("HP600으로 출력합니다.");
}
public void selfTest() {
System.out.println("HP600의 자가진단을 시작합니다.");
}
}
//자식클래스 2
class LG500 extends Printer {
// private String color;
// private int price;
// private String type;
public LG500(String color, int price, String type) {
super(color, price, type);
// this.color = color;
// this.price = price;
// this.type = type;
}
// @Override
// public String toString() {
// return "LG500 [color=" + color + ", price=" + price + ", type=" + type + "]";
// }
public void print() {
System.out.println("LG500으로 출력합니다.");
}
public void call() {
System.out.println("인공지능 AI와 연결합니다.");
}
}
예제 2) 요구사항 : 전자 제품 사용 > 배터리 필요
- 건전지를 사용한다.
- 듀라셀이든 네오든 중요하지 않고, 전자제품이 동작만 되면 되기 때문
- 추상화 > 행동의 단순함.
- 소스코드
public class Ex61_Casting {
public static void main(String[] args) {
//전자 제품 사용 > 배터리 필요
Duracell b1 = new Duracell();
setPower(b1); //업캐스팅
//시간이 흘러..
Neo b2 = new Neo();
setPower(b2); //업캐스팅
//건전지 자판기
Duracell b3 = getPower();
setPower(b3);
//사용자 입장
//- "건전지를 사용한다."
//- 듀라셀이든 네오든 중요하지 않음.. 전자제품이 동작만 되면 되기 때문에.. 건전지면 된다.
//추상화 > 행동의 단순함
Battery b4 = getPower(1); // 1.듀라셀 2.네오
setPower(b4);
}//main
private static Battery getPower(int sel) {
if(sel == 1) {
return new Duracell();
}else {
return new Neo();
}
}
private static Duracell getPower() {
Duracell b = new Duracell();
return b;
}
private static void setPower(Battery b1) {
System.out.println("전자 제품이 동작합니다.");
}
}//main class
//부모 클래스
class Battery {
public int price;
public int capacity;
}
//자식 클래스 1
class Duracell extends Battery {
public String color;
}
//자식 클래스 2
class Neo extends Battery {
public int weight;
}
728x90
'자바' 카테고리의 다른 글
JAVA STEP 31. abstract&Object&Generic (0) | 2023.02.22 |
---|---|
JAVA STEP 30. Interface (0) | 2023.02.21 |
JAVA STEP 28. 상속, Static 예제 (0) | 2023.02.20 |
JAVA STEP 27. Inheritance, Static (0) | 2023.02.20 |
JAVA STEP 26. 클래스&생성자 예제 (0) | 2023.02.17 |