Skip to content

Latest commit

Β 

History

History
100 lines (62 loc) Β· 5.96 KB

Promotion & Casting.md

File metadata and controls

100 lines (62 loc) Β· 5.96 KB

Promotion & Casting

Assembled by GimunLee (2019-11-19)


Goal

  • Promotion에 λŒ€ν•΄ μ„€λͺ…ν•  수 μžˆλ‹€.
  • Casting에 λŒ€ν•΄ μ„€λͺ…ν•  수 μžˆλ‹€.
  • ν˜•λ³€ν™˜ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” μ—λŸ¬μ— λŒ€ν•΄ μ„€λͺ…ν•  수 μžˆλ‹€.

데이터 νƒ€μž… ν˜•λ³€ν™˜ (νƒ€μž…λ³€ν™˜)

Javaμ—μ„œ 연산은 "2(byte 데이터 νƒ€μž…) + 3(byte 데이터 νƒ€μž…)" κ³Ό 같이 λ™μΌν•œ 데이터 νƒ€μž…μ—μ„œ κ°€λŠ₯ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ, ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λ‹€ 보면 "2(byte 데이터 νƒ€μž…) + 3.5(double 데이터 νƒ€μž…)"κ³Ό 같이 μ„œλ‘œ λ‹€λ₯Έ 데이터 νƒ€μž…λΌλ¦¬μ˜ 연산이 ν•„μš”ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

이럴경우 λ³€μˆ˜μ˜ 데이터 νƒ€μž…μ„ λ°”κΏ”μ£ΌλŠ” μž‘μ—…μ΄ ν•„μš”ν•œλ°, 이것이 데이터 νƒ€μž…μ˜ ν˜•λ³€ν™˜(νƒ€μž…λ³€ν™˜)μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν˜•λ³€ν™˜(νƒ€μž…λ³€ν™˜)μ—λŠ” 크게 μžλ™ ν˜•λ³€ν™˜(Promotion) κ³Ό κ°•μ œ ν˜•λ³€ν™˜(Casting) 이 μžˆμŠ΅λ‹ˆλ‹€. 또 λ‹€λ₯Έλ§λ‘œ μžλ™ ν˜•λ³€ν™˜μ€ λ¬΅μ‹œμ  νƒ€μž… λ³€ν™˜, κ°•μ œ ν˜•λ³€ν™˜μ€ λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜μ΄λΌκ³ λ„ ν•©λ‹ˆλ‹€.


Promotion (μžλ™ ν˜•λ³€ν™˜, λ¬΅μ‹œμ  ν˜•λ³€ν™˜)

μžλ™ ν˜•λ³€ν™˜(Promotion)은 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑에 μžλ™μ μœΌλ‘œ ν˜•λ³€ν™˜(νƒ€μž…λ³€ν™˜)이 μΌμ–΄λ‚˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. λ˜ν•œ, μžλ™ ν˜•λ³€ν™˜(Promotion)은 μž‘μ€ λ©”λͺ¨λ¦¬ 크기의 데이터 νƒ€μž…μ„ 큰 λ©”λͺ¨λ¦¬ 크기의 데이터 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν–‰μœ„λ₯Ό λ§ν•©λ‹ˆλ‹€.

byte a = 10; // μ •μˆ˜ 10을 byte 데이터 νƒ€μž…μ˜ λ³€μˆ˜μΈ a에 μ €μž₯
int b = a;   // byte 데이터 νƒ€μž…μ˜ λ³€μˆ˜μΈ aλ₯Ό int 데이터 νƒ€μž…μ˜ λ³€μˆ˜μΈ b에저μž₯

