[Java] 자바 #24, 업캐스팅과 다운캐스팅(Casting)

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();

}

}












댓글

Designed by JB FACTORY