자바

JAVA STEP 29. CASTING

2023. 2. 21. 15:15
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
'자바' 카테고리의 다른 글
  • JAVA STEP 31. abstract&Object&Generic
  • JAVA STEP 30. Interface
  • JAVA STEP 28. 상속, Static 예제
  • JAVA STEP 27. Inheritance, Static
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • 정보처리기사
  • 자바
  • DBA
  • 데이터베이스
  • 프론트엔드
  • React
  • 백준
  • 앱개발자
  • 개발블로그
  • IT자격증공부
  • java
  • it
  • 웹개발자
  • JavaScript
  • 코딩테스트
  • 웹개발
  • IT개발자
  • 백엔드
  • jquery
  • 개발자
  • ajax
  • 웹페이지
  • 정보보안전문가
  • css
  • jsp
  • DB
  • IT자격증
  • 정보처리기사필기
  • 알고리즘
  • html

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
JAVA STEP 29. CASTING
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.