[Java] ์ž๋ฃŒํ˜•(Data Type), ํ˜• ๋ณ€ํ™˜

๐Ÿ”น ์ž๋ฃŒํ˜•(Data Type)์ด๋ž€ ?

์ž๋ฃŒํ˜•(๋ฐ์ดํ„ฐ ํƒ€์ž…)์€ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜์™€ ํฌ๊ธฐ, ์—ฐ์‚ฐ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ์š”์†Œ์ด๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ช…์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

โ—ฝ  ์ž๋ฃŒํ˜•์˜ ๋ถ„๋ฅ˜

Java์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒํ˜•์€ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(Primitive Data Type)๊ณผ ์ฐธ์กฐ ์ž๋ฃŒํ˜•(Reference Data Type)์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(Primitive Data Type) : ์‹ค์ œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒํ˜•
  • ์ฐธ์กฐ ์ž๋ฃŒํ˜•(Reference Data Type) : ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒํ˜•

์˜ˆ๋ฅผ ๋“ค์–ด, int ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ์ •์ˆซ๊ฐ’์„ ์ง์ ‘ ์ €์žฅํ•˜์ง€๋งŒ, String ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ๋ฌธ์ž์—ด์ด ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

๐Ÿ” ๋ณ€์ˆ˜(Variable)๋ž€ ?

๋ณ€์ˆ˜(Variable)๋ž€ ๋ฐ์ดํ„ฐ(Data)๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค.

๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ’(value)์ด๋ผ ํ•œ๋‹ค.

[ ๋ณ€์ˆ˜์˜ ์ค‘์š”ํ•œ ํŠน์ง• ]

  • ๋ณ€์ˆ˜์˜ ์ด๋ฆ„(name)๊ณผ ์ž๋ฃŒํ˜•(type)์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’(value)์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”น๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(Primitive Data Type)

์ž๋ฐ”์—์„œ๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ 8๊ฐ€์ง€ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ด ์ œ๊ณต๋œ๋‹ค.

๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์€ ์‹ค์ œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ž๋ฃŒํ˜•์œผ๋กœ, ๊ธฐ๋ณธ ๊ฐ’์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— null์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

๐Ÿ“Œ ํŠน์ง•

  • Heap์ด ์•„๋‹Œ Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ (๋‹จ, static ๋˜๋Š” final ์ƒ์ˆ˜๋Š” Method Area ์ €์žฅ ๊ฐ€๋Šฅ)
  • ์ฒซ ๊ธ€์ž๊ฐ€ ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘
  • Wrapper ํด๋ž˜์Šค(Integer, Double ๋“ฑ)์™€ ๋‹ค๋ฅด๊ฒŒ null์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ

 

๐Ÿ”ธ ์ •์ˆ˜ ์ž๋ฃŒํ˜•

์ž๋ฐ”์˜ ์ •์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒํ˜•์€ ๋Œ€ํ‘œ์ ์œผ๋กœ int, long์ด ์žˆ๋‹ค.

byte, short๋„ ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

   ์ •์ˆ˜ํ˜• ํƒ€์ž…    ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ    ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„ ๋ฒ”์œ„
   byte    1 byte    -128 ~ 127
   short    2 byte    -215 ~ (215 - 1)
   -32,768 ~ 32,767
   int    4 byte    -231 ~ (231 - 1)
   -2,147,483,648 ~ 2,147,483,647
   long    8 byte    -263 ~ (263 - 1)
   -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

[ ์˜ˆ์ œ ]

int age = 20;
long countOfStr = 8764827384923849L;

๐Ÿšจ ์ฃผ์˜

long ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•  ๋•Œ, ๊ฐ’์ด int ์ž๋ฃŒํ˜•์˜ ์ตœ๋Œ“๊ฐ’(2147483647)์„ ์ดˆ๊ณผํ•˜๋ฉด L ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ˆ„๋ฝํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์†Œ๋ฌธ์ž l๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ˆซ์ž 1๊ณผ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€๋ฌธ์ž L ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

 

โ—ฝ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Overflow) / ์–ธ๋”ํ”Œ๋กœ์šฐ(Underflow)

์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ด๋‹น ์ž๋ฃŒํ˜•์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ/์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ์ž๋ฃŒํ˜•์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Overflow) ๋˜๋Š” ์–ธ๋”ํ”Œ๋กœ์šฐ(Underflow)๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ด ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(overflow) : ์ž๋ฃŒํ˜•์˜ ์ตœ๋Œ“๊ฐ’์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ๋ฐœ์ƒ
  • ์–ธ๋”ํ”Œ๋กœ์šฐ(underflow) : ์ž๋ฃŒํ˜•์˜ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ๋ฐœ์ƒ

[ ์˜ˆ์ œ ]

byte max = 127;
byte min = -128;

System.out.println((byte)(max + 1)); // -128 (Overflow ๋ฐœ์ƒ)
System.out.println((byte)(min - 1)); // 127 (Underflow ๋ฐœ์ƒ)

