λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Backend/Java

[Java]ν˜•λ³€ν™˜(Type Casting)

by sukii 2023. 11. 23.
λ°˜μ‘ν˜•

πŸ§ν˜•λ³€ν™˜(νƒ€μž… λ³€ν™˜)μ΄λž€

intν˜• λ³€μˆ˜μ— doubleν˜•μΈ 1.5 값을 λ„£μœΌλ €λŠ” 상황이 μžˆλ‹€κ³  가정을 ν•΄λ³΄μž.

μ›λž˜λŠ” μ •μˆ˜ν˜•μΈ int νƒ€μž…μ— 1.5κ°€ λ“€μ–΄κ°ˆ 수 μ—†μ§€λ§Œ, ν˜•λ³€ν™˜μ„ μ΄μš©ν•˜λ©΄ κ°€λŠ₯ν•˜λ‹€!

 

ν˜•λ³€ν™˜μ€ μžλ™νƒ€μž…λ³€ν™˜(λ¬΅μ‹œμ ν˜•λ³€ν™˜)κ³Ό κ°•μ œνƒ€μž…λ³€ν™˜(λͺ…μ‹œμ ν˜•λ³€ν™˜) 두 κ°€μ§€κ°€ 있음. 

 

✨ μžλ™ νƒ€μž… λ³€ν™˜(λ¬΅μ‹œμ  ν˜•λ³€ν™˜) implicit casting

κ°’μ˜ ν—ˆμš© λ²”μœ„κ°€ μž‘μ€ νƒ€μž…μ΄ ν—ˆμš© λ²”μœ„κ°€ 큰 νƒ€μž…μœΌλ‘œ μ €μž₯될 λ•Œ λ°œμƒν•¨.

 

*κΈ°λ³Έ νƒ€μž…μ„ ν—ˆμš© λ²”μœ„ 크기순으둜 μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™μŒ.

byte < short < int < long < float < double

 

μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 'μžλ™ νƒ€μž… λ³€ν™˜'이 λ°œμƒν•¨.

 

πŸ–₯οΈμžλ™νƒ€μž…λ³€ν™˜ 예제 

package basic;

//ν˜•λ³€ν™˜(TypeCast) : κ°’μ˜ μžλ£Œν˜•μ„ μΌμ‹œμ μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방법
public class TypeCastApp {
	public static void main(String[] args) {
	System.out.println("κ²°κ³Ό = "+(3+1.5));//3(int)+1.5(double)>>3.0(double)+1.5(double) >> 4.5(double)
	
    //1)
	double su=10;
	System.out.println("su = "+su);
	
    //2)
	System.out.println("κ²°κ³Ό = "+95/10);// int / int >> int
	System.out.println("κ²°κ³Ό = "+95.0/10.0);// double / double >> double
	System.out.println("κ²°κ³Ό = "+95.0/10);// double / int >> double / double 둜 μžλ™ν˜•λ³€ν™˜
	
	int kor=95, eng=90;
	int tot=kor+eng;//총점을 κ³„μ‚°ν•˜μ—¬ μ €μž₯
	System.out.println("두 κ³Όλͺ©μ˜ 점수 ν•© = "+tot);
	//double ave=tot/2;//평균을 κ³„μ‚°ν•˜μ—¬ μ €μž₯ - μ—°μ‚° κ²°κ³Όκ°’: μ •μˆ˜κ°’(92) >> μ‹€μˆ˜(92.0) μžλ™ν˜•λ³€ν™˜
	double ave=tot/2.; //μžλ™ν˜•λ³€ν™˜ - μ—°μ‚° κ²°κ³Όκ°’(평균)인 μ‹€μˆ˜(92.5)이 λ³€μˆ˜μ— μ €μž₯
	
	System.out.println("총점 = "+tot+", 평균 = "+ave);
	
	byte su1=10, su2=20;
	int su3=su1+su2;
	System.out.println("su3 = "+su3);
	System.out.println("==================================================");

 

μœ„ 예제의 κ²°κ³Ό

 

μœ„ μ½”λ“œμ—μ„œ 1), 2) 뢀뢄을 μ‚΄νŽ΄λ³΄λ©΄.. 

 

1) μ‹€μˆ˜ν˜•μΈ doubleν˜•μœΌλ‘œ  suλΌλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ •μˆ˜ 10을 λŒ€μž…ν–ˆλ‹€. 

10은 μ •μˆ˜μ§€λ§Œ, λŒ€μž…λœ  λ³€μˆ˜ suκ°€ μ‹€μˆ˜ν˜•μ΄λ―€λ‘œ 좜λ ₯ μ‹œμ—λŠ” 10.0으둜 좜λ ₯λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

2) μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ λ³€μˆ˜λ“€λ‘œ μ—°μ‚°ν•  λ•Œλ„ ν—ˆμš© λ²”μœ„κ°€ μž‘μ€ νƒ€μž…μ΄ ν—ˆμš© λ²”μœ„κ°€ 큰 νƒ€μž…μœΌλ‘œ λ³€ν™˜λœλ‹€.

μœ„μ—μ„œ 보듯, ' 95.0(double) / 10(int) ' 의 κ²°κ³ΌλŠ” 9.5κ°€ λœλ‹€. κ·ΈλŸ¬λ‚˜ ' 95(int) / 10(int) 'λŠ” μ†Œμˆ˜μ  λ’€λŠ” 잘리고 9만 좜λ ₯λœλ‹€.

 

 