μœ„μ— μž‘μ„±ν•œ μ˜ˆμ‹œμ²˜λŸΌ μž‘μ€ λ©”λͺ¨λ¦¬ 크기의 데이터 νƒ€μž…(byte 데이터 νƒ€μž…)μ—μ„œ 큰 λ©”λͺ¨λ¦¬ 크기의 데이터 νƒ€μž…(int 데이터 νƒ€μž…)에 값을 μ €μž₯ν•˜λ©΄, 별닀λ₯Έ 문법 없이 ν˜•λ³€ν™˜(νƒ€μž…λ³€ν™˜)이 μΌμ–΄λ‚©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν˜•λ³€ν™˜(νƒ€μž…λ³€ν™˜)을 "μžλ™ ν˜•λ³€ν™˜(Promotion)"이라고 ν•©λ‹ˆλ‹€

μžλ™ ν˜•λ³€ν™˜(Promotion)이 μ΄λ£¨μ–΄μ§€λŠ” μˆœμ„œλ₯Ό μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ³΄μ‹œλ©΄, long 데이터 νƒ€μž…μ˜ λ©”λͺ¨λ¦¬ ν¬κΈ°λŠ” 8byte이고, float 데이터 νƒ€μž…μ˜ λ©”λͺ¨λ¦¬ ν¬κΈ°λŠ” 4byte인데, long 데이터 νƒ€μž…μ—μ„œ float 데이터 νƒ€μž…μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜(Promotion)이 κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” ν‘œν˜„ν•  수 μžˆλŠ” κ°’μ˜ λ²”μœ„κ°€ floatκ°€ 더 크기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ£Όμ˜ν•  점은 λ©”λͺ¨λ¦¬ 크기가 큰 데이터 νƒ€μž…μ΄λΌλ„, νƒ€μž… λ²”μœ„λ₯Ό ν¬ν•¨ν•˜μ§€ λͺ»ν•œλ‹€λ©΄ μžλ™ ν˜•λ³€ν™˜(Promotion) 이 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

  • byte 데이터 νƒ€μž… -> char 데이터 νƒ€μž… μžλ™ ν˜•λ³€ν™˜ λΆˆκ°€
  • float 데이터 νƒ€μž… -> long 데이터 νƒ€μž… μžλ™ ν˜•λ³€ν™˜ λΆˆκ°€

Casting (κ°•μ œ ν˜•λ³€ν™˜, λͺ…μ‹œμ  ν˜•λ³€ν™˜)

νŠΉμ • 쑰건을 갖좔지 λͺ»ν–ˆμ§€λ§Œ, ν˜•λ³€ν™˜μ„ ν•˜κ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•˜λŠ” 것이 Casting (κ°•μ œ ν˜•λ³€ν™˜)μž…λ‹ˆλ‹€.

int intValue = 1;
byte byteValue = intValue;

μœ„μ˜ 경우 intValue에 μ €μž₯된 1μ΄λΌλŠ” 값은 byte 데이터 νƒ€μž…μ—λ„ μ €μž₯ κ°€λŠ₯ν•œ κ°’μž…λ‹ˆλ‹€. κ·Έλ ‡μ§€λ§Œ, μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” μ €μž₯될 κ°’ 1에 상관없이 int 데이터 νƒ€μž…μ΄ byte 데이터 νƒ€μž…λ³΄λ‹€ λ©”λͺ¨λ¦¬ 크기가 크기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 그림으둜 보자면,

이와 같은 그림이 λ‚˜μ˜΅λ‹ˆλ‹€. int 데이터 νƒ€μž…μ— μ €μž₯된 μ •μˆ˜ 1의 값은 μ‹€μ œ λ©”λͺ¨λ¦¬μ— μ €μž₯될 λ•Œ 00000000 00000000 00000000 00000001 의 값을 κ°€μ§‘λ‹ˆλ‹€. 이 값을 byte 데이터 νƒ€μž…μ— 끝에 1byte(00000001) μ˜μ—­λ§Œ λ„£μžλ‹ˆ μ•žμ—μžˆλŠ” 3byte (00000000 00000000 00000000) 값이 λ‚ μ•„κ°‘λ‹ˆλ‹€. 그림으둜 보면 μ΄λ ‡μŠ΅λ‹ˆλ‹€.