์ž๋ฐ”์—์„œ byte ํƒ€์ž…์€ -128 ~ 127 ๋ฒ”์œ„์˜ ์ •์ˆ˜๋งŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋˜๋Š” ์–ธ๋”ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฐ’์ด ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.

 

โ—ฝ ์–ธ๋” ์Šค์ฝ”์–ด ํ‘œ๊ธฐ๋ฒ• (Underscore ํ‘œ๊ธฐ๋ฒ•)

์–ธ๋” ์Šค์ฝ”์–ด ํ‘œ๊ธฐ๋ฒ•์€ JDK 7๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ,  ํฐ ์ˆซ์ž์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ฝค๋งˆ ๋Œ€์‹  _(๋ฐ‘์ค„)๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

int cost = 1_000_000_000; // 1000000000

์–ธ๋” ์Šค์ฝ”์–ด _๋Š” ๋‹จ์ˆœํžˆ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ, ์ˆซ์ž์˜ ๊ฐ’์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

โ—ฝ 2์ง„์ˆ˜ / 8์ง„์ˆ˜ / 16์ง„์ˆ˜ ํ‘œ๊ธฐ๋ฒ•

์ž๋ฐ”์—์„œ 2์ง„์ˆ˜, 8์ง„์ˆ˜, 16์ง„์ˆ˜๋ฅผ ํŠน์ • ๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ๋Š” int ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ๋œ๋‹ค.

   ์ง„์ˆ˜    ์ ‘๋‘์‚ฌ    ์˜ˆ์ œ
   2์ง„์ˆ˜ (Binary)    0b    int binary = 0b101;
   8์ง„์ˆ˜ (Octal)    0    int octal = 023;
   16์ง„์ˆ˜ (Hexadecimal)    0x    int hex = 0xC;

[ ์˜ˆ์ œ ]

int binary = 0b101;    // 2์ง„์ˆ˜: 5
int octal = 023;       // 8์ง„์ˆ˜: 19
int hex = 0xC;         // 16์ง„์ˆ˜: 12
  • 2์ง„์ˆ˜๋Š” 0b(์ˆซ์ž 0 + ์•ŒํŒŒ๋ฒณ b)๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • 8์ง„์ˆ˜๋Š” 0(์ˆซ์ž 0)์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • 16์ง„์ˆ˜๋Š” 0x(์ˆซ์ž 0 + ์•ŒํŒŒ๋ฒณ x)๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

 

๐Ÿ”ธ ์‹ค์ˆ˜ ์ž๋ฃŒํ˜•

์ž๋ฐ”์˜ ์‹ค์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒํ˜•์€ ๋Œ€ํ‘œ์ ์œผ๋กœ  float๊ณผ double์ด ์žˆ๋‹ค.

๊ณผ๊ฑฐ์—๋Š” float์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€์™€ ์—ฐ์‚ฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์œผ๋กœ ์ธํ•ด ํ˜„์žฌ๋Š” double์ด ๋” ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ž๋ฐ”์˜ ๊ธฐ๋ณธ ์‹ค์ˆ˜ํ˜• ํƒ€์ž…์€ double์ด๋‹ค.

   ์‹ค์ˆ˜ํ˜• ํƒ€์ž…    ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ    ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฒ”์œ„    ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž… ์ ‘๋ฏธ์‚ฌ
   float    4 byte    (1.4 × 10โปโดโต) ~ (3.4 × 10³โธ)    F ๋˜๋Š” f
   double    8 byte    (4.9 × 10โป³²โด) ~ (1.7 × 10³โฐโธ)    D ๋˜๋Š” d (์ƒ๋žต ๊ฐ€๋Šฅ)

[ ์˜ˆ์ œ ]

float pi = 3.14F;
double morePi = 3.14159265358979323846;

๐Ÿšจ ์ฃผ์˜

float์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, F ๋˜๋Š” f ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

 

โ—ฝ ์‹ค์ˆ˜ ์—ฐ์‚ฐ ์˜ค์ฐจ

์ปดํ“จํ„ฐ๋Š” ์‹ค์ˆ˜๋ฅผ 2์ง„์ˆ˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์ผ๋ถ€ ์‹ค์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์–ด ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๊ทผ์‚ฟ๊ฐ’์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐฉ์‹์€ ๊ณ ์ • ์†Œ์ˆ˜์  ๋ฐฉ์‹์— ๋น„ํ•ด ํฐ ๋ฒ”์œ„์˜ ์‹ค์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งค์šฐ ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์‹ค์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

[ ์˜ˆ์ œ ]

double value1 = 12.23;
double value2 = 34.45;

// ๊ธฐ๋Œ€๊ฐ’: 46.68
System.out.println(value1 + value2); // 46.68000000000001

์œ„ ์˜ˆ์ œ์—์„œ ๋‘ ์‹ค์ˆ˜๋ฅผ ๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ธฐ๋Œ€๊ฐ’์ธ 46.68๊ณผ ์•ฝ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฐฉ์‹์˜ ๊ทผ์‚ฟ๊ฐ’ ์ €์žฅ์œผ๋กœ ์ธํ•œ ์—ฐ์‚ฐ ์˜ค์ฐจ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜ ์—ฐ์‚ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

