Programming/Java

F002 - Primitive Type

osean 2021. 5. 6. 22:04

κΈ°μ΄ˆλΆ€ν„° 닀지기

μ˜€λŠ˜μ€ 예슡 2일차. 책을 찬찬히 읽어보며 λ“œλ””μ–΄ κΈ°λ³Έ μžλ£Œν˜•κ³Ό μ°Έμ‘° μžλ£Œν˜•μ— λŒ€ν•΄ κ³΅λΆ€ν•˜κ²Œ 됐닀. 혼곡자둜 곡뢀할 λ•ŒλŠ” μ²˜μŒμ΄λ‹ˆκΉŒ λŒ€μΆ© ν›‘κ³  가야지! λΌλŠ” μƒκ°μœΌλ‘œ, λ°±μ„ μž₯λ‹˜ μŠ€ν„°λ””μ—μ„œλŠ” λ‚˜λ„ λ‚¨λ“€μ²˜λŸΌ 고급지고 λ©‹μ§€κ²Œ 정리해봐야지 ν•˜λŠ” μƒκ°μœΌλ‘œ μž„ν–ˆλ‹€. 결ꡭ에 λ‚΄κ²Œ λŒμ•„μ˜€λŠ” 것은 ν•˜λ‚˜λ„ μ—†μ—ˆλ‹€. byte λŠ” μ™œ μ΅œλŒ€κ°’μ΄ 255κ°€ μ•„λ‹ˆλΌ 127인지 μ΄μ œμ„œμ•Ό μ•Œκ²Œλœ μ…ˆμ΄λ‹€. λŠ¦κ²ŒλΌλ„ μ•Œκ²Œλ˜μ—ˆμœΌλ‹ˆ λ‹€ν–‰μ΄μ§€λ§Œ μžŠμ§€ μ•ŠκΈ° μœ„ν•΄ μ΄ν•΄ν•œ λ‚΄μš©μ„ 슀슀둜 정리해보렀고 ν•œλ‹€.


κΈ°λ³Έ μžλ£Œν˜•

κΈ°λ³Έ μžλ£Œν˜•μ—λŠ” 총 8 κ°€μ§€μ˜ μžλ£Œν˜•μ΄ μ‘΄μž¬ν•œλ‹€.

  • λ…Όλ¦¬ν˜•
    • boolean
  • μ •μˆ˜ν˜•
    • byte
    • char
    • short
    • int
    • long
  • μ†Œμˆ˜ν˜•
    • float
    • double

각 νƒ€μž…μ€ λ²”μœ„λ₯Ό κ°€μ§€κ²Œ λ˜λŠ”λ°, λ…Όλ¦¬ν˜•μΈ boolean νƒ€μž…μ€ μ°Έ ν˜Ήμ€ 거짓 쀑 ν•˜λ‚˜λ§Œ μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— 1bit의 크기λ₯Ό 가지며 λ‚˜λ¨Έμ§€ μžλ£Œν˜•μ€ 각 크기에 λ§žλŠ” byte 만큼의 크기λ₯Ό 가진닀.

근데 λ‚˜λŠ” 아직도 bitκ°€ 뭔지 byteκ°€ 뭔지 μ •ν™•νžˆ μžλ¦¬μž‘μ§€ λͺ»ν•œ 것 κ°™λ‹€. κ·Έλž˜μ„œ ν•œ 번 μ •λ¦¬ν•˜κ³  λ„˜μ–΄κ°€λ³΄λ €κ³  ν•œλ‹€.

λ°μ΄ν„°μ˜ λ‹¨μœ„

