Wanna be Brilliant Full-Stack Developer
2/28 JAVA 캐스팅(Casting)이란? 본문
캐스팅을 배우려고하는데 캐스팅을 배우려는 목적은 무엇인가?
문제 풀기를 할때 전시간에 할때 나머지나 캐스팅이 두개념을 알고있어야 할수있기떄문에 배우고 있다.
package ch03;
public class CastEx01 {
private void sysout() {
// 캐스팅( 다운캐스팅, 업캐스팅)
int n1 = 100; // 4BYTE
double d1 = n1; // 8 BYTE
}
}
4바이트 공간에 100을 넣고 , 8 바이트 공간에 100을 넣는다는건 8바이트 공간에 4바이트를 넣는것과 마찬가지다.
int n1 정수를 double 공간에 넣어서 100이 더블공간은 실수이니까 100.0이 나오는데 이걸 캐스팅이라고 부른다.
이것을 업캐스팅이라고한다 작은걸 큰쪽에 넣었으니 업캐스팅! 이런 업캐스팅은 묵시적으로 일어난다?
묵시적이라는거는 그냥 해준다는것이다 왜 그냥 해준다는거냐면
8바이트 공간에더 큰공간에 4바이트를 넣는거를 묵시적으로 그냥 해준다는것이다.
개념은 이런거다.
메모리가 있고 한칸, 두칸, 세칸, 네칸이 있고 그 공간들에 int공간이 있다. 여기를 가리키는 주소가 n1이다.
이 4칸에데가 100 을 넣었다.
그리고 위에 한칸,두칸,세칸,네칸,다섯,여섯,일곱,여덟 칸의 공간을 만들고 double이다.
double은 주소가 d1이고 이 여덟칸 공간 안에 n1을 넣었으니 n1의 값은 실제로 100이다.
값이 100이 들어간다. 한마디로 이 100이 들어갈떄 n1에 있는걸 그대로 잡아서 더블에다가 옴긴것인데
100이 더 작은 박스니까 들어간다.
하지만 100 이들어갈때 뒤에다가 .0이 들어간다 왜냐하면 더블 실수형 공간이고 n1은 인트형공간이니까!
박스가 작기떄문에 그냥 허용을 해준다는것이다.
큰 공간에 8바이트 에 4바이트를 넣은거니 업캐스팅이라고 한다!
그러면 이거를 반대로 하면 ?
만약에 더블에 있는 값을 int에 넣으면 문법적으로 문제 가있을까요? 문법적으로 문제가 있다.
Type mismatch라고 나오고 있고 can not conver라고 나와있는데 convert는 변환하다 라는 뜻을 가지고 있다. double을 to int로 변환할수 없다고 오류가 나오고있다.
package ch03;
public class CastEx01 {
public static void main(String[] args){
// 캐스팅( 다운캐스팅, 업캐스팅)
int n1 = 100; // 4BYTE
double d1 = n1; // 8 BYTE ( 8Byte < - 4BYTE)
System.out.println(d1); // 업캐스팅(묵시적)
double d2 = 100.8 ;
int n2 = d2; // double을 int로 변환할수 없다.
}
}
그러면 d1은 더블인데 n1과 타입 미스매치가 안떳다. 작은거를 큰쪽에 넣었기 떄문이다.
내가 8바이트를 만들어서 애를 조그만한 4바이트 공간에 밀어넣으려니까 크기가 안맞아서 넣을수가 없는것이다.
큰걸 작은쪽에 넣을수 없다.
우리가 바구니가 크면 작은걸 넣는것은 상관없지만 바구니가 작은데 어떻게 큰걸 넣은가?
이럴떄는 명시적 형변환이라는것이 있는데?
명시적으로 적어준다 (int) , 큰걸 작은거에 넣었으니까 다운캐스팅이라고 한다.
그러면 d2는 8바이트인데 n2는 4바이트에 꾸겨 넣은것이니까 이 .8은 날라간다!
다운캐스팅은 단점이 데이터가 유실이 될수도있다.
작은쪽(4바이트)에 큰걸(8바이트) 꾸겨 넣으니까 이 나머지 4바이트 부분이 안들어간것이다. 그 부분이 유실된것이다.
소수점 이하의 숫자가 다 유실된다 이런것을 다운캐스팅이라고 한다.
이 개념적으로 보면 업캐스팅과 다운캐스팅은 바이트 관점에서 보면
큰건 작은쪽에, 넣을수있다. (명시적으로)
작은걸 큰쪽에 넣을수 있는가? (묵시적으로) 가능하다!
int money = 130;
System.out.println(130/100);
이렇게하면 130 과 100 둘다 인트니까 몫이 1로 나온다!
여기서 보면 money는 int이고 100.0은 더블이니까 나누면 큰쪽으로 따라간다!
4바이트 공간에 130을 넣어놓고 8바이트 공간에 100.0을 넣어놨으면 이 두개를 나누기 연산을 하면
결과는 큰 값에 저장이 된다. 그러니까 나누면 1.3이 8바이트 값에 들어간다
내가 4바이트 공간에 130, 4바이트 공간에 100을 넣었으면 무조건 결과는 4바이트에 들어가고 1이나온다
package ch03;
public class CoinExample {
public static void main(String[] args) {
// 최소 동전 구하기 500, 100, 50 , 10 가 남았는지 계산해보자!
int money = 2680;
int restMoney = 0;
// 스탭1
System.out.println("500원 : " + (money/500)); // 180원 남음
restMoney = money%500;
System.out.println("남은 금액 : " + restMoney);
//스탭2
System.out.println("100원 : " + (restMoney/100));
restMoney = restMoney%100;
System.out.println("남은 금액 : " + restMoney );
//스탭3
System.out.println("50원 : " + (restMoney/50));
restMoney = restMoney%50;
System.out.println("남은 금액 : " + restMoney);
//스탭4
System.out.println("10원 : " + (restMoney/10));
restMoney = restMoney%10;
System.out.println("남은 금액 : " + restMoney);
}
}
이렇게 결과는 나왔지만 코드가 다 똑같고 몫과 나머지를 구하는 숫자만 다르다.
코드를 조금더 일관성있게 바꾸기 위해서 저 money부분을 restMoney로 바꿔버리면 처음에는 0 이니까 이걸
int restMoney = money ; 이렇게 초기화 해버리면
package ch03;
public class CoinExample {
public static void main(String[] args) {
// 최소 동전 구하기 500, 100, 50 , 10 가 남았는지 계산해보자!
int money = 3680;
int restMoney = money;
// 스탭1
System.out.println("500원 : " + (money/500)); // 180원 남음
restMoney = money%500;
System.out.println("남은 금액 : " + restMoney);
//스탭2
System.out.println("100원 : " + (restMoney/100));
restMoney = restMoney%100;
System.out.println("남은 금액 : " + restMoney );
//스탭3
System.out.println("50원 : " + (restMoney/50));
restMoney = restMoney%50;
System.out.println("남은 금액 : " + restMoney);
//스탭4
System.out.println("10원 : " + (restMoney/10));
restMoney = restMoney%10;
System.out.println("남은 금액 : " + restMoney);
//마무리
System.out.println(money + "의 최소 동전 개수는?" );
System.out.println("500원 7개");
System.out.println("100원 1개");
System.out.println("50원 1개");
System.out.println("10원 3개");
}
}
이렇게 결과가 나오지만 만약에 int money = 값이 다른값으로 바뀌면 밑에결과 값도 바뀌어야하는데 못바뀌니까
그래서 System.out.println(money + "의 최소 동전 개수는?" );
System.out.println("500원 7개");
System.out.println("100원 1개");
System.out.println("50원 1개");
System.out.println("10원 3개"); 이부분에 각 7 , 1 , 1 , 3 과 같은 상수를 적을것이 아니라 이 사이에다가 먼가 다른걸 적어야한다. 그래서 위에 변수를 설정할것인데
int count500 = 0;
int count100 = 0;
int count50 = 0;
int count10 = 0;
근데 여기서 조심해야할것은 자바에서 변수 첫글자가 숫자로 시작할수는 없다 ( 10count (x) )
System.out.println("500원 개"); 그리고
이렇게 문자열과 문자열 사이에 변수를 넣으려면 쌍따옴표 + 변수 + " 이런 형태로 되야한다.
package ch03;
public class CoinExample {
public static void main(String[] args) {
// 최소 동전 구하기 500, 100, 50 , 10 가 남았는지 계산해보자!
int money = 3680;
int restMoney = money;
// 변수명 첫글자가 숫자가 될 수 없다.
int count500 = 0;
int count100 = 0;
int count50 = 0;
int count10 = 0;
// 스탭1
System.out.println("500원 : " + (money/500)); // 180원 남음
restMoney = money%500;
System.out.println("남은 금액 : " + restMoney);
//스탭2
System.out.println("100원 : " + (restMoney/100));
restMoney = restMoney%100;
System.out.println("남은 금액 : " + restMoney );
//스탭3
System.out.println("50원 : " + (restMoney/50));
restMoney = restMoney%50;
System.out.println("남은 금액 : " + restMoney);
//스탭4
System.out.println("10원 : " + (restMoney/10));
restMoney = restMoney%10;
System.out.println("남은 금액 : " + restMoney);
//마무리
System.out.println(money + "의 최소 동전 개수는?" );
System.out.println("500원 "+count500+"개");
System.out.println("100원 "+count100+"개");
System.out.println("50원 "+count50+"개");
System.out.println("10원 "+count10+"개");
}
}
package ch03;
public class CoinExample {
public static void main(String[] args) {
// 최소 동전 구하기 500, 100, 50 , 10 가 남았는지 계산해보자!
int money = 2680;
int restMoney = money;
// 변수명 첫글자가 숫자가 될 수 없다.
int count500 = 0;
int count100 = 0;
int count50 = 0;
int count10 = 0;
// 스탭1
count500= restMoney/500;
System.out.println("500원 : " + count500); // 180원 남음
restMoney = money%500;
System.out.println("남은 금액 : " + restMoney);
//스탭2
count100= restMoney/100;
System.out.println("100원 : " + (restMoney/100));
restMoney = restMoney%100;
System.out.println("남은 금액 : " + restMoney );
//스탭3
count50= restMoney/50;
System.out.println("50원 : " + (restMoney/50));
restMoney = restMoney%50;
System.out.println("남은 금액 : " + restMoney);
//스탭4
count10= restMoney/10;
System.out.println("10원 : " + (restMoney/10));
restMoney = restMoney%10;
System.out.println("남은 금액 : " + restMoney);
//마무리
System.out.println("===================================");
System.out.println(money + "의 최소 동전 개수는?" );
System.out.println("500원 "+count500+"개");
System.out.println("100원 "+count100+"개");
System.out.println("50원 "+count50+"개");
System.out.println("10원 "+count10+"개");
System.out.println("===================================");
}
}
이러한 프로그램 만들어 놓으면 굉장히 편리하게 구할수 있다!
package ch03;
public class ExampleEx01 {
static double calc(double gasoline, double distance) {
return 0.0;
}
public static void main(String[] args) {
double gasoline = 8.86;
double distance = 182.736;
double efficiency = calc(gasoline, distance);
System.out.println("연비 : " +efficiency+"km/L");
}
}
우리가 1L는 8키로를 갈수 있을거고 2L는 16키로를 갈수 있을것이다.
2.5L는 20Km를 갈 수 있을것이다.
'Some Memos > Java' 카테고리의 다른 글
3/1 Java 객체지향 프로그래밍 문법 #2 #라이브러리 # JAR (0) | 2022.03.02 |
---|---|
JAVA 객체지향 프로그래밍 문법 #1 (0) | 2022.03.02 |
2/28 JAVA 조건 연산자& 나머지연산자! (0) | 2022.02.28 |
2/23 JAVA 연산자(대입,사칙,비교,논리) 란 무엇인가? (0) | 2022.02.23 |
2/21 Java 메서드의 매개변수와 인수란? (0) | 2022.02.22 |