λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“— Book/μžλ°”μ˜ 정석

2-5μž₯ ν˜• λ³€ν™˜

by hyeon-z 2023. 3. 9.

 

1. ν˜• λ³€ν™˜(μΊμŠ€νŒ…, casting)μ΄λž€?

πŸ’‘ λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ˜ νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것

 

2. ν˜• λ³€ν™˜ 방법

πŸ’‘ (νƒ€μž…) ν”Όμ—°μ‚°μž

여기에 μ‚¬μš©λ˜λŠ” κ΄„ν˜Έ()λŠ” ‘캐슀트 μ—°μ‚°μž’, ‘ν˜•λ³€ν™˜ μ—°μ‚°μž’라고 ν•œλ‹€.

double d = 85.4;
int score = (int)d;
-> int score = (int)85.4;
-> int score = 85;

ν˜• λ³€ν™˜ μ—°μ‚°μžλŠ” ν”Ό μ—°μ‚°μžμ˜ 값을 μ½μ–΄μ„œ μ§€μ •λœ νƒ€μž…μœΌλ‘œ ν˜• λ³€ν™˜ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.

⇒ ν”Ό μ—°μ‚°μžμΈ λ³€μˆ˜ d의 값은 λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

κΈ°λ³Έν˜•μ—μ„œ boolean을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ νƒ€μž… 듀은 μ„œλ‘œ ν˜• λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

κΈ°λ³Έν˜•κ³Ό μ°Έμ‘° ν˜• κ°„μ˜ ν˜• λ³€ν™˜μ€ λΆˆκ°€λŠ₯ν•˜λ‹€. → 7μž₯μ—μ„œ μžμ„Ένžˆ λ³Ό μ˜ˆμ •

μ‹€μˆ˜ ν˜• → μ •μˆ˜ ν˜•μ˜ ν˜• λ³€ν™˜μ—μ„œ μ†Œμˆ˜μ  μ΄ν•˜μ˜ 값은 λ²„λ¦°λ‹€.

double d = 3.65;
float f = 3.65f;

System.out.println((int)d);  // 3
System.out.println((int)f);  // 3

 

3. μ •μˆ˜ ν˜• κ°„μ˜ ν˜• λ³€ν™˜

큰 νƒ€μž… → μž‘μ€ νƒ€μž…

ex) int → byte

크기의 차이만큼 μž˜λ €λ‚˜κ°€κ²Œ λ˜μ–΄ κ°’ 손싀이 λ°œμƒν•œλ‹€.

 

μž‘μ€ νƒ€μž… → 큰 νƒ€μž…

ex) byte → int

μ–‘μˆ˜: λΉˆ 곡간을 0으둜 채움

음수: λΉˆ 곡간을 1으둜 채움

⇒ ν˜• λ³€ν™˜ 후에도 λΆ€ν˜Έλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

 

4. μ‹€μˆ˜ ν˜• κ°„μ˜ ν˜• λ³€ν™˜

μž‘μ€ νƒ€μž… → 큰 νƒ€μž…

ex) float → double

μ§€μˆ˜(E): float의 기저인 127을 λΉΌμ£Όκ³  double의 기저인 1023을 λ”ν•œλ‹€.

κ°€μˆ˜(M): float의 κ°€μˆ˜ 23자리λ₯Ό μ±„μš°κ³  남은 자리λ₯Ό 0으둜 μ±„μš΄λ‹€.

 

큰 νƒ€μž… → μž‘μ€ νƒ€μž…

ex) double → float

μ§€μˆ˜(E): double의 기저인 1023을 λΉΌμ£Όκ³  float의 기저인 127을 λ”ν•œλ‹€.

κ°€μˆ˜(M): double의 κ°€μˆ˜ 52자리 쀑 23자리만 μ €μž₯되고 λ‚˜λ¨Έμ§€λŠ” 버렀진닀.

* ν˜• λ³€ν™˜ μ‹œ κ°€μˆ˜μ˜ 24번째 μžλ¦¬μ—μ„œ 반올림 λ°œμƒ κ°€λŠ₯

 

24번째 자리의 μˆ˜κ°€ 1인 경우, 반올림이 λ°œμƒν•˜μ—¬ 23번째 자리의 값이 1 μ¦κ°€ν•œλ‹€.

 

float의 λ²”μœ„λ₯Ό λ„˜λŠ” κ°’μœΌλ‘œ ν˜• λ³€ν™˜

 