μ»΄ν“¨ν„°λŠ” 0κ³Ό 1 밖에 λͺ¨λ₯Έλ‹€. 즉, 컴퓨터가 ν•˜λŠ” λͺ¨λ“  ν–‰μœ„λŠ” 0κ³Ό 1둜만 이루어져 μžˆλ‹€. μ΄λŸ¬ν•œ μ»΄ν“¨ν„°μ˜ μ „κΈ° μ‹ ν˜Έλ₯Ό λ‹¨μœ„λ‘œ ν‘œν˜„ν•œ 것이 bit 이며, 0 ν˜Ήμ€ 1둜만 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. 이 λ•Œ, bitλŠ” μ•„λ‚ λ‘œκ·Έ μ‹ ν˜Έκ°€ μ•„λ‹Œ 디지털 μ‹ ν˜Έμ΄λ―€λ‘œ 0κ³Ό 1 사이에 μ‘΄μž¬ν•˜λŠ” μ–΄λ–€ 값도 κ°€μ§ˆ 수 μ—†λ‹€.

κ·Έλ ‡λ‹€λ©΄ 1bitκ°€ ν‘œν˜„ ν•  수 μžˆλŠ” μ’…λ₯˜λŠ” λͺ‡ 개일까? 1bitλŠ” 0 ν˜Ήμ€ 1 쀑 ν•˜λ‚˜λ§Œ κ°€μ§ˆ 수 μžˆμœΌλ―€λ‘œ 2κ°€μ§€μ˜ 경우의 μˆ˜κ°€ 생기며 μ΄λŠ” 2 의 값을 κ°€μ§ˆ 수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 더 λ‚˜μ•„κ°€μ„œ 2bitλŠ” λͺ‡ 개의 경우의 수λ₯Ό κ°€μ§ˆ 수 μžˆμ„κΉŒ? 1bitκ°€ 2개의 경우의 수λ₯Ό κ°€μ§€λŠ”λ°, μ΄λŸ¬ν•œ 1bitκ°€ 두 개 μ‘΄μž¬ν•˜λ―€λ‘œ 2 X 2의 경우의 수λ₯Ό 가진닀. 즉, 2bitλŠ” $2^2$의 값을 가진닀. 이λ₯Ό λ°”νƒ•μœΌλ‘œ 3bitλŠ” $2^3$(8), 4bitλŠ” $2^4$(16), 5bitλŠ” $2^5$(32), 6bitλŠ” $2^6$(64), 7bitλŠ” $2^7$(128), 8bitλŠ” $2^8$(256)의 값을 κ°€μ§ˆ 수 μžˆλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

λ‹€μ‹œ κΈ°λ³Έ μžλ£Œν˜•μœΌλ‘œ λŒμ•„μ™€μ„œ

그러면 Java의 μ •μˆ˜ν˜• 쀑 κ°–λŠ” 값이 κ°€μž₯ μž‘μ€ λ‹¨μœ„λŠ” byte λ‹¨μœ„μ΄λ©° char λ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ •μˆ˜ν˜•, μ†Œμˆ˜ν˜• μžλ£Œν˜•μ—λŠ” λΆ€ν˜Έκ°€ μ‘΄μž¬ν•œλ‹€. 근데 생각해보면 byte의 μ΅œλŒ€κ°’μ€ 127이 μ•„λ‹ˆλΌ 255μ—¬μ•Ό λ§žλŠ” 것 μ•„λ‹κΉŒ λΌλŠ” μ˜λ¬Έμ„ κ°€μ§ˆ 수 μžˆλ‹€. 이λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•žμ„œ μ–ΈκΈ‰ν•œ λΆ€ν˜Έμ™€ bitλ₯Ό 연관지어야 ν•œλ‹€.

1byteλŠ” 8개의 bit의 λ‚˜μ—΄μΈλ°, μ΄λ•Œ λΆ€ν˜ΈκΉŒμ§€ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ”˜κ°€μ— λͺ…μ‹œλ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 이 λ•Œ, μ„ λ°° κ°œλ°œμžλ“€μ€ μ΄λŸ¬ν•œ 8개둜 λ‚˜μ—΄ν•œ bit 쀑 κ°€μž₯ μ•žμ— μ‘΄μž¬ν•˜λŠ” bitκ°€ 0일 λ•ŒλŠ” μ–‘μˆ˜, 1일 λ•ŒλŠ” 음수λ₯Ό μ˜λ―Έν•˜λŠ” κ²ƒμœΌλ‘œ μ •ν•˜μžκ³  ν–ˆλ‹€.

λ•Œλ¬Έμ—, byteλŠ” 0λΆ€ν„° 127κΉŒμ§€ μ–‘μˆ˜ 값을 κ°€μ§ˆ 수 있고 -1λΆ€ν„° -128κΉŒμ§€ 음수 값을 κ°€μ§ˆ 수 μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ byte의 μ΅œλŒ€κ°’μ„ λ„˜μ–΄κ°€κ±°λ‚˜ μ΅œμ†Œκ°’μ— λͺ»λ―ΈμΉ˜λ©΄ μ–΄λ–»κ²Œ 될까? μ‹€μŠ΅μœΌλ‘œ μ•Œμ•„λ³΄μž.

μ½”λ“œ

package day_001;

public class PrimitiveTypes {
	public static void main(String[] args) {
		PrimitiveTypes types = new PrimitiveTypes();
		types.checkByte();
	}
	
	public void checkByte() {
		byte a = 127;
		a = (byte) (a + 1);
		byte b = -128;
		b = (byte) (b - 1);
		System.out.println("byte μ΅œλŒ€κ°’ : " + a);
		System.out.println("byte μ΅œμ†Œκ°’ : " + b);
	}
}

μ‹€ν–‰ κ²°κ³Ό

λΆ„λͺ… 지역 λ³€μˆ˜ aλŠ” byte의 μ΅œλŒ€κ°’μ„ λ„˜μ—ˆκ³ , 지역 λ³€μˆ˜ bλŠ” byte의 μ΅œμ†Œκ°’μ— λͺ»λ―ΈμΉœλ‹€. 그런데 결과둜 좜λ ₯된 값은 a = -128, b = 127이닀. μ™œ 이런 κ²°κ³Όκ°€ λ‚˜μ™”μ„κΉŒ?

지역 λ³€μˆ˜ a와 bλ₯Ό 2μ§„λ²•μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

지역 λ³€μˆ˜ 이진법
byte a 0111 1111
byte b 1000 0000

2μ§„μˆ˜λ‘œ λ³€ν™˜ν•œ 지역 λ³€μˆ˜ a에 1을 λ”ν•˜λ©΄ 1000 0000 이 λ˜λ©΄μ„œ -128의 2μ§„μˆ˜ 값이 λœλ‹€. λ°˜λŒ€λ‘œ 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•œ 지역 λ³€μˆ˜ b에 1을 λΉΌλ©΄ 0111 1111 이 λ˜λ©΄μ„œ 127의 2μ§„μˆ˜ 값이 λœλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ™œ μ΄λ ‡κ²Œ byteλ₯Ό λ§Œλ“€μ—ˆμ„κΉŒ? 이미지 νŒŒμΌμ„ μ €μž₯ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž. λ§Œμ•½ μ €μž₯ν•˜κ³ μž ν•˜λŠ” 이미지 파일이 int둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄ 숫자 ν•˜λ‚˜λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œ 32개의 0κ³Ό 1을 ν‘œμ‹œν•΄μ•Ό ν•˜λŠ” 곡간이 ν•„μš”ν•˜λ‹€. ν•˜μ§€λ§Œ byte둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄ 숫자λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ 곡간을 4λ°° μ ˆμ•½ ν•  수 μžˆλ‹€. κ·Έλž˜μ„œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ§Žμ€ μ˜μ—­μ—μ„œ byte 값을 μ‘°ν•©ν•΄ μ‚¬μš©ν•œλ‹€. κ·Έλž˜μ•Όλ§Œ 적은 곡간에 μ΅œλŒ€ν•œμ˜ λ‚΄μš©μ„ μ €μž₯ ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

'Programming > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

F004 - Reference Type  (0) 2021.05.08
F003 - Access Modifier  (0) 2021.05.06
F001 - psvm  (0) 2021.05.06
TIL_W02 | Variable, Primitive / Reference Type, Literal, Array  (0) 2020.12.15
TIL_W01 | JVM, Bytecode, JDK, JRE, JIT Compiler  (0) 2020.12.14