웹_프론트_백엔드/단과

[단과_JAVA] 2020.02.14

shine94 2020. 2. 15. 00:15

1. casting
1) up casting
 : 부모 타입에 자식 값이 들어있는 기법

   부모클래스명 객체 = new 자식생성자();

 

** 부모와 자식간에 공통요소(재정의 메소드)만 사용 가능하며,
    자식 클래스의 추가된 것들은 사용할 수 없다.

 

** 부모 타입으로 선언되었기 때문에 부모의 필드만 사용 가능하지만  
    자식 클래스에서 재정의 했다면, 재정의 된 메소드로 사용된다.       

 


2) down casting
 : 자식 타입에 부모 값이 들어가는 기법

   자식클래스명 객체 = (자식클래스명) 업캐스팅된 인스턴스된 클래스;

 

** 자식 클래스 타입으로 부모 생성자를 호출하면 오류 발생 
    Why? 부모의 범위가 더 크기 때문에 자식에 담을 수 없다.

** 부모클래스로 업캐스팅 되었던 클래스를 다시 본래의 자식클래스로 형변환하는 것을 다운캐스팅이라고 함

    (즉, 업캐스팅 된 것을 원상 복구하는 것)

 

 

2. 자식 클래스의 객체들은 모두 부모 타입이다.

 

 

3. 오늘 실습코드

1) Casting

package day23;

class Car{
	String brand;
	String color;
	int price;
	
	public Car() {}
	
	public Car(String brand, String color, int price) {
		super();
		this.brand = brand;
		this.color = color;
		this.price = price;
	}
	
	void engineStart() {System.out.println("열쇠로 시동 킴");}
	void engineStop() {System.out.println("열쇠로 시동 킴");}
	
}

class SuperCar extends Car{
	String mode;

	public SuperCar() {}
	
	public SuperCar(String brand, String color, int price, String mode) {
		super(brand, color, price);
		this.mode = mode;
	}
	
	@Override
	void engineStart() {System.out.println("음성으로 시동 킴");}
	@Override
	void engineStop() {System.out.println("음성으로 시동 끔");}
	
	void openRoof() {System.out.println("지붕 염");}
	void closeRoof() {System.out.println("지붕 닫음");}
}

public class Casting {
	public static void main(String[] args) {
		Car matiz = new Car();
		SuperCar ferrari = new SuperCar();

		//up casting
		Car noOptionFerrari = new SuperCar();
		noOptionFerrari.engineStart();
		
		//down casting
		//무조건 up casting한 것만 down casting 가능, 안그럼 오류남
		SuperCar optionFerrai = (SuperCar) noOptionFerrari;
		optionFerrai.openRoof();
	}
}

 

2) 은행!

** 아직 완성 전, 다음 수업 시간에 완성하기로 함 **

** ATM 메인 클래스 **

import java.util.Random;
import java.util.Scanner;

public class ATM {
	public static void main(String[] args) {


		String msg = "1.신한은행\n2.국민은행\n3.우리은행\n4.나가기";
		String menu = "1.계좌개설\n2.입금하기\n3.출금하기\n4.잔액조회\n5.나가기";
		Scanner sc = new Scanner(System.in);
		Random r = new Random();
		
		String name = "", pw = "", account = "", temp = "";
		
		int choice = 0, menu_choice = 0;
		
		while(true) {
			System.out.println(msg);
			choice = sc.nextInt();
			
			if(choice == 4) {break;}
			choice --;
			while(true) {
				System.out.println(menu);
				menu_choice = sc.nextInt();
				
				if(menu_choice == 5) {break;}
				
				switch(menu_choice) {
				case 1:
					Bank[] arBank = {new Shinhan(), new Kookmin(), new Woori()};
					while(true) {
						account = "" + (r.nextInt(90000) + 10000);
						if(Bank.checkDup(account) == null) {break;}
					}
					arBank[choice].account = account;
					arBank[choice].name = "";
					arBank[choice].pw = "";
					
					//사용자가 선택한 은행(행 : choice)에
					//arCnt[choice]번째 고객으로
					//신규고객(arBank[choice]) 저장
					Bank.arrBank[choice][Bank.arCnt[choice]] = arBank[choice];
					
					//사용자가 선택한 은행의 고객 수 1증가
					Bank.arCnt[choice]++;
					break;
				case 2:
					break;
				case 3:
					break;
				case 4:
					break;
				}
			}
		}
	}
}

 

** Bank 클래스 **  

package day23;

public class Bank {
	
	static Bank[][] arrBank = new Bank[3][100];
	static int[] arCnt = new int[arrBank.length];
	
	String name;
	String account;
	String pw;
	int money;
	
	public Bank() {}
	
	//중복검사
	static Bank checkDup(String account) {
		Bank b = null;
		for(int i=0; i<arrBank.length; i++) {
			for(int j = 0; j < arCnt[i]; j ++) {
				if(arrBank[i][j].account.equals(account)) {
					b = arrBank[i][j];
					break;
				}
			}
		}
		return b;
	}
	
	//로그인
	void login(String account, String pw) {
		checkDup(account);
	}
	
	//입금
	void deposit(int money) {
		this.money += money;
	}
	//출금
	void withdraw(int money) {
		if(!(this.money - money < 0)) {
			this.money -= money;
		}
	}
	//잔액조회
	void balance() {
		System.out.println("현재 잔액 : " + this.money + "원");
	}
}

 

** Shinhan 클래스 **  

package day23;

public class Shinhan extends Bank{
	//입금시 수수료 10%
	@Override
	void deposit(int money) {
		this.money -= money * 0.9;
	}
}

 

** Kookmin 클래스 ** 

package day23;

public class Kookmin extends Bank{
	//출금시 수수료 50%
	@Override
	void withdraw(int money) {
		this.money -= money * 0.5;
	}
}

 

** Woori 클래스 ** 

package day23;

public class Woori extends Bank{
	//잔액 조회시 재산 반토막
	@Override
	void balance() {
		this.money *= 0.5;
	}
}

 

 

3. 단축키

** 메소드 이름 중 일부 작성 + Ctrl + Space : Override

'웹_프론트_백엔드 > 단과' 카테고리의 다른 글

[단과_JAVA] 2020.02.17  (0) 2020.02.17
[단과_C] 2020.02.14  (0) 2020.02.15
[단과_C] 2020.02.13  (0) 2020.02.14
[단과_JAVA] 2020.02.13  (0) 2020.02.14
[단과_JAVA] 2020.02.12  (0) 2020.02.12