โ—ฝ ๋ถ€๋™์†Œ์ˆ˜์  ์˜ค์ฐจ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์ •์ˆ˜ํ˜• ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ

์‹ค์ˆ˜๋ฅผ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์—ฐ์‚ฐ ํ›„ ๋‹ค์‹œ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ด๋‹ค.

double a = 1000.0;
double b = 999.9;

// ์˜ค์ฐจ ๋ฐœ์ƒ
System.out.println(a - b); // 0.10000000000002274

// ์ •์ˆ˜ํ˜• ๋ณ€ํ™˜ ํ›„ ์—ฐ์‚ฐ
long a2 = (long)(a * 10);
long b2 = (long)(b * 10);
double result = (a2 - b2) / 10.0;
System.out.println(result); // 0.1

์†Œ์ˆ˜์ ์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์—ฐ์‚ฐํ•˜๋ฉด, ์˜ค์ฐจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ BigDecimal ํด๋ž˜์Šค ์‚ฌ์šฉ

์ •ํ™•ํ•œ ์†Œ์ˆ˜ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ BigDecimal์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

์ด๋•Œ, BigDecimal.valueOf() ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal bigNumber1 = BigDecimal.valueOf(1000.0);
        BigDecimal bigNumber2 = BigDecimal.valueOf(999.9);
        BigDecimal result2 = bigNumber1.subtract(bigNumber2);

        System.out.println(result2); // 0.1
    }
}

โœ… BigDecimal.valueOf(double)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ •ํ™•ํ•œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ, ๊ฐ€๋…์„ฑ๊ณผ ์•ˆ์ „์„ฑ ๋ฉด์—์„œ new BigDecimal(String)๋ณด๋‹ค ์œ ๋ฆฌํ•˜๋‹ค.

๐Ÿ“ new BigDecimal(double) ๋ฐฉ์‹์€ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค.

 

โ—ฝ ์‹ค์ˆ˜์˜ ์œ ํšจ ์ž๋ฆฟ์ˆ˜(์ •๋ฐ€๋„)

์ž๋ฐ”์—์„œ๋Š” ์‹ค์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ, ๋ถ€๋™์†Œ์ˆ˜์  ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์‹ค์ˆ˜ ํƒ€์ž…๋ณ„๋กœ ์œ ํšจ ์ž๋ฆฟ์ˆ˜์˜ ์ œํ•œ์ด ์กด์žฌํ•œ๋‹ค.

์œ ํšจ ์ž๋ฆฟ์ˆ˜(Precision)๋ž€, ์‹ค์ˆ˜๊ฐ€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ์ž๋ฆฟ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์ˆ˜๋ถ€ ํฌ๊ธฐ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค.

   ์‹ค์ˆ˜ํ˜• ํƒ€์ž…    ์ง€์ˆ˜์˜ ๊ธธ์ด    ๊ฐ€์ˆ˜์˜ ๊ธธ์ด    ์œ ํšจ ์ž๋ฆฟ์ˆ˜
   float    8 bit    23 bit    ์•ฝ 6~7์ž๋ฆฌ ์ •ํ™•๋„
   double    11 bit    52 bit    ์•ฝ 15~16์ž๋ฆฌ ์ •ํ™•๋„

์œ„ ํ‘œ์™€ ๊ฐ™์ด, double์€ float๋ณด๋‹ค ๊ฐ€์ˆ˜๋ถ€(bit ์ˆ˜)๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋†’์€ ์ •๋ฐ€๋„๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ฆ‰, ์œ ํšจ ์ž๋ฆฟ์ˆ˜๋Š” ์‹ค์ˆ˜์˜ ์ •๋ฐ€๋„๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

[ ์˜ˆ์ œ ]

// ์งง์€ ์‹ค์ˆ˜
double var1 = 3.14;
float var2 = 3.14f;

System.out.println("var1 : " + var1); // var1 : 3.14
System.out.println("var2 : " + var2); // var2 : 3.14


// ๊ธด ์‹ค์ˆ˜ (์ •๋ฐ€๋„ ํ…Œ์ŠคํŠธ)
double var3 = 3.14159265358979;
float var4 = 3.14159265358979f;

System.out.println("var3 : " + var3); // var3 : 3.14159265358979 - ์ •ํ™•ํžˆ ํ‘œํ˜„
System.out.println("var4 : " + var4); // var4 : 3.1415927 - (์œ ํšจ ์ž๋ฆฌ ์ œํ•œ์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋จ)

๐Ÿ’ก ์‹ค์ˆ˜ํ˜•์˜ ์„ ํƒ ๊ธฐ์ค€

๋งŒ์•ฝ ์‹ค์ˆ˜์˜ ์ •๋ฐ€๋„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด, ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ double๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