μ•žμ— 3byte의 곡간을 μ‚­μ œν•˜λŠ” μ‹œμ μ—μ„œ λ§Žμ€ 데이터가 λ‚ μ•„κ°€ 정상적인 값이 μ €μž₯될 수 없을 κ²ƒμž…λ‹ˆλ‹€. 이와 같이 λ©”λͺ¨λ¦¬ 크기가 큰 int 데이터 νƒ€μž…μ—μ„œ λ©”λͺ¨λ¦¬ 크기가 μž‘μ€ byte 데이터 νƒ€μž…μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜(Promotion)이 λœλ‹€λ©΄, 정상적이지 μ•Šμ€ 값이 λ‚˜μ˜¬ 수 있기 λ•Œλ¬Έμ— Javaμ—μ„œ μžλ™ ν˜•λ³€ν™˜(Promotion)을 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, μš°λ¦¬κ°€ ν˜•λ³€ν™˜ ν•˜λ €λŠ” μ •μˆ˜ 값은 1 μ΄λ―€λ‘œ byte 데이터 νƒ€μž… λ²”μœ„ μ•ˆμ— μΆ©λΆ„νžˆ λ“€μ–΄κ°€λŠ” κ°’μž…λ‹ˆλ‹€. 우린 κ·Έκ±Έ λ¨Έλ¦Ώμ†μœΌλ‘œ μ•Œκ³  있기 λ•Œλ¬Έμ— byte 데이터 νƒ€μž…μœΌλ‘œ λ³€ν™˜λœλ‹€ ν•˜λ”λΌλ„ 값이 정상적일 거라고 νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이럴 λ•Œ κ°•μ œ ν˜•λ³€ν™˜μ€ μ•„λž˜μ™€ 같이 ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

int intValue = 1;
byte byteValue = (byte) intValue;

ν˜•λ³€ν™˜ μ—°μ‚°

+, -, *, / κ³Ό 같은 기본적인 사칙연산은 같은 νƒ€μž…μ˜ ν”Όμ—°μ‚°μž κ°„μ—λ§Œ μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ„œλ‘œ λ‹€λ₯Έ 데이터 νƒ€μž…μ˜ ν”Όμ—°μ‚°μžκ°€ μžˆμ„ 경우 두 ν”Όμ—°μ‚°μž 쀑 크기가 큰 νƒ€μž…μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜(Promotion)된 ν›„ 연산이 μˆ˜ν–‰λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ int 데이터 νƒ€μž…μ˜ ν”Όμ—°μ‚°μžμ™€ double νƒ€μž…μ˜ ν”Όμ—°μ‚°μžλ₯Ό λ§μ…ˆν•˜λ©΄ int 데이터 νƒ€μž…μ˜ ν”Όμ—°μ‚°μžκ°€ double 데이터 νƒ€μž…μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜(Promotion)되고 연산이 μˆ˜ν–‰λ©λ‹ˆλ‹€. μ—°μ‚°μ˜ 결과도 double 데이터 νƒ€μž…μ΄ λ©λ‹ˆλ‹€.

int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; 
// intValue λ³€μˆ˜κ°’κ³Ό doubleValue λ³€μˆ˜κ°’μ„ λ”ν•΄μ„œ double νƒ€μž…μ˜ result λ³€μˆ˜μ— μ €μž₯

λ§Œμ•½ int 데이터 νƒ€μž…μ˜ μ—°μ‚° κ²°κ³Όλ₯Ό μ–»κ³  μ‹Άλ‹€λ©΄, κ°•μ œ ν˜•λ³€ν™˜(Casting)λ₯Ό 톡해 μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue;
// intValue λ³€μˆ˜κ°’κ³Ό doubleValueλ³€μˆ˜κ°’μ„ λ”ν•΄μ„œ int νƒ€μž…μ˜ result λ³€μˆ˜μ— μ €μž₯

Reference & Additional Resources