double d = 1.0e100;  // float의 μ΅œλŒ€κ°’λ³΄λ‹€ 큰 κ°’(1.0 * 10^100)
float f = (float)d;  // fλŠ” λ¬΄ν•œλŒ€

double d = 1.0e-50;  // float의 μ΅œμ†Œκ°’λ³΄λ‹€ μž‘μ€ κ°’(1.0 * 10^-50)
float f = (float)d;  // fλŠ” 0

 

μžμ„Έν•œ μ˜ˆμ‹œ

 

float f = 9.1234567f;
double d = 9.1234567;
double d2 = (double)f;

System.out.printf("f =%20.18f\n", f);  // f =9.123456954956055000
System.out.printf("d =%20.18f\n", d);  // d =9.123456700000000000
System.out.printf("d2=%20.18f\n", d2); // d2=9.123456954956055000

 

1. float f = 9.1234567 f;

 

2. double d = 9.1234567;

 

3. double d2 = (double) f;

μ €μž₯ν•  λ•Œ 이미 값이 λ‹¬λΌμ‘ŒκΈ° λ•Œλ¬Έμ—. ν˜• λ³€ν™˜μ„ 해도 값이 κ°™μ•„μ§€μ§€ μ•ŠλŠ”λ‹€.

 

5. μ •μˆ˜ ν˜•κ³Ό μ‹€μˆ˜ ν˜• κ°„μ˜ ν˜• λ³€ν™˜

μ •μˆ˜μ™€ μ‹€μˆ˜μ˜ μ €μž₯ 방식 비ꡐ

 

μ •μˆ˜ ν˜•μ„ μ‹€μˆ˜ ν˜•μœΌλ‘œ λ³€ν™˜

 

μ •μˆ˜λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•œ λ‹€μŒ μ •κ·œν™”ν•΄μ„œ μ‹€μˆ˜μ˜ μ €μž₯ 방식에 맞게 μ €μž₯

 

+) μ •λ°€λ„λ‘œ μΈν•œ 였차 λ°œμƒ

intλŠ” μ΅œλŒ€ 10자리의 정밀도 μš”κ΅¬

μ•½ 7자리의 정밀도λ₯Ό μ œκ³΅ν•˜λŠ” float에 이λ₯Ό μ €μž₯ν•˜κ²Œ 되면 μ˜€μ°¨κ°€ λ°œμƒν•œλ‹€.

ex) 91234567을 floatν˜•μœΌλ‘œ ν˜• λ³€ν™˜ν•˜λ©΄ 9123458.0이 λœλ‹€.

⇒ 10μ§„μˆ˜λ‘œ 8자리 μ΄μƒμ˜ 값을 μ‹€μˆ˜ ν˜•μœΌλ‘œ λ³€ν™˜ν•  λ•ŒλŠ” float이 μ•„λ‹Œ double둜 ν˜• λ³€ν™˜μ„ ν•΄μ•Ό ν•œλ‹€.

 

μ‹€μˆ˜ ν˜•μ„ μ •μˆ˜ ν˜•μœΌλ‘œ λ³€ν™˜

μ‹€μˆ˜ ν˜•μ˜ μ†Œμˆ˜μ  μ΄ν•˜ 값은 버린닀.

μ‹€μˆ˜μ˜ μ†Œμˆ˜μ μ„ 버리고 남은 μ •μˆ˜κ°€ μ •μˆ˜ ν˜•μ˜ μ €μž₯ λ²”μœ„λ₯Ό λ„˜μœΌλ©΄ μ˜€λ²„ν”Œλ‘œμš° λ°œμƒ

 

6. μžλ™ ν˜• λ³€ν™˜

μžλ™ ν˜• λ³€ν™˜μ˜ κ·œμΉ™

컴파일러의 νƒ€μž… 일치 νŒλ‹¨ κΈ°μ€€

πŸ’‘ 기쑴의 값을 μ΅œλŒ€ν•œ 보쑴할 수 μžˆλŠ” νƒ€μž…μœΌλ‘œ μžλ™ ν˜• λ³€ν™˜ν•œλ‹€.

μžλ™ ν˜• λ³€ν™˜μ΄ κ°€λŠ₯ν•œ λ°©ν–₯

 

→ μ΄ λ°©ν–₯으둜만 μžλ™ ν˜• λ³€ν™˜ κ°€λŠ₯