double ํƒ€์ž…์€ float ํƒ€์ž…๋ณด๋‹ค ์•ฝ 2๋ฐฐ ๋†’์€ ์ •๋ฐ€๋„(์œ ํšจ ์ž๋ฆฟ์ˆ˜ 15~16์ž๋ฆฌ)๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ๊ณผ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ float ํƒ€์ž…์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ •๋ฐ€๋„๊ฐ€  ๋‚ฎ์•„ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

โ—ฝ ์‹ค์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ / ์–ธ๋”ํ”Œ๋กœ์šฐ

[ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Overflow) ]

์‹ค์ˆ˜ํ˜• ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ตœ๋Œ“๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Overflow)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ •์ˆ˜ํ˜•๊ณผ ๋‹ฌ๋ฆฌ, ์‹ค์ˆ˜ํ˜•์˜ ๊ฒฝ์šฐ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ’์ด ๋ฌดํ•œ๋Œ€ (Infinity)๋กœ ์„ค์ •๋œ๋‹ค.

double max = Double.MAX_VALUE;
System.out.println(max * 2); // Infinity (์˜ค๋ฒ„ํ”Œ๋กœ์šฐ)

[ ์–ธ๋”ํ”Œ๋กœ์šฐ(Underflow) ]

์‹ค์ˆ˜ํ˜• ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ์ตœ์†Ÿ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋˜๋Š” ๊ฒฝ์šฐ ์–ธ๋”ํ”Œ๋กœ์šฐ(Underflow)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿฐ ๊ฐ’์ด ๋ฐœ์ƒํ•˜๋ฉด 0์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผ(RTZ, Rounded to Zero) ๋˜๊ฑฐ๋‚˜, ์„œ๋ธŒ ๋…ธ๋ฉ€(subnormal) ๊ฐ’์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค. (๋Œ€๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์—์„œ 0์œผ๋กœ ์ฒ˜๋ฆฌ๋จ)

double min = Double.MIN_VALUE;
System.out.println(min / 2); // 0.0 (์–ธ๋”ํ”Œ๋กœ์šฐ)

 

โ—ฝ ์ง€์ˆ˜(e) ํ‘œ๊ธฐ๋ฒ•

์ง€์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์€ ์•„์ฃผ ํฐ ์ˆซ์ž ๋˜๋Š” ์ž‘์€ ์ˆซ์ž๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ณผํ•™์  ํ‘œ๊ธฐ๋ฒ•(scientific notation)์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” e(๋˜๋Š” E)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

[ ์˜ˆ์ œ ]

double d1 = 1.234e2;  // 1.234 × 10^2  → 123.4
double d2 = 1.7e+3;   // 1.7 × 10^3   → 1700.0
double d3 = 1.7e-3;   // 1.7 × 10^-3  → 0.0017

System.out.println(d1); // 123.4
System.out.println(d2); // 1700.0
System.out.println(d3); // 0.0017

 

๐Ÿ”ธ ๋…ผ๋ฆฌ ์ž๋ฃŒํ˜•

๋…ผ๋ฆฌํ˜• ์ž๋ฃŒํ˜•์€ ์ฐธ(true) ๋˜๋Š” ๊ฑฐ์ง“(false)์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ž๋ฃŒํ˜•์„ ์˜๋ฏธํ•œ๋‹ค.

์ด ์ž๋ฃŒํ˜•์€ ์ฃผ๋กœ ์กฐ๊ฑด๋ฌธ(if, while ๋“ฑ)์—์„œ ์กฐ๊ฑด์„ ํŒ๋ณ„ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

   ๋…ผ๋ฆฌํ˜• ํƒ€์ž…    ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ    ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„ ๋ฒ”์œ„
   boolean    1 byte    true, false

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„๊ต ์—ฐ์‚ฐ (>, <, ==, !=)๊ณผ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ(&&, ||, !)์˜ ๊ฒฐ๊ด๊ฐ’์ด boolean ๋ณ€์ˆ˜์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.

[ ์˜ˆ์ œ ]

boolean result1 = (2 > 1);           // true
boolean result2 = (1 == 2);          // false
boolean result3 = (3 % 2 == 1);      // true (3์„ 2๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋Š” 1์ด๋ฏ€๋กœ ์ฐธ)
boolean result4 = ("3".equals("2")); // false (๋ฌธ์ž์—ด ๋น„๊ต)

[ ์กฐ๊ฑด๋ฌธ ์˜ˆ์ œ ]

int base = 180;
int height = 185;

if (height > base) { // ์กฐ๊ฑด์ด ์ฐธ์ด๋ฏ€๋กœ
    System.out.println("ํ‚ค๊ฐ€ ํฝ๋‹ˆ๋‹ค."); // ์ถœ๋ ฅ
}

 

๐Ÿ”ธ ๋ฌธ์ž ์ž๋ฃŒํ˜•