✨ κ°•μ œ νƒ€μž… λ³€ν™˜(λͺ…μ‹œμ  ν˜•λ³€ν™˜) explicit casting

 ν—ˆμš© λ²”μœ„κ°€ 큰 νƒ€μž…μ„ μž‘μ€ νƒ€μž…μ— λ„£μœΌλ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€.

μ΄λ•Œ μ‚¬μš©μžκ°€ μ–΄λ–€ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν• μ§€ μ •ν•΄μ£Όλ©΄ μ—λŸ¬κ°€ 해결이 λœλ‹€.

이게 λ°”λ‘œ κ°•μ œ νƒ€μž… λ³€ν™˜μž„.

 

πŸ–₯οΈκ°•μ œνƒ€μž…λ³€ν™˜ 예제 

    //1)
    //κ°•μ œ ν˜•λ³€ν™˜ => Cast μ—°μ‚°μž : (μžλ£Œν˜•)κ°’
	int num=(int)12.3;//(int)12.3 = 12
	System.out.println("num = "+num);
	
    //2)
	int num1=95, num2=10;
	//double num3=num1/num2;//λ³€μˆ˜κ°’ : 9.0
	double num3=(double)num1/num2;//λ³€μˆ˜κ°’ : 9.5
	System.out.println("num3 = "+num3);
	
	
	int num4=100_000_000, num5=30;
	//μ •μˆ˜κ°’μ€ 4Byte(-2147483648~2147483647)둜 ν‘œν˜„λ˜μ–΄ μ—°μ‚° 결과값이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚  경우
	//μ“°λ ˆκΈ°κ°’ λ°œμƒλ˜μ–΄ λ³€μˆ˜μ— μ €μž₯ κ°€λŠ₯ => 잘λͺ»λœ κ²°κ³Όκ°’ 좜λ ₯ - μ‹€ν–‰ 였λ₯˜
	//int num6=num4*num5;
	//System.out.println("num6 = "+num6);
	long num6=(long)num4*num5;
	System.out.println("num6 = "+num6);
	
	double number=1.23456789;
	System.out.println("number = "+number);
	
	//μ†Œμˆ«μ  2번째 μžλ¦¬κΉŒμ§€λ§Œ 좜λ ₯λ˜λ„λ‘ λ³€ν™˜ν•˜μ—¬ 좜λ ₯
	System.out.println("number(λ‚΄λ¦Ό) = "+(int)(number*100)/100.);
	System.out.println("number(반올림) = "+(int)(number*100+0.5)/100.);
	System.out.println("number(올림) = "+(int)(number*100+0.9)/100.);
	}
}

 

μœ„ μ½”λ“œμ—μ„œ 1), 2) 뢀뢄을 μ‚΄νŽ΄λ³΄λ©΄.. 

 

1) intν˜•μΈ λ³€μˆ˜ num에 μ‹€μˆ˜μΈ 12.3을 λ„£μœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•¨. 

μ‹€μˆ˜ν˜•μ€ intν˜•λ³΄λ‹€ ν—ˆμš©λ²”μœ„κ°€ 크기 λ•Œλ¬Έμ— μžλ™ν˜•λ³€ν™˜ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 

이 λ•Œ, 12.3 μ•žμ— intλ₯Ό λΆ™μ—¬μ£Όλ©΄ κ°•μ œλ‘œ ν˜•λ³€ν™˜ μ‹œν‚¬ 수 μžˆλ‹€. =>  int num=(int)12.3; 

그럼 μ •μˆ˜ν˜•μœΌλ‘œ λ°”λ€Œλ©΄μ„œ numμ—λŠ” 12κ°€ μ €μž₯λœλ‹€.

 

2) num1κ³Ό num2κ°€ λͺ¨λ‘ μ •μˆ˜ν˜•μ΄λ―€λ‘œ num1/num2 = 9 κ°€ λ˜μ–΄μ•Ό 함.

κ·ΈλŸ¬λ‚˜ 이 연산을 doubleν˜• λ³€μˆ˜μ— λŒ€μž…ν•˜λ‹ˆ μžλ™ ν˜•λ³€ν™˜λ˜μ–΄ 9.0으둜 좜λ ₯λœλ‹€. (int -> double은 μžλ™ν˜•λ³€ν™˜ κ°€λŠ₯)

μš°λ¦¬λŠ” 95λ₯Ό 10으둜 λ‚˜λˆ„λ©΄ 9.5라고 μ•Œκ³  μžˆμ§€λ§Œ, 연산값은 μ •μˆ˜ν˜•μ΄μ—ˆμœΌλ―€λ‘œ 9κ°€ λ˜μ—ˆλ‹€κ°€ doubleν˜•μœΌλ‘œ λ³€ν™˜λœκ±°λ‹ˆ 9.0이 λœκ±°λ‹€.

 

그런데 이 μ—°μ‚° μ•žμ— 미리 λ³€ν™˜ν•  νƒ€μž…μ„ λͺ…μ‹œν•΄μ£Όλ©΄( => (double)num1/num2 ), 

연산값이 μ‹€μˆ˜λ‘œ λ‚˜μ˜€κΈ° λ•Œλ¬Έμ— μ†Œμˆ˜μ κΉŒμ§€ μ‚΄λ €μ„œ 9.5κ°€ λ‚˜μ˜¨λ‹€.

λ°˜μ‘ν˜•