ν‘œν˜„ λ²”μœ„κ°€ μ’μ€ νƒ€μž… → 넓은 νƒ€μž…μœΌλ‘œμ˜ ν˜• λ³€ν™˜μ€ κ°’ 손싀이 μ—†μœΌλ―€λ‘œ 두 νƒ€μž… μ€‘μ—μ„œ ν‘œν˜„ λ²”μœ„κ°€ 더 넓은 μͺ½μœΌλ‘œ ν˜• λ³€ν™˜λœλ‹€.

 

μ—¬κΈ°μ„œ λͺ‡ κ°€μ§€ ꢁ금증이 생긴닀.

❓ float은 `4byte`, long은 `8byte`둜 long의 μžλ£Œν˜•μ˜ 크기가 ν¬μ§€λ§Œ long → float의 λ°©ν–₯성을 띄고 μžˆλ‹€.

μ–΄λ– ν•œ 이유 λ•Œλ¬ΈμΌκΉŒ?

보톡은 자료 ν˜•μ˜ 크기가 큰 κ²ƒμΌμˆ˜λ‘ κ°’μ˜ ν‘œν˜„ λ²”μœ„κ°€ ν¬μ§€λ§Œ, μ‹€μˆ˜ ν˜•μ€ μ •μˆ˜ ν˜•κ³Ό ν‘œν˜„ν•˜λŠ” 방식이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ‹€μˆ˜ ν˜•μ΄ μ •μˆ˜ ν˜•λ³΄λ‹€ 훨씬 더 큰 ν‘œν˜„ λ²”μœ„λ₯Ό κ°–κΈ° λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ μ •μˆ˜ ν˜•→μ‹€μˆ˜ ν˜•μœΌλ‘œ ν˜• λ³€ν™˜ν•˜λŠ” 경우, μ •λ°€λ„μ˜ ν•œκ³„λ‘œ μΈν•œ μ˜€μ°¨ λ°œμƒ κ°€λŠ₯성이 μ‘΄μž¬ν•œλ‹€.

 

❓ short와 char은 `2byte`둜 μžλ£Œν˜•μ˜ 크기가 같은데 μ™œ ν™”μ‚΄ν‘œκ°€ μ—†λŠ”κ°€?

char와 short은 크기가 κ°™μ§€λ§Œ, char의 λ²”μœ„λŠ” 0~2^16-1(0~65535)이고
short의 λ²”μœ„λŠ” -2^15~2^15-1(-32768γ€œ32767)μ΄λ―€λ‘œ μ„œλ‘œ λ²”μœ„κ°€ λ‹¬λΌμ„œ
λ‘˜ 쀑 μ–΄λŠ μͺ½μœΌλ‘œμ˜ ν˜• λ³€ν™˜λ„ κ°’ 손싀이 λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ μžλ™ ν˜• λ³€ν™˜μ΄ μˆ˜ν–‰λ  수 μ—†λ‹€.

 

μ΅œμ’… 정리

  1. boolean을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 7개의 κΈ°λ³Έ ν˜•μ€ μ„œλ‘œ ν˜• λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.
  2. κΈ°λ³Έ ν˜•κ³Ό μ°Έμ‘° ν˜•μ€ μ„œλ‘œ ν˜• λ³€ν™˜ν•  수 μ—†λ‹€.
  3. μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ λ³€μˆ˜ κ°„μ˜ 연산은 ν˜• λ³€ν™˜μ„ ν•˜λŠ” 것이 μ›μΉ™μ΄μ§€λ§Œ, κ°’μ˜ λ²”μœ„κ°€ μž‘μ€ νƒ€μž… → 큰 νƒ€μž…μ˜ ν˜• λ³€ν™˜μ€ μƒλž΅ν•  수 μžˆλ‹€.

 

 

Reference

μžλ°”μ˜ 정석 - 남ꢁ μ„±

'πŸ“— Book > μžλ°”μ˜ 정석' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

3-2μž₯ 단항 μ—°μ‚°μž  (0) 2023.03.14
3-1μž₯ μ—°μ‚°μž  (1) 2023.03.14
2-4μž₯ κΈ°λ³Έν˜•  (0) 2023.03.09
2-3μž₯ 진법  (1) 2023.03.09
2-2μž₯ λ³€μˆ˜μ˜ νƒ€μž…  (0) 2023.03.07

λŒ“κΈ€