๋ฌธ์ž ์ž๋ฃŒํ˜•์€ ํ•œ ๊ฐœ์˜ ๋ฌธ์ž ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒํ˜•์ด๋ฉฐ, 16๋น„ํŠธ(2๋ฐ”์ดํŠธ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
์ด๋•Œ, ์Œ์ˆ˜ ๊ฐ’์€ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. (char ํƒ€์ž…์€ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜)

   ๋ฌธ์žํ˜• ํƒ€์ž…    ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ    ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„ ๋ฒ”์œ„
   char    2 byte (16 bit)    \u0000 (0) ~ \uffff (65,535) (์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž)

์ด ์ž๋ฃŒํ˜•์€ ๋ฌธ์ž ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋•Œ ๋‹จ์ผ ์ธ์šฉ๋ถ€ํ˜ธ(')๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ์Œ๋”ฐ์˜ดํ‘œ(")๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•œ๋‹ค.

char a1 = 'a';

char ํƒ€์ž…์€ ๋ฌธ์ž, ์•„์Šคํ‚ค์ฝ”๋“œ ๊ฐ’, ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ์—์„œ 'a', 97, \u0061 ์€ ๋ชจ๋‘ ๊ฐ™์€ ๋ฌธ์ž('a')๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

[ ์˜ˆ์ œ ]

char a1 = 'a';       // ๋ฌธ์ž๋กœ ํ‘œํ˜„
char a2 = 97;        // ์•„์Šคํ‚ค์ฝ”๋“œ ๊ฐ’(97 = 'a')
char a3 = '\u0061';  // ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’(0061 = 'a')

System.out.println(a1);  // a ์ถœ๋ ฅ
System.out.println(a2);  // a ์ถœ๋ ฅ
System.out.println(a3);  // a ์ถœ๋ ฅ

์•„์Šคํ‚ค์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฌธ์ž ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

[ ์˜ˆ์ œ ]

char a = 'C' - 2; // 'C'์˜ ์•„์Šคํ‚ค์ฝ”๋“œ ๊ฐ’(67) - 2 = 65 ('A')

System.out.println(a); // A ์ถœ๋ ฅ

'C'์˜ ์•„์Šคํ‚ค์ฝ”๋“œ ๊ฐ’์€ 67์ด๋‹ค.

67 - 2 = 65, ์ฆ‰, 'A'์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ  'A'๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

๐Ÿ’ก ์•„์Šคํ‚ค์ฝ”๋“œ
์•„์Šคํ‚ค์ฝ”๋“œ๋Š” 1963๋…„ ๋ฏธ๊ตญํ‘œ์ค€ํ˜‘ํšŒ(ASA, ํ˜„์žฌ ANSI)์—์„œ ์ œ์ •ํ•œ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ํ‘œ์ค€์œผ๋กœ, ์˜์–ด ์•ŒํŒŒ๋ฒณ, ์ˆซ์ž, ํŠน์ˆ˜ ๋ฌธ์ž ๋“ฑ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“Œ ํŠน์ง•

  • 7๋น„ํŠธ(128๊ฐœ ๋ฌธ์ž)๋กœ ๊ตฌ์„ฑ → 0 ~ 127
  • ์˜๋ฌธ ๋Œ€/์†Œ๋ฌธ์ž, ์ˆซ์ž(0~9), ํŠน์ˆ˜ ๋ฌธ์ž, ์ œ์–ด ๋ฌธ์ž ํฌํ•จ
  • ํ™•์žฅ ์•„์Šคํ‚ค(8๋น„ํŠธ, 256๊ฐœ ๋ฌธ์ž) → ์œ ๋Ÿฝ ์–ธ์–ด ๋ฐ ๊ทธ๋ž˜ํ”ฝ ๋ฌธ์ž ์ถ”๊ฐ€

 

๐Ÿ’ก ์œ ๋‹ˆ์ฝ”๋“œ

์œ ๋‹ˆ์ฝ”๋“œ๋Š” ์ „ ์„ธ๊ณ„ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ํ‘œ์ค€์ด๋‹ค.

๊ณผ๊ฑฐ์—๋Š” ์•„์Šคํ‚ค์ฝ”๋“œ(ASCII)์ฒ˜๋Ÿผ ๊ฐ ์–ธ์–ด๋ณ„๋กœ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ์–ด๋ ค์› ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋ฌธ์ž์— ๊ณ ์œ ํ•œ ์ฝ”๋“œ ๊ฐ’์„ ๋ถ€์—ฌํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ์ฒด๊ณ„๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.

๐Ÿ“Œ ํŠน์ง•

  • ์šด์˜์ฒด์ œ, ํ”„๋กœ๊ทธ๋žจ, ์–ธ์–ด์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ๋ฌธ์ž ์ฝ”๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ดˆ๊ธฐ์—๋Š” 16๋น„ํŠธ(2๋ฐ”์ดํŠธ, 65,536์ž)๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” ์ตœ๋Œ€ 1,114,112๊ฐœ ๋ฌธ์ž ํ‘œํ˜„ ๊ฐ€๋Šฅ
  • 17๊ฐœ์˜ ํ‰๋ฉด(Plane)์œผ๋กœ ๊ตฌ์„ฑ
    • BMP (Basic Multilingual Plane, ๊ธฐ๋ณธ ๋‹ค๊ตญ์–ด ํ‰๋ฉด, U+0000 ~ U+FFFF) → 65,536์ž
    • ์ถ”๊ฐ€ ํ‰๋ฉด(Supplementary Planes, U+010000 ~ U+10FFFF) → ํ™•์žฅ ๋ฌธ์ž ํ‘œํ˜„ ๊ฐ€๋Šฅ

 

๐Ÿ”น ์ฐธ์กฐ ์ž๋ฃŒํ˜•(Reference Data Type)

๐Ÿ”ธ ๋ฌธ์ž์—ด ์ž๋ฃŒํ˜•

๋ฌธ์ž๋Š” ํ•˜๋‚˜์˜ ๊ธ€์ž๋กœ ์ž‘์€๋”ฐ์˜ดํ‘œ(')๋กœ ๊ฐ์‹ธ๊ณ , ๋ฌธ์ž์—ด์€ ๊ธ€์ž์˜ ์ง‘ํ•ฉ์œผ๋กœ ์Œ ๋”ฐ์˜ดํ‘œ(")๋กœ ๊ฐ์‹ผ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ž๋ฐ”์—์„œ๋Š” ์ด ๋‘˜์„ ์—„๊ฒฉํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•œ๋‹ค.

char c = 'a';        // ๋ฌธ์ž (char)
String s1 = "Happy"; // ๋ฌธ์ž์—ด (String)
String s2 = "123";   // ์ˆซ์ž๋กœ ๋ณด์ด์ง€๋งŒ ๋ฌธ์ž์—ด

 

โ—ฝ  String ํด๋ž˜์Šค

์ž๋ฐ”์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด String ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„๋กœ ์ œ๊ณตํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณด๋ฉด String๋„ char ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜•์ด๋‹ค.

public final class String implements java.io.Serializable, Comparable<String> {
    /* The value is used for character storage */
    private final char[] value; // String ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” char ๋ฐฐ์—ด
}

 

์ด๋Ÿฌํ•œ String ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

String str1 = "Happy Java"; // ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹ (String Pool)
String str2 = new String("Happy Java"); // ์ƒ์„ฑ์ž ๋ฐฉ์‹ (Heap ๋ฉ”๋ชจ๋ฆฌ)

[ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹ (String Pool ์ด์šฉ) ]

  • "Happy Java"๊ฐ€ String Pool์— ์ €์žฅ๋˜๊ณ , ๋™์ผํ•œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์žฌ์‚ฌ์šฉ๋จ → ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ 
  • ๋ฌธ์ž์—ด ๋น„๊ต ์‹œ == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผ ๊ฐ์ฒด์ธ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ

[ new ์ƒ์„ฑ์ž ๋ฐฉ์‹ (Heap ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น) ]

  • new String("Happy Java")๋Š” ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ → ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ฆ๊ฐ€ ๊ฐ€๋Šฅ
  • ๊ฐ€๊ธ‰์ ์ด๋ฉด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

 

โ—ฝ String๊ณผ ์›์‹œ ์ž๋ฃŒํ˜•(Primitive Type)์˜ ์ฐจ์ด

 int, double, char, boolean์€ ๊ธฐ๋ณธ(์›์‹œ, primitive) ์ž๋ฃŒํ˜•์œผ๋กœ ๋ถ„๋ฅ˜๋˜๊ณ , String์€ ์ฐธ์กฐ(Reference) ์ž๋ฃŒํ˜•์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

์ด ๋‘˜์€ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ,

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• → Stack ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ๊ฐ’ ์ €์žฅ
  • ์ฐธ์กฐ ์ž๋ฃŒํ˜• → Heap ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด ์ €์žฅ, Stack์—๋Š” ์ฃผ์†Œ ์ €์žฅ

 

โ—ฝ String์˜ ๋ถˆ๋ณ€์„ฑ (Immutable)

String ๊ฐ์ฒด๋Š” ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

์ฆ‰, ๋ฌธ์ž์—ด์„ ์ˆ˜์ •ํ•˜๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

String s = "ABC";
s += "DEF"; // "ABCDEF"๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ

์ด ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์ž์ฃผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด StringBuffer ๋˜๋Š” StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

StringBuilder sb = new StringBuilder("ABC");
sb.append("DEF"); // ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ˆ˜์ • (๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ )
System.out.println(sb.toString()); // ABCDEF

 

โ—ฝ ๋ฌธ์ž์—ด ๋‚ด์žฅ ๋ฉ”์„œ๋“œ

String ํด๋ž˜์Šค์—๋Š” ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅผ ๋•Œ ์œ ์šฉํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

 

1๏ธโƒฃ ๋ฌธ์ž์—ด ๋น„๊ต (equals)

๋ฌธ์ž์—ด ๊ฐ™์€์ง€ ๋น„๊ตํ•  ๋•Œ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

String a = "hello";
String b = "java";
String c = "hello";

System.out.println(a.equals(b)); // false ์ถœ๋ ฅ
System.out.println(a.equals(c)); // true ์ถœ๋ ฅ

๐Ÿ“Œ == ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ(์ฃผ์†Œ)๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ๋ฌธ์ž์—ด ๋น„๊ต ์‹œ์—๋Š” equals()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

2๏ธโƒฃ ๋ฌธ์ž์—ด ์ˆœ์„œ ๋น„๊ต (compareTo)

์‚ฌ์ „ ์ˆœ(์•ŒํŒŒ๋ฒณ ์ˆœ์„œ) ๋น„๊ต๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋Š” ์Œ์ˆ˜(์•ž), 0(๊ฐ™์Œ), ์–‘์ˆ˜(๋’ค)๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

System.out.println("abc".compareTo("jzis")); // -9 (abc๊ฐ€ ๋” ์•ž)
System.out.println("jzis".compareTo("abc")); // 9 (abc๊ฐ€ ๋” ์•ž)
System.out.println("aa".compareTo("aaa"));   // -1 (aa๊ฐ€ ๋” ์•ž)

๐Ÿ“Œ compareToIgnoreCase()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3๏ธโƒฃ ํŠน์ • ๋ฌธ์ž์—ด ํฌํ•จ ์—ฌ๋ถ€ (contains)

String a = "Hello Java";

System.out.println(a.contains("Java")); // true ์ถœ๋ ฅ
System.out.println(a.contains("Python")); // false ์ถœ๋ ฅ

4๏ธโƒฃ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ํ™•์ธ (startsWith) / ๋ ํ™•์ธ (endsWith)

String a = "Hello Java";

System.out.println(a.startsWith("Hello")); // true ์ถœ๋ ฅ
System.out.println(a.endsWith("Java"));   // true ์ถœ๋ ฅ

5๏ธโƒฃ ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž์˜ ์œ„์น˜ ์ฐพ๊ธฐ (indexOf)

String a = "Hello Java";

System.out.println(a.indexOf("Java"));  // 6 ์ถœ๋ ฅ
System.out.println(a.indexOf("World")); // -1 ์ถœ๋ ฅ (์—†์œผ๋ฉด -1 ๋ฐ˜ํ™˜)

6๏ธโƒฃ ํŠน์ • ์œ„์น˜์˜ ๋ฌธ์ž ๊ฐ€์ ธ์˜ค๊ธฐ (charAt)

String a = "Hello Java";

System.out.println(a.charAt(6)); // 'J' ์ถœ๋ ฅ
System.out.println(a.charAt(0)); // 'H' ์ถœ๋ ฅ

๐Ÿ“Œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

7๏ธโƒฃ ๋ฌธ์ž์—ด ์ผ๋ถ€ ์ถ”์ถœ (substring)

String a = "Hello Java";

System.out.println(a.substring(0, 4)); // "Hell" ์ถœ๋ ฅ (0 ≤ ์ธ๋ฑ์Šค < 4)
System.out.println(a.substring(6));    // "Java" ์ถœ๋ ฅ (6๋ถ€ํ„ฐ ๋๊นŒ์ง€)

8๏ธโƒฃ ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐ (concat)

String a = "Hello";
String b = "World";

System.out.println(a.concat(" ").concat(b)); // "Hello World" ์ถœ๋ ฅ

๐Ÿ“Œ + ์—ฐ์‚ฐ์ž๋กœ๋„ ๋ฌธ์ž์—ด์„ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.

System.out.println(a + " " + b); // "Hello World"

9๏ธโƒฃ ๋ฌธ์ž์—ด ์น˜ํ™˜ (replace, replaceAll)

String a = "Hello Java";
System.out.println(a.replace("Java", "World")); // "Hello World" ์ถœ๋ ฅ

String text = "์นดํŽ˜๋ผ๋–ผ, ๋…น์ฐจ๋ผ๋–ผ, ์ฝ”๋“œ๋ผ๋–ผ";
System.out.println(text.replace("๋ผ๋–ผ", "AA")); // "์นดํŽ˜AA, ๋…น์ฐจAA, ์ฝ”๋“œAA"

๐Ÿ”Ÿ ๋ฌธ์ž์—ด ๋‚˜๋ˆ„๊ธฐ (split)

String a = "a:b:c:d";
String[] arr = a.split(":");  // {"a", "b", "c", "d"}

for (String s : arr) {
    System.out.println(s);
}

๐Ÿ“Œ ๋ฐฐ์—ด์„ ๋‹ค์‹œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ํ•ฉ์น  ๋•Œ๋Š” String.join()์„ ์‚ฌ์šฉํ•œ๋‹ค.

System.out.println(String.join(".", arr)); // "a.b.c.d"

1๏ธโƒฃ1๏ธโƒฃ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜ (toUpperCase, toLowerCase)

String a = "Hello Java";

System.out.println(a.toUpperCase()); // "HELLO JAVA" ์ถœ๋ ฅ
System.out.println(a.toLowerCase()); // "hello java" ์ถœ๋ ฅ

1๏ธโƒฃ2๏ธโƒฃ ๋ฌธ์ž์—ด ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ (trim)

String a = "  Hello Java  ";
System.out.println(a.trim()); // "Hello Java" (์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ)

๐Ÿ“Œ ์ค‘๊ฐ„์˜ ๊ณต๋ฐฑ์€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด replaceAll("\\s", "")์„ ์‚ฌ์šฉํ•œ๋‹ค.

System.out.println(a.replaceAll("\\s", "")); // "HelloJava"

 

   ๋ฉ”์„œ๋“œ    ์„ค๋ช…
   String(String s)    ๋ฌธ์ž์—ด s๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
   String(char[] value)    ์ฃผ์–ด์ง„ ๋ฌธ์ž ๋ฐฐ์—ด value๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ String ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
   String(StringBuffer buf)    StringBuffer ์ธ์Šคํ„ด์Šค buf์™€ ๋™์ผํ•œ ๋‚ด์šฉ์„ ๊ฐ–๋Š” String ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
   char charAt(int index)    ์ง€์ •ํ•œ ์œ„์น˜ index(0๋ถ€ํ„ฐ ์‹œ์ž‘)์˜ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜
   int compareTo(String anotherString)    ํ˜„์žฌ ๋ฌธ์ž์—ด๊ณผ anotherString์„ ์‚ฌ์ „์ˆœ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
   ๊ฐ™์œผ๋ฉด 0, ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ์ž‘์œผ๋ฉด ์Œ์ˆ˜, ํฌ๋ฉด ์–‘์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
   boolean endsWith(String suffix)    ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ์ง€์ •ํ•œ suffix๋กœ ๋๋‚˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜
   boolean equals(Object obj)    ํ˜„์žฌ ๋ฌธ์ž์—ด๊ณผ obj์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
   boolean startsWith(String prefix)    ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ์ง€์ •ํ•œ prefix๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜
   int indexOf(String str)    ํ˜„์žฌ ๋ฌธ์ž์—ด์—์„œ ์ง€์ •ํ•œ str์ด ์ฒ˜์Œ ๋‚˜ํƒ€๋‚˜๋Š” ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜
   ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜
   int lastIndexOf(String str)    ํ˜„์žฌ ๋ฌธ์ž์—ด์—์„œ ์ง€์ •ํ•œ str์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜
   ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜
   int length()    ํ˜„์žฌ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜
   String replace(char oldChar,
   char newChar)
   ํ˜„์žฌ ๋ฌธ์ž์—ด์—์„œ oldChar๋ฅผ ์ฐพ์•„ newChar๋กœ ๋ณ€๊ฒฝํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
   String toLowerCase()    ํ˜„์žฌ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
   String toUpperCase()    ํ˜„์žฌ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
   String substring(int beginIndex)    ํ˜„์žฌ ๋ฌธ์ž์—ด์—์„œ beginIndex๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
   String substring(int beginIndex,
   int endIndex)
   ํ˜„์žฌ ๋ฌธ์ž์—ด์—์„œ beginIndex๋ถ€ํ„ฐ endIndex ์ „๊นŒ์ง€(ํฌํ•จ X) ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„
   ๋ฐ˜ํ™˜
   String[] split(String regex)    ํ˜„์žฌ ๋ฌธ์ž์—ด์„ ์ง€์ •ํ•œ ์ •๊ทœ ํ‘œํ˜„์‹ regex๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ
   ๋ฐ˜ํ™˜
   String[] split(String regex, int limit)    ํ˜„์žฌ ๋ฌธ์ž์—ด์„ ์ •๊ทœ ํ‘œํ˜„์‹ regex๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ตœ๋Œ€ limit ๊ฐœ์ˆ˜๋งŒํผ ๋ถ„ํ• ํ•˜์—ฌ
   ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
   ๋งˆ์ง€๋ง‰ ์š”์†Œ๋Š” ๋‚จ์€ ๋ฌธ์ž์—ด์„ ํฌํ•จ
   String trim()    ํ˜„์žฌ ๋ฌธ์ž์—ด์˜ ์–‘ ๋์— ์žˆ๋Š” ๊ณต๋ฐฑ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
   byte[] getBytes()    ํ˜„์žฌ ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜
   (getBytes(Charset charset)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
   boolean contains(CharSequence s)    ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„ s๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜
   String join(CharSequence delimiter,
   CharSequence... elements)
   ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์ž์—ด์„ delimiter(๊ตฌ๋ถ„์ž)๋กœ ์ด์–ด ๋ถ™์—ฌ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
   boolean isEmpty()    ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ๋น„์–ด์žˆ๋Š”์ง€(๊ธธ์ด๊ฐ€ 0์ธ์ง€) ํ™•์ธํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
   int codePointAt(int index)    ์ง€์ •ํ•œ ์œ„์น˜ index์˜ ๋ฌธ์ž์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ๋ฐ˜ํ™˜

 

 

 

 

 

๐Ÿ“ƒ reference