개발/Java

λ³€μˆ˜ 이야기(2) - μžλ°”μ˜ νƒ€μž…(μžλ£Œν˜•)

daramii 2022. 3. 17. 20:16

봄을 λ§žμ•„ λ°”κΏ”λ΄€μŠ΅λ‹ˆλ‹€ :)

 

μ•ˆλ…•ν•˜μ„Έμš”,

이번 μ‹œκ°„μ—λŠ” μžλ°”μ˜ 두가지 μžλ£Œν˜•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

ν•΄λ‹Ή λ‚΄μš©μ€ 'μžλ°”μ˜ μ‹ ' chapter4λ₯Ό 기초둜 μž‘μ„±ν–ˆμœΌλ©°,

이λ₯Ό 기반으둜 제 λ‚˜λ¦„μ˜ μš”μ•½ 정리λ₯Ό ν•œ κΈ€μž…λ‹ˆλ‹€.

 

μžμ„Έν•œ 곡뢀λ₯Ό μœ„ν•΄μ„œλŠ”

λ¨Όμ € 책을 읽고, μ •λ¦¬μš©μœΌλ‘œ μ°Έκ³ ν•˜μ‹œλ©΄ 베슀트일 것 κ°™μŠ΅λ‹ˆλ‹€!

 

λ³€μˆ˜μ˜ μ’…λ₯˜μ™€ 이름 μ •μ˜ κ·œμΉ™μ— λŒ€ν•œ λ‚΄μš©μ€ 이전 κ²Œμ‹œκΈ€μ„ ν™•μΈν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€ :)

 

 

https://mong-dev.tistory.com/10
 

λ³€μˆ˜ 이야기(1) - μžλ°”μ˜ 4가지 λ³€μˆ˜

μ•ˆλ…•ν•˜μ„Έμš”, λͺ½λ°λΈŒμž…λ‹ˆλ‹€. μ˜€λŠ˜μ€ μžλ°”μ˜ λ³€μˆ˜μ— λŒ€ν•΄ 이야기 ν•΄λ³ΌκΉŒν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ‚΄μš©μ€ 'μžλ°”μ˜ μ‹ ' chapter4λ₯Ό 기초둜 μž‘μ„±ν–ˆμœΌλ©°, 이λ₯Ό 기반으둜 제 λ‚˜λ¦„μ˜ μš”μ•½ 정리λ₯Ό ν•œ κΈ€μž…λ‹ˆλ‹€. μžμ„Έν•œ

mong-dev.tistory.com

 

 

 

μžλ°”μ˜ 두 가지 μžλ£Œν˜•


- κΈ°λ³Έ μžλ£Œν˜•(Primitive data type)
- μ°Έμ‘° μžλ£Œν˜•(Reference data type)

 

 

μžλ°”μ—λŠ” μœ„μ™€ 같이 두가지 μžλ£Œν˜•μ΄ μžˆμŠ΅λ‹ˆλ‹€. 이 λ‘κ°€μ§€μ˜ μ°¨μ΄λŠ” λ¬΄μ—‡μΌκΉŒμš”?

 

int a = 10; //κΈ°λ³Έ μžλ£Œν˜•

Calculator calc = new Calculator(); //μ°Έμ‘° μžλ£Œν˜•

 

κΈ°λ³Έ μžλ£Œν˜•μ€ intλ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œμ— κ·Έλƒ₯ 값을 λ°”λ‘œ 적어 μ£Όμ—ˆκ³ , Calculatorλ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œμ—λŠ” newλΌλŠ” μ˜ˆμ•½μ–΄λ‘œ 생성을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 

 

- new둜 μ΄ˆκΈ°ν™” ν•΄μ•Όλ§Œ ν•˜λŠ” 것, μΆ”κ°€λ‘œ λ§Œλ“€ 수 μžˆλ‹€. : μ°Έμ‘° μžλ£Œν˜•
- λ°”λ‘œ μ΄ˆκΈ°ν™”κ°€ κ°€λŠ₯ν•œ 것, μΆ”κ°€λ‘œ λ§Œλ“€ 수 μ—†λ‹€. : κΈ°λ³Έ μžλ£Œν˜•

*  λ‹€λ§Œ, String의 κ²½μš°λŠ” μ°Έμ‘° μžλ£Œν˜•μ΄μ§€λ§Œ,  μ˜ˆμ™Έμ μœΌλ‘œ newλ₯Ό μ‚¬μš©ν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
ex)
String bookName1 = "God Of Java";
String bookName1 = new String("God Of Java");

 

 

κ·Έλ ‡λ‹€λ©΄, μžλ°”μ—μ„œ μ •ν•΄μ Έ μžˆλŠ” κΈ°λ³Έ μžλ£Œν˜•μ— λŒ€ν•΄ μ’€ 더 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή λ‚΄μš©μ€ 정리 μš”μ•½λ³Έμ΄λ―€λ‘œ, ν’€μ–΄ μ„€λͺ…ν•˜κΈ°λ³΄λ‹€ 결둠을 ν•œ λˆˆμ— 보기 쉽도둝 ν‘œλ‘œ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

 

 

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


ν˜•νƒœ μ’…λ₯˜ λ²”μœ„ νŠΉμ§• κΈ°λ³Έκ°’
μ •μˆ˜ν˜• byte -128 ~ 127
(-2⁷ ~ 2⁷-1)
- 적은 곡간에 보닀 λ§Žμ€ λ‚΄μš©μ„ μ €μž₯ν•˜κΈ° μœ„ν•¨ 0
short -32,768 ~ 32,767
(-2¹β΅ ~ 2¹β΅-1)
- byte둜 ν‘œν˜„ν•˜κΈ°λŠ” λΆ€μ‘±ν•˜κ³ , int둜 ν‘œν˜„ν•˜κΈ°μ—λŠ” λ„ˆλ¬΄ 곡간 λ‚­λΉ„κ°€ μ‹¬ν•˜λ‹€κ³  생각 ν•  λ•Œ μ‚¬μš©ν•œλ‹€. 0
int -2,147,483,648 ~ 2,147,483,647
(-2³¹ ~ 2³¹-1)
- 주둜 많이 μ‚¬μš©ν•˜λŠ” μ •μˆ˜ν˜• 0
long -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
(-2⁢³ ~ 2⁢³-1)
- int만으둜 λΆ€μ‘±ν•  λ•Œ μ‚¬μš©
- μ„ μ–Έν•  λ•Œ λ˜λ„λ‘ L을 λΆ™μ—¬μ£ΌλŠ” 것이 μ’‹λ‹€. 그렇지 μ•ŠμœΌλ©΄ κ·Έλƒ₯ int둜 μΈμ‹λœλ‹€.
0
char (캐릭터) 0('\u0000') ~ 65,535('\uffff')
(0 ~ 2¹βΆ-1)
- μœ μΌν•œ unsigned(λΆ€ν˜Έκ°€ μ—†λŠ”)
- μ •μ˜λ₯Ό ν•  λ•Œ '(ν™‘λ”°μ˜΄ν‘œ)λ₯Ό μ‚¬μš©ν•œλ‹€.
ex) char - 'a';
'\u0000'
μ†Œμˆ˜ν˜• float - μ†Œμˆ˜μ μ„ μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ
- λŒ€λŸ‰μœΌλ‘œ μ†Œμˆ˜μ  μžλ¦¬μˆ˜κ°€ 적은 데이터λ₯Ό μ €μž₯ν•  경우
- λΆ€ν˜Έ(1자리) + μ§€μˆ˜(8자리) + κ°€μˆ˜(23자리) = 32λΉ„νŠΈ
0.0
double - - μ†Œμˆ˜μ μ„ μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ
- 일반적으둜 많이 μ‚¬μš©
- λΆ€ν˜Έ(1자리) + μ§€μˆ˜(11자리) + κ°€μˆ˜(52자리) = 64λΉ„νŠΈ
0.0
기타 boolean true, false   false

 

λ²”μœ„μ— λ‚˜μ˜€λŠ” μˆ«μžλ“€μ΄ λ³΅μž‘ν•΄ 보일 수 μžˆμ§€λ§Œ, 0κ³Ό 1둜 λ‚˜νƒ€λ‚΄λŠ” 2진법이 μ»΄ν“¨ν„°μ—μ„œ 숫자λ₯Ό ν‘œν˜„ν•  λ•Œ κ°€μž₯ μ μ ˆν•˜λ‹€λŠ” 사싀을 κ³ λ €ν•΄λ³Έλ‹€λ©΄ μ‰½κ²Œ 이해λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λͺ¨λ“  μžλ°”μ˜ 숫자 νƒ€μž…λ“€μ΄ 2의 배수둜 λ²”μœ„κ°€ μ •ν•΄μ§€λŠ” κ²ƒμž…λ‹ˆλ‹€. 

 

char ν˜•νƒœλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ§€μˆ˜ λΆ€λΆ„μ˜ 숫자만 λ³Έλ‹€λ©΄, 7, 15, 31, 63을 λ³Ό 수 μžˆλŠ”λ°, μ΄λŠ” 2의 n제곱 - 1 둜 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 n은 3λΆ€ν„° μ‹œμž‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 즉, 7(8-1), 15(=16-1), 31(=32-1), 63(64-1)μž…λ‹ˆλ‹€. "각 νƒ€μž…μ΄ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 숫자의 λ²”μœ„κ°€ 2λ°°μ”© μ¦κ°€λœλ‹€."κ³  κΈ°μ–΅ν•˜λ©΄ λ˜κ² μŠ΅λ‹ˆλ‹€.

 

byteλŠ” 8λΉ„νŠΈμ˜ λΆ€ν˜Έκ°€ μžˆλŠ”(signed) νƒ€μž…μž…λ‹ˆλ‹€. 8λΉ„νŠΈλΌλŠ” 것은 0κ³Ό 1둜 ν‘œν˜„ν•  수 μžˆλŠ” 곡간이 8κ°œκ°€ μžˆλ‹€λŠ” 말이고, 1λ°”μ΄νŠΈλΌκ³  λΆ€λ₯΄κΈ°λ„ν•©λ‹ˆλ‹€.

 

μž μ‹œ byte의 λ²”μœ„λ₯Ό 보자면, -128 ~ 127라고 λ‚˜μ™€μžˆλŠ”κ²ƒμ„ λ³Ό 수 μžˆλŠ”λ° μ—¬κΈ°μ„œ ν•œκ°€μ§€ μ˜λ¬Έμ μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

그림을 톡해 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

2⁷ 2⁢ 2⁡ 2⁴ 2³ 2² 2¹ 2⁰
1 1 1 1 1 1 1 1

각 곡간이 λͺ¨λ‘ 1둜 μ±„μ›Œμ§€κ²Œ λœλ‹€λ©΄, 2⁷X1 + 2⁢X1 + 2⁡X1 + 2⁴X1 + 2³X1 + 2²X1 + 2¹X1 + 2⁰X0 = 255 λΌλŠ” μˆ«μžκ°€ λ‚˜μ˜€λŠ”λ°, byte의 λ²”μœ„λŠ” λ°˜ν† λ§‰μ΄ λ‚˜ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μ•„κΉŒ ν•˜λ˜ μ΄μ•ΌκΈ°λ‘œ λŒμ•„κ°€μžλ©΄, μžλ°”μ˜ κΈ°λ³Έ μžλ£Œν˜•μ— ν¬ν•¨λœ μˆ«μžλ“€μ€ charλ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ λΆ€ν˜Έκ°€ μžˆλŠ” signed νƒ€μž…λ‹ˆλ‹€. byte의 곡간은 8개인데, μŒμˆ˜μ™€ μ–‘μˆ˜λ₯Ό μ–΄λ–»κ²Œ ν‘œν˜„μ„ ν•΄μ•Όν•˜λŠ”μ§€μ— λŒ€ν•œ 고민의 닡이 μ—¬κΈ° μžˆμŠ΅λ‹ˆλ‹€. "맨 μ•žμ— μžˆλŠ” 값이 0이면 μ–‘μˆ˜, 1이면 음수"둜 μ •ν•œ κ²ƒμž…λ‹ˆλ‹€. 즉, κ°€μž₯ μ™Όμͺ½μ˜ 곡간은 2⁷이 μ•„λ‹ˆλΌ κ·Έλƒ₯, μŒμˆ˜μ™€ μ–‘μˆ˜λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ κ³΅κ°„μž…λ‹ˆλ‹€.

 

λ‹€μ‹œ λ§ν•΄μ„œ, 2⁢X1 + 2⁡X1 + 2⁴X1 + 2³X1 + 2²X1 + 2¹X1 + 2⁰X0 = 127 이 λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

그런데 μ™œ μŒμˆ˜λŠ” -128κΉŒμ§€μΈκ°€? λΌλŠ” 의문이 μžμ—°μŠ€λŸ½κ²Œ λ“€κ²Œ λ©λ‹ˆλ‹€. 

 

  2⁢ 2⁡ 2⁴ 2³ 2² 2¹ 2⁰
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

 

μ§€κΈˆκΉŒμ§€ μ‚΄νŽ΄λ³Έ 바에 μ˜ν•˜λ©΄, λ‘˜ λ‹€ 값이 0이라고 생각할 κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ 밑에 μžˆλŠ” 맨 μ•žμ—λ§Œ 1인 byte의 값은 0이 μ•„λ‹ˆλΌ -128μž…λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ byte, short, int, long νƒ€μž…μ˜ κ°€μž₯ μ•žμ˜ κ°’λ§Œ 1인 것은 ν•΄λ‹Ή νƒ€μž…μ˜ μ΅œμ†Œκ°’μ΄κ³ , 두 번째 κ°’λΆ€ν„° 1둜 μ±„μ›Œμ Έ μžˆλŠ” 것은 ν•΄λ‹Ή νƒ€μž…μ˜ μ΅œλŒ€κ°’μ΄ λ©λ‹ˆλ‹€. 그리고, μ ˆλŒ€κ°’λ§ŒμœΌλ‘œ 따지면, μ΅œμ†Œκ°’μ˜ μ ˆλŒ€κ°’μ΄ μ΅œλŒ€κ°’μ˜ μ ˆλŒ€κ°’λ³΄λ‹€ λ”± 1이 더 ν½λ‹ˆλ‹€. (μ΄λŸ¬ν•œ μ΄μœ λŠ” λ’€μ—μ„œ λΉ„νŠΈ μ—°μ‚°μžλ₯Ό 배울 λ•Œ λ‹€μ‹œ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.)

 

float와 double의 λ²”μœ„λ₯Ό μ•ŒκΈ° μœ„ν•΄μ„œλŠ” λ³΅μž‘ν•œ μˆ˜ν•™ 곡식을 μ•Œμ•„μ•Όν•˜λŠ”λ°, μ΄λŠ” μƒλž΅ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 

λ‹€λ§Œ floatλ‚˜ double 같은 κ²½μš°λŠ”, 돈 계산과 같이 정확성을 μš”κ΅¬ν•˜λŠ” μƒν™©μ—μ„œ μ‚¬μš©ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€. μ΄λŠ” 각각 32λΉ„νŠΈμ™€ 64λΉ„νŠΈλ‘œ μ œκ³΅ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό λ„˜μ–΄μ„€ 경우, κ·Έ κ°’μ˜ 정확성을 보μž₯ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이런 κ²½μš°μ—λŠ” java.math.BigDecimalμ΄λΌλŠ” 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. (λ‚˜μ€‘μ— λ‹€λ£° κΈ°νšŒκ°€ 있으면 λ‹€λ€„λ³΄κ² μŠ΅λ‹ˆλ‹€ :) )

 

λ§ˆμ§€λ§‰μœΌλ‘œ, char에 λŒ€ν•΄ λͺ‡κ°€μ§€λ§Œ 이야기 ν•˜κ³  λ§ˆλ¬΄λ¦¬ν•˜κ³ μž ν•©λ‹ˆλ‹€.

 

char의 값을 μ§€μ •ν•˜λŠ” 방법은 λ‹€μŒκ³Ό 같이 3κ°€μ§€μž…λ‹ˆλ‹€.

 

- ν™‘λ”°μ˜΄ν‘œ μ•ˆμ— 직접 'a'와 같이 κ·Έ 값을 λ„£λŠ”λ‹€.
- '\u0000'κ³Ό 같이 ν™‘λ”°μ˜΄ν‘œ μ•ˆμ— \u와 16μ§„μˆ˜ 값을 λ„£λŠ”λ‹€.
- ν•΄λ‹Ή κ°’μ˜ μœ λ‹ˆμ½”λ“œ 번호λ₯Ό μ§€μ •ν•œλ‹€.(단, κ·Έ λ²ˆν˜ΈλŠ” char λ²”μœ„ λ‚΄μ˜ 숫자, 즉 0!65,636 사이여야 ν•œλ‹€.)

 

 

 

Quiz


λ‹€μŒ 쀑, 잘λͺ» μ •μ˜ν•œ charλ₯Ό μ°Ύμ•„λ³΄μ„Έμš”.

 

1. char a = 'a';
2. char b = 'ab';
3. char c = 'κ°€';
4. char d = '\u97';
5. char e = ''\u1188;
6. char f = -1;
7. char g = 999;

 

 

Answer


1. char a = 'a'; O
2. char b = 'ab'; X char의 ν™‘λ”°μ˜΄ν‘œ μ•ˆμ— \u둜 μ‹œμž‘ν•˜μ§€ μ•ŠλŠ” 이상 두 개의 λ¬ΈμžλŠ” 올 수 μ—†λ‹€.
3. char c = 'κ°€'; O ν•œκΈ€μ€ λŒ€λΆ€λΆ„ 2λ°”μ΄νŠΈλ‘œ ν‘œν˜„ν•˜λ©°, μœ λ‹ˆμ½”λ“œμ— ν¬ν•¨λ˜μ–΄ μžˆλ‹€. μ‚¬μš©ν•  수 μžˆλ‹€. ('κ°€' -> 44032)
4. char d = '\u97'; X \u λ’€μ—λŠ” λ°˜λ“œμ‹œ 4개의 16μ§„μˆ˜ 값이 μ™€μ•Όλ§Œ ν•œλ‹€. 
5. char e = ''\u1188; O
6. char f = -1; X charλŠ” μžλ°”μ˜ μ •μˆ˜ν˜• 쀑 μœ μΌν•œ λΆ€ν˜Έκ°€ μ—†λŠ”(unsigned) 값이닀.
7. char g = 999; O

 

 

κ°μ‚¬ν•©λ‹ˆλ‹€ :)