[Java] 자바 #24, 업캐스팅과 다운캐스팅(Casting)
- 프로그래밍 언어/Java
- 2019. 2. 21. 20:42
1. 상속
2. 추상클래스 메소드
3. 메소드 오버라이드
4. final 키워드
5. 형변환 <--> 가장중요.
형변환, Type 참조형 형변환
값형 <-> 참조형
1. 값형 형변환
- 숫자형끼리만 가능
- 큰형 -> 작은형 (명시적)
- 작은형-> 큰형 (암시적)
- 개발자 편의성 or 코드 유연성
2. 참조형변환
- 클래스끼리 가능
- 상속관계가 있는 클래스끼리만 가능(**********)
-> 부모클래스 = 자식클래스 -> UpCasting -100% 구현
- >자식클래스 = 부모클래스 -> DownCasting -상황에 따라.
CastParent p1;
CastChild c1;
c1 = new CastChild();
부모클래스 = 자식클래스
100% 안전.
p1=c1; //암시적 .형변환 작은놈 -> 큰놈.
복사의 성공 유무 : 멤버 확인
System.out.println(p1.a);
System.out.println(p1.b);
p1.ttt();
c1.ttt();
CastParent p2;
CastChild c2;
p2 = new CastParent();
- 명시적 형변환
- 자식클래스 = 부모클래스
- 100% 불가능
c2 = (CastChild) p2;
확인
System.out.println(c2.a);
System.out.println(c2.b);
System.out.println(c2.d);
System.out.println(c2.c);
CastParent p3;
CastChild c3;
c3 = new CastChild();
p3=c3; //안전.
CastChild c4;
자식 = 부모 (명시적) -> 이건안됨
c4 = (CastChild)p3;
System.out.println(c3.a);
System.out.println(c3.b);
System.out.println(c3.c);
System.out.println(c3.d);
class CastParent {
public int a;
public int b;
public void ttt() {
System.out.println("부모");
}
}
class CastChild extends CastParent {
public int c;
public int d;
public void ttt() {
System.out.println("자식");
}
}
상황 1. 대리점운영 2. 전자제품 > 프린터 판매 3. LG300(재고 5대), HP400(재고3대) 프린터 제품 파는 가게임.
운영 방침] ***** 1. 한달에 한번 > 모든 제품이 정상 동작중인지 점검.테스트. > 출력기능
상황 변경] 1. 프린터 재고가 증가. -> LG300(100대), HP400(50대) 2. 브랜드 증가 -> Dell500, 2.
BenQ500... 등 10여종 더 도입. 3. 각 프린터의 고유기능도 같이 점검.
예제)
//회사나 모델에 상관없이 모든 프린터 기기가 가져야할 공통사항을 정의한 클래스
abstract class Printer {
// 구현 멤버 - 회사나 모델에 상관없이 모든 프린터 기기가 가져야할 공통기능(변수 , 메소드)
public String model;
public int price;
public int ink;// 잉크량
public void info() {
System.out.printf("모델명 : %s, 잉크량 : %dml, rkrur : %d원\n", this.model, this.price, this.ink);
}
// 추상 멤버 - 회사나 모델에 상관없이 모든 프린터 기기가 가져야할 공통적인 제품 사용법(행동)
// - 구현은 제품마다 각각 알아서 구현.
public abstract void print(); // 추상메소드라서 내부구현 박스 제거
}
//진짜 제품을 만들기 위한 일반클래스 구현.
class LG300 extends Printer {
// 모든 프린터 기기가 가지고 있는 공통기능 + 독자적 기능 구현.
@Override
public void print() {
// 출력 + LG만의 독자적인 기술
System.out.println("LG200으로 잉크젯을 사용해서 출력합니다.");
}
// LG300만이 가지는 특화된 기능
public void call() {
System.out.println("상담원과 연결중입니다.");
}
}
class HP400 extends Printer {
// 모든 프린터 기기가 가지고 있는 공통기능 + 독자적 기능 구현.
@Override
public void print() {
// 출력 + HP만의 독자적인 기술
System.out.println("HP400으로 레이저를 사용해서 출력합니다.");
}
// HP400에서만 볼수 있는 특별한 기능.
public void selfTest() {
System.out.println("자가진단을 시작합니다.");
}
}
- 배열,참조형 형변환.(업캐스팅) > (다운캐스팅)
업캐스팅을 하는 이유 : 비슷한 형태의 클래스 객체들을 한곳에 모아서 관리하기.
// 단, 같은 부모로부터 파생된 클래스들에 한해서...
// 다운캐스팅을 하는 이유 : 업캐스팅을 통한 하나의 집합에 여러 타입의 객체를 관리하는 건 편하다.> 각자의 고유기능에 접근하기엔 불가능 > 그때만 잠시 다운캐스팅. > 고유기능 사용.
LG300 lg = new LG300();
Printer p; //추상클래스;
부모 = 자식 (업캐스팅) 암시적, 100%안전.
p=lg;
HP400 hp = new HP400();
Printer p2;
p2=hp;
Printer[] ps = new Printer[2];
ps[0]=new LG300();
ps[1]= new HP400();
Printer[] ps = new Printer[8];
for (int i = 0; i < ps.length; i++) {
if (i < 5) {
ps[i] = new LG300();
} else {
ps[i] = new HP400();
}
}
점검시간.
for (int i = 0; i < ps.length; i++) {
ps[i].print();
//서로다른 클래스를 한곳에 모아놨을때 공통기능 사용은 편리! 하지만 고유의 기능을 사용할때는 불편하다.
//ps[i].call(); 안됨
//ps[i].selfTest(); 안됨
//LG300 lg = (LG300)ps[i];
//현재 객체가 특정클래스 타입으로 형변환이 가능한지 알아보는 연산자.
if(ps[i] instanceof LG300) {
LG300 lg = (LG300)ps[i];
lg.call();
}else if( ps[i] instanceof HP400) {
HP400 hp = (HP400)ps[i];
hp.selfTest();
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 자바 #26, 열거형(Enumeration, enum) (0) | 2019.02.24 |
---|---|
[Java] 자바 #25, 인터페이스(Interface) (1) | 2019.02.23 |
[Java]자바 #23 final 키워드(클래스, 메소드) (0) | 2019.02.20 |
[Java] 자바 #22, 추상클래스(Abstract), 오버라이딩(Overriding) (0) | 2019.02.19 |
[Java] 자바 #21, 상속(Inheritance) (0) | 2019.02.17 |