๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ์ค‘/Java

Java ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์•Œ์•„์•ผํ•˜๋Š” ์งˆ๋ฌธ๋“ค์ด๋ผ๊ธธ๋ž˜ ๋‚˜๋Š” ์ž˜ ์•Œ๊ณ  ์žˆ๋Š”๊ฐ€ ?

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ JDK ์™€ JRE ์˜ ์ฐจ์ด์ 

JDK (Java Development Kit)
JDK๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. 

JDK์—๋Š” JRE๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ถ”๊ฐ€์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ(javac), ๋””๋ฒ„๊ฑฐ, ์•„์นด์ด๋ฒ„(jar), ๋ฌธ์„œ ์ƒ์„ฑ๊ธฐ(javadoc) ๋“ฑ์˜ ๋„๊ตฌ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, JDK๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

JRE (Java Runtime Environment)
JRE๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. JRE์—๋Š” JVM (Java Virtual Machine)๊ณผ Java ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Java API)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋„๊ตฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ JRE๋งŒ์œผ๋กœ๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด, JDK๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, JRE๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด Java ๊ฐœ๋ฐœ์ž๋ผ๋ฉด JDK๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•˜๊ณ , ๋‹จ์ง€ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด JRE๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ == ์™€ equals ์˜ ์ฐจ์ด์ 

== ์—ฐ์‚ฐ์ž์™€ equals ๋ฉ”์†Œ๋“œ๋Š” Java์—์„œ ๊ฐ์ฒด ๋˜๋Š” ๊ฐ’์˜ ๋™์ผ์„ฑ ๋˜๋Š” ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๊ทธ๋“ค์ด ํ•˜๋Š” ์ผ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

== ์—ฐ์‚ฐ์ž
== ์—ฐ์‚ฐ์ž๋Š” ์›์‹œ ํƒ€์ž…(primitive type, ์˜ˆ: int, float, boolean ๋“ฑ)์—์„œ ๊ฐ’์„ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ์ฐธ์กฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

int a = 10;
int b = 10;
System.out.println(a == b); // true, ๊ฐ’์ด ๊ฐ™์œผ๋ฏ€๋กœ

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // false, ๊ฐ์ฒด์˜ ์ฐธ์กฐ(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ)๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—

equals ๋ฉ”์†Œ๋“œ
equals ๋ฉ”์†Œ๋“œ๋Š” Java ๊ฐ์ฒด๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™์ผํ•œ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ equals ๋ฉ”์†Œ๋“œ๋Š” == ์—ฐ์‚ฐ์ž์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ, ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์—๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ equals ๋ฉ”์†Œ๋“œ๋Š” ํด๋ž˜์Šค์— ๋”ฐ๋ผ ์žฌ์ •์˜(override)๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๋‚ด์žฅ Java ํด๋ž˜์Šค(์˜ˆ: String, Integer ๋“ฑ)์—์„œ๋Š” ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ๋…ผ๋ฆฌ์  ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๋„๋ก ์žฌ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // true, ๋‘ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฏ€๋กœ

์š”์•ฝํ•˜๋ฉด, == ์—ฐ์‚ฐ์ž๋Š” ์›์‹œ ํƒ€์ž…์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ์ฐธ์กฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๊ณ , equals ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ equals ๋ฉ”์†Œ๋“œ์˜ ๋™์ž‘์€ ํ•ด๋‹น ํด๋ž˜์Šค์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ hashCode ๋ฅผ ๊ฐ€์ง€๋ฉด Equals() ์— ๋Œ€ํ•ด

Java์—์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ hashCode()๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๊ทธ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™๋“ฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. hashCode() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•ด์‹œ ์ฝ”๋“œ๋„ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Java์˜ hashCode() ๋ฉ”์„œ๋“œ์—๋Š” ํŠน์ • ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‘ ๊ฐ์ฒด๊ฐ€ equals() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๋™๋“ฑํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด, ๊ทธ ๋‘ ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” HashMap, HashSet ๋“ฑ์˜ ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ์„ ํŒ๋‹จํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ, ๋‘ ๊ฐ์ฒด์˜ hashCode()๊ฐ€ ๋™์ผํ•˜๋‹ค๊ณ  ํ•ด์„œ ๊ทธ ๋‘ ๊ฐ์ฒด๊ฐ€ equals()์— ์˜ํ•ด ๋™๋“ฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด์‹œ ์ถฉ๋Œ(hash collision)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด(์ฆ‰, equals()๋กœ ๋น„๊ตํ–ˆ์„ ๋•Œ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด)๊ฐ€ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์†์„ฑ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋ฉฐ, ํŠนํžˆ ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ ๊ฐ์ฒด์˜ ์ˆ˜๋ณด๋‹ค ์ž‘์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ hashCode()๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•ด์„œ ๊ทธ ๊ฐ์ฒด๋“ค์ด equals()์— ์˜ํ•ด ๋™๋“ฑํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ equals()์— ์˜ํ•ด ๋™๋“ฑํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋œ ๊ฐ์ฒด๋“ค์€ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ hashCode()๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ String ๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๊นŒ ?

 Java์—์„œ String์€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…(primitive data type)์ด ์•„๋‹™๋‹ˆ๋‹ค. String์€ ์ฐธ์กฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…(reference data type) ํ˜น์€ ๊ฐ์ฒด ํƒ€์ž…(object type) ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

Java์—์„œ๋Š” 8๊ฐœ์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค:

1. byte
2. short
3. int
4. long
5. float
6. double
7. boolean
8. char


์ด๋“ค์€ Java์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ, ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์™€ ํ˜•ํƒœ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— String๊ณผ ๊ฐ™์€ ์ฐธ์กฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. String์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ฌธ์ž์—ด์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ String์€ ๋ถˆ๋ณ€(immutable) ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. String์˜ ๋ฉ”์„œ๋“œ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ์›๋ž˜ String ๊ฐ์ฒด๋Š” ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์‹  ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— String์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ์ž๋ฐ”์—์„œ ๋ฌธ์ž์—ด์„ ์กฐ์ž‘ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ ?

String: ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์กฐ์ž‘ ์ž‘์—…์ด ๋งŽ์„ ๊ฒฝ์šฐ์—๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ด์Šˆ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

StringBuilder: String ํด๋ž˜์Šค์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๊ฐ€๋ณ€์„ฑ(mutable)์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ StringBuilder ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. StringBuilder๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌธ์ž์—ด ์กฐ์ž‘์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

StringBuffer: StringBuilder์™€ ๋™์ผํ•œ API๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ฐ€๋ณ€์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ StringBuffer๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „(thread-safe)ํ•˜๊ฒŒ ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

StringTokenizer: String์„ ํŠน์ • ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ ๋ฌธ์ž์—ด์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด Java์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •๊ทœ ํ‘œํ˜„์‹์„ ํ™œ์šฉํ•˜๋ ค๋ฉด Pattern๊ณผ Matcher ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ String str ="i" ์™€ String str = new String("i") ๋Š” ๋™์ผํ•œ๊ฐ€ ?

String str = "i";์™€ String str = new String("i");๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

String str = "i";: ์ด ์ฝ”๋“œ๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๊ฐ€ "String Constant Pool"์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์ด ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

String str = new String("i");: ์ด ์ฝ”๋“œ๋Š” new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ(heap memory)์— ์ €์žฅ๋˜๋ฉฐ, ๊ฐ๊ฐ์˜ new ํ‘œํ˜„์‹์€ ์ƒˆ๋กœ์šด, ๋ณ„๊ฐœ์˜ String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์ž์—ด์ด ๊ฐ™๋”๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, String str = "i";์™€ String str = new String("i");๋Š” ์ €์žฅ๋˜๋Š” ์œ„์น˜์™€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

String str1 = "i";
String str2 = "i";
String str3 = new String("i");

System.out.println(str1 == str2);  // true
System.out.println(str1 == str3);  // false
System.out.println(str1.equals(str3)); // true

str1๊ณผ str2๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ƒ์„ฑ๋˜์–ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ==๋กœ ๋น„๊ตํ•˜๋ฉด true๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ str3๋Š” new ํ‚ค์›Œ๋“œ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— str1์ด๋‚˜ str2์™€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ str1 == str3๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ String ํด๋ž˜์Šค์˜ equals() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๋ฏ€๋กœ, str1.equals(str3)๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ๋ฌธ์ž์—ด์„ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด

Java์—์„œ ๋ฌธ์ž์—ด์„ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” StringBuilder ํด๋ž˜์Šค์˜ reverse ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฌธ์ž์—ด์„ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:

String str = "Hello World";
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(reversed);


์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” "dlroW olleH"์ž…๋‹ˆ๋‹ค.

StringBuilder์˜ reverse ๋ฉ”์†Œ๋“œ๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๋ฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. StringBuilder๋Š” ๋ฌธ์ž์—ด ์กฐ์ž‘์„ ์œ„ํ•œ ๊ฐ€๋ณ€์ ์ธ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๋ฌธ์ž์—ด์„ ๋ฐ˜์ „์‹œํ‚ค๋Š”๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์—†์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ž ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๋ฐ˜์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

String str = "Hello World";
char[] strArray = str.toCharArray();
String reversed = "";
for (int i = strArray.length - 1; i >= 0; i--) {
    reversed += strArray[i];
}
System.out.println(reversed);

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋ฌธ์ž์—ด์ด ๊ธธ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” StringBuilder์˜ reverse ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ String ํด๋ž˜์Šค์˜ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์—‡์ธ๊ฐ€

length(): ๋ฌธ์ž์—ด์˜ ๊ธธ์ด(๋ฌธ์ž ์ˆ˜)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

charAt(int index): ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

substring(int beginIndex, int endIndex): ๋ฌธ์ž์—ด์˜ ํŠน์ • ๋ถ€๋ถ„์„ ์ถ”์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. beginIndex๋Š” ์‹œ์ž‘ ์ธ๋ฑ์Šค์ด๊ณ , endIndex๋Š” ์ข…๋ฃŒ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. endIndex๋Š” ์„ ํƒ์ ์ด๋ฉฐ, ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ž์—ด์˜ ๋๊นŒ์ง€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

contains(CharSequence sequence): ๋ฌธ์ž์—ด์ด ํŠน์ • ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จํ•˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

indexOf(String str): ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์ด ์‹œ์ž‘๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฐพ๋Š” ๋ฌธ์ž์—ด์ด ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

lastIndexOf(String str): ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž์—ด์ด ์‹œ์ž‘๋˜๋Š” ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฐพ๋Š” ๋ฌธ์ž์—ด์ด ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

equals(Object obj): ๋ฌธ์ž์—ด์ด ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๊ณผ ๋™์ผํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

equalsIgnoreCase(String str): ๋ฌธ์ž์—ด์ด ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๊ณผ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋™์ผํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

startsWith(String prefix), endsWith(String suffix): ๋ฌธ์ž์—ด์ด ํŠน์ • ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

replace(char oldChar, char newChar): ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๋ชจ๋‘ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

toUpperCase(), toLowerCase(): ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž ๋˜๋Š” ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

trim(): ๋ฌธ์ž์—ด์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋Š” ํ•„์ˆ˜์ ์ธ๊ฐ€์š” ?

์ถ”์ƒ ํด๋ž˜์Šค์—์„œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ํ•„์ˆ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ์™€ ํ•„๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ๊ฐ€์ง€๋ฉด ๊ทธ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™” ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ฃผ๋กœ ํ•˜์œ„ ํด๋ž˜์Šค์— ์˜ํ•ด ํ™•์žฅ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜, ํด๋ž˜์Šค์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ์„ ์ œ๊ณตํ•˜๊ณ  ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ ์—†์ด๋„ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์งˆ ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ธŒ ํด๋ž˜์Šค ๊ฐ„์— ๊ณตํ†ต์˜ ์ƒํƒœ๋‚˜ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ๋ณดํ†ต์˜ ํด๋ž˜์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š” ?

์ธ์Šคํ„ด์Šคํ™”: ์ผ๋ฐ˜ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋กœ ์ธ์Šคํ„ด์Šคํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋กœ ์ธ์Šคํ„ด์Šคํ™” ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ•ด ์ƒ์†๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„: ์ผ๋ฐ˜ ํด๋ž˜์Šค์—์„œ ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ, ์ฆ‰ '์ถ”์ƒ ๋ฉ”์†Œ๋“œ'๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ชฉ์ : ์ผ๋ฐ˜ ํด๋ž˜์Šค๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ํ–‰๋™์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ฃผ๋กœ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋™์ผํ•œ '์ข…๋ฅ˜'์— ์†ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์˜ ๊ณตํ†ต๋œ ํŠน์„ฑ๊ณผ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ์„ฑ: ์ผ๋ฐ˜ ํด๋ž˜์Šค๋Š” ํ•„์š”์— ๋”ฐ๋ผ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน์ •ํ•œ ํ–‰๋™์ด๋‚˜ ์†์„ฑ์„ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ํŠน์ • ํ–‰๋™์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฐจ์ด์ ๋“ค๋กœ ์ธํ•ด, ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ผ๋ฐ˜ ํด๋ž˜์Šค๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์„ ํƒ๋˜๊ณ  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ final ์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š” ?

final๊ณผ abstract๋Š” ์„œ๋กœ ๋ฐฐํƒ€์ ์ธ ํ‚ค์›Œ๋“œ๋กœ, ๋™์‹œ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

final ํด๋ž˜์Šค: final ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” ๋” ์ด์ƒ ํ™•์žฅ(์ƒ์†)๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ final ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กœ์šด ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, final ํ‚ค์›Œ๋“œ๋Š” ๋ฉ”์†Œ๋“œ์™€ ๋ณ€์ˆ˜์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด, final ๋ฉ”์†Œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์—†๊ณ , final ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค: ๋ฐ˜๋ฉด์— abstract ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜ ์ด์ƒ์˜ ํด๋ž˜์Šค์— ์˜ํ•ด ์ƒ์†๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, final ํ‚ค์›Œ๋“œ๋Š” ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ˜๋ฉด, abstract ํ‚ค์›Œ๋“œ๋Š” ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋‘ ํ‚ค์›Œ๋“œ๋Š” ๋™์‹œ์— ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค๋Š” final์ผ ์ˆ˜๋„ ์žˆ๊ณ  abstract์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋‘˜ ๋™์‹œ์—๋Š” ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ์ž๋ฐ” ์ปจํ…Œ์ด๋„ˆ๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š” ?

์ž๋ฐ” ์ปจํ…Œ์ด๋„ˆ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ์„œ๋ธ”๋ฆฟ ๋ฐ JSP ํŽ˜์ด์ง€์˜ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘, ์ค‘์ง€, ๋ฐฐํฌ, ์–ธ๋ฐฐํฌ์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์„ธ์…˜ ๊ด€๋ฆฌ, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ฆฌ์†Œ์Šค ํ’€๋ง ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” ํ”Œ๋žซํผ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์—๋””์…˜(Java EE, ์ด์ „์˜ J2EE)์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š”ํ•œ ์ข…๋ฅ˜์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

EJB ์ปจํ…Œ์ด๋„ˆ: ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ž๋ฐ” ๋นˆ(Enterprise Java Beans)์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, ๋ณด์•ˆ, ๋ฆฌ๋ชจํŠธ ์ ‘๊ทผ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์›น ์ปจํ…Œ์ด๋„ˆ (๋˜๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ): ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” ์›น ์ปดํฌ๋„ŒํŠธ์ธ ์„œ๋ธ”๋ฆฟ๊ณผ JSP(JavaServer Pages)์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” ์ปจํ…Œ์ด๋„ˆ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” Apache Tomcat, Jetty, JBoss, GlassFish ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ Collection ๊ณผ Collections ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€ ?

Collection๊ณผ Collections๋Š” ์ž๋ฐ”์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์— ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Collection: java.util.Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ์ปฌ๋ ‰์…˜ ํƒ€์ž…๋“ค(List, Set, Queue ๋“ฑ)์˜ ๋ฃจํŠธ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฌ๋Ÿฌ ์›์†Œ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋“ค(add, remove, contains, isEmpty ๋“ฑ)์„ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Collection์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ, ์ง์ ‘์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋Œ€์‹  ๊ทธ ํ•˜์œ„์˜ ๊ตฌํ˜„์ฒด๋“ค(List, Set, Queue ๋“ฑ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Collections: ๋ฐ˜๋ฉด์— java.util.Collections๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๋งŒ์„ ํฌํ•จํ•˜๋ฉฐ, ์ด๋“ค ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ๋กœ Collection ๊ฐ์ฒด๋“ค์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Collections.sort(List) ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๊ณ , Collections.binarySearch(List, Object) ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์—์„œ ์ด์ง„ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, Collection์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ, Collections๋Š” ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ Hash Map ๊ณผ Hash Table ์˜ ์ฐจ์ด์ 

HashMap๊ณผ Hashtable์€ ๋‘˜ ๋‹ค Java์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€๋กœ, ํ‚ค์™€ ๊ฐ’์„ ์Œ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋งต ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ํด๋ž˜์Šค ์‚ฌ์ด์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐํ™”: Hashtable์€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ์–ด์„œ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „(thread-safe)ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— HashMap์€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HashMap์„ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด Collections.synchronizedMap() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

null ํ—ˆ์šฉ: HashMap์€ ํ‚ค ๋˜๋Š” ๊ฐ’์œผ๋กœ null์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ null ํ‚ค์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ null ๊ฐ’์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Hashtable์€ ์–ด๋– ํ•œ ํ˜•ํƒœ์˜ null ๊ฐ’๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค ๋˜๋Š” ๊ฐ’์œผ๋กœ null์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ˆœํšŒ ์ˆœ์„œ: HashMap์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์š”์†Œ๋“ค์€ ์–ด๋– ํ•œ ํŠน์ • ์ˆœ์„œ๋กœ ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์ˆœํšŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Hashtable๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํšจ์œจ์„ฑ: HashMap์€ Hashtable๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Š” HashMap์ด ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋™๊ธฐํ™”๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋งต์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Java 1.2๋ถ€ํ„ฐ HashMap์ด ๋„์ž…๋˜๋ฉด์„œ, Hashtable์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” HashMap์ด ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” HashMap์„, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Collections.synchronizedMap() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HashMap์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ List, Set, Map ์˜ ์ฐจ์ด์ 

 

๐Ÿ“Œ ๊ฐ๊ฐ ์–ด๋–ค ์ƒํ™ฉ์—์„œ HashMap ๊ณผ TreeMap ์„ ์„ ํƒํ•˜๋‚˜์š” ?

 

๐Ÿ“Œ HashMap ์˜ ๊ตฌํ˜„์›์น™์— ๋Œ€ํ•ด

 

๐Ÿ“Œ HashSet ์˜ ๊ตฌํ˜„์›์น™์— ๋Œ€ํ•ด

 

๐Ÿ“Œ ArrayList ์™€ LinkedList ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€ ?

 

๐Ÿ“Œ ArrayList ์™€ Vector ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ

 

๐Ÿ“Œ Queue ์—์„œ pull() ๊ณผ remove() ์˜ ์ฐจ์ด์ 

 

๐Ÿ“Œ thread-safe ํ•œ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ ?

Java์—์„œ๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ํ•œ(thread-safe) ์ปฌ๋ ‰์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปฌ๋ ‰์…˜๋“ค์€ ๋™์‹œ์„ฑ ์ปฌ๋ ‰์…˜(Concurrent Collection)์ด๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปฌ๋ ‰์…˜๋“ค์€ ๋™๊ธฐํ™”๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋™์‹œ์„ฑ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค:

Vector: Vector๋Š” ArrayList์™€ ๋น„์Šทํ•˜์ง€๋งŒ, Vector์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ๋™๊ธฐํ™”๋˜์–ด ์žˆ์–ด ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

Hashtable: Hashtable์€ HashMap๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, Hashtable์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ๋™๊ธฐํ™”๋˜์–ด ์žˆ์–ด ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

ConcurrentHashMap: ConcurrentHashMap์€ HashMap๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋™์‹œ์„ฑ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๋งต์ž…๋‹ˆ๋‹ค. ConcurrentHashMap์€ ์ „์ฒด ๋งต์„ ์ž ๊ทธ๋Š” ๋Œ€์‹  ์„น์…˜(์ผ๋ฐ˜์ ์œผ๋กœ ๋งต์˜ ๋ถ€๋ถ„์ ์ธ ์˜์—ญ)์„ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

CopyOnWriteArrayList: CopyOnWriteArrayList๋Š” ArrayList์˜ ๋™์‹œ์„ฑ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜๋ฉฐ, ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ถ”๊ฐ€, ์„ค์ •, ์ œ๊ฑฐ ๋“ฑ)์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฆฌ์ŠคํŠธ์˜ ์ƒˆ๋กœ์šด ์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

CopyOnWriteArraySet: CopyOnWriteArraySet์€ Set ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋™์‹œ์„ฑ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ CopyOnWriteArrayList๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

BlockingQueue ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ ๊ตฌํ˜„์ฒด๋“ค: BlockingQueue ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ฝ์ž…, ์ œ๊ฑฐ, ๊ฒ€์‚ฌ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๋ฉฐ, ํ๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ ์ œ๊ฑฐ ์—ฐ์‚ฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ํ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ ์‚ฝ์ž… ์—ฐ์‚ฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ฒด๋กœ๋Š” ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ปฌ๋ ‰์…˜๋“ค์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์„ฑ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ปฌ๋ ‰์…˜์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ iterator ์ด๋ž€ ?

Iterator๋Š” Java์˜ Collection ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ปฌ๋ ‰์…˜์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Iterator๋Š” ์ฃผ๋กœ next(), hasNext(), remove() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

next(): ์ปฌ๋ ‰์…˜์—์„œ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ NoSuchElementException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
hasNext(): ์ปฌ๋ ‰์…˜์—์„œ ์ฝ์–ด์˜ฌ ๋‹ค์Œ ์š”์†Œ๊ฐ€ ๋” ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด true๋ฅผ, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
remove(): next()๋ฅผ ํ†ตํ•ด ์ตœ๊ทผ์— ๋ฐ˜ํ™˜๋œ ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. next() ํ˜ธ์ถœ ์—†์ด remove()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด IllegalStateException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ Iterator ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

List<String> list = new ArrayList<>();
list.add("One");
list.add("Two");
list.add("Three");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    System.out.println(element);
}

 

 

๐Ÿ“Œ iterator ์˜ ์‚ฌ์šฉ ๋ชฉ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š” ?

 

๐Ÿ“Œ iterator ์™€ listlterator ์˜ ์ฐจ์ด๋Š” ?

 

๐Ÿ“Œ ๋ณ‘๋ ฌ๊ณผ ๋™์‹œ์„ฑ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด

"๋ณ‘๋ ฌ์ฒ˜๋ฆฌ"์™€ "๋™์‹œ์„ฑ"์€ ์ข…์ข… ํ˜ผ์šฉ๋˜๋Š” ์šฉ์–ด์ด์ง€๋งŒ, ๊ทธ๋“ค์ด ์ง€์นญํ•˜๋Š” ๊ฐœ๋…์€ ์‚ฌ์‹ค์ƒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋™์‹œ์„ฑ(Concurrency): ๋™์‹œ์„ฑ์€ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹ฑ๊ธ€ ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ค์ œ๋กœ๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ž‘์—… ๊ฐ„์— ์ „ํ™˜ํ•˜๋ฉด์„œ ๋งˆ์น˜ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๋‹ค์ˆ˜์˜ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ I/O ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋‹ค์ˆ˜์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณ‘๋ ฌ์ฒ˜๋ฆฌ(Parallelism): ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„  ๋ฉ€ํ‹ฐ์ฝ”์–ด๋‚˜ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋Š” CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ฝ”์–ด์—์„œ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ ์ „์ฒด ์ž‘์—… ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๋™์‹œ์„ฑ์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๋Š” ๋Šฅ๋ ฅ์ด๊ณ , ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์€ ํ•ญ์ƒ ๋™์‹œ์„ฑ์„ ํฌํ•จํ•˜์ง€๋งŒ, ๋™์‹œ์„ฑ ์‹œ์Šคํ…œ์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ์Šค๋ ˆ๋“œ์™€ ํ”„๋กœ์„ธ์Šค์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด

ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋Š” ๋™์‹œ์„ฑ ์‹คํ–‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ปดํ“จํŒ…์˜ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋…๋“ค์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋…์˜ ์ฃผ์š” ์ฐจ์ด๋Š” ๊ทธ๋“ค์˜ ๋…๋ฆฝ์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ํ†ต์‹  ๋ฐฉ์‹์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค(Process):
ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„, ๋ฐ์ดํ„ฐ, ๋ช…๋ น์–ด ๋“ฑ์„ ๊ฐ€์ง€๋ฉฐ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์€ Inter-Process Communication (IPC) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ(Thread):
์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์‹คํ–‰ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ ์ž์›์„ ๊ณต์œ ํ•˜๋ฉฐ, ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๊ณ ์œ ํ•œ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ, ๋ ˆ์ง€์Šคํ„ฐ ์ง‘ํ•ฉ, ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ ๊ณต๊ฐ„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ์€ ์ฃผ๋กœ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์Šค์ผ€์ค„๋ง๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„์ด๊ณ , ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ์‹คํ–‰ ๋‹จ์œ„๋กœ, ์ž์›์„ ๊ณต์œ ํ•˜๋ฉด์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ๋ฌด์—‡์ธ๊ฐ€

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ(Daemon Thread)๋Š” Java ๋˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ฃผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ถ€ ์ฃผ์š” ์ž‘์—…์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์˜ ์ฃผ์š” ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด JVM(Java Virtual Machine)์€ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ์ด๋ฅผ ์ค‘๋‹จ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ํ•„์š” ์—†๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ฒญ์†Œํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ›„, setDaemon(true)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ๋ณดํ†ต ๋ฌดํ•œ ๋ฃจํ”„ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ํ•„์š”ํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ์€ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋ฉด, ๊ทธ ์ž‘์—…์ด ๊ฐ‘์ž๊ธฐ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ v์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜์—ด

 

๐Ÿ“Œ runnable ๊ณผ callable ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€ ?

 

๐Ÿ“Œ sleep() ๊ณผ wait() ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€ ?

 

๐Ÿ“Œ thread run() ๊ณผ thread start() ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š” ?

 

๐Ÿ“Œ ์Šค๋ ˆ๋“œ ํ’€์˜ ์ƒํƒœ์— ๋Œ€ํ•ด

 

๐Ÿ“Œ ์Šค๋ ˆํŠธ ํ’€์—์„œ submit() ๊ณผ execute() ์˜ ์ฐจ์ด

 

๐Ÿ“Œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ž‘์—…์˜ ์•ˆ์ •์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์„๊นŒ ?

 

๐Ÿ“Œ reflection ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ?

 

๐Ÿ“Œ ์ž๋ฐ” ์ง๋ ฌํ™”๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ? ์–ด๋–ค ์ƒํ™ฉ์—์„œ ํ•„์š”ํ•œ๊ฐ€ ?

 

๐Ÿ“Œ ๋™์  ํ”„๋ก์‹œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ?

 

๐Ÿ“Œ ๋™์  ํ”„๋ก์‹œ๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜ ?

 

๐Ÿ“Œ Object Copy ๋ณต์‚ฌ๊ฐ€ ๋˜๋Š” ์ด์œ ๋Š” ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‚˜ ?

 

๐Ÿ“Œ Object Copy ๊ฐ์ฒด ๋ณต์‚ฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‚˜ ?

 

๐Ÿ“Œ Object Copy ์˜ ๊นŠ์€ ๋ณต์‚ฌ์™€ ์–•์€ ๋ณต์‚ฌ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด

 

๐Ÿ“Œ jsp ์™€ servlet ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด

 

๐Ÿ“Œ jsp ๋ฅผ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ฌด์—‡์ธ๊ฐ€

 

๐Ÿ“Œ 4๊ฐœ์˜ jsp score ์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜ ?

 

๐Ÿ“Œ ์„ธ์…˜ ๊ณผ์ •์„ ์„ค๋ช…

์„ธ์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋ถ€ํ„ฐ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ๊ฑฐ๋‚˜ ๋กœ๊ทธ์•„์›ƒํ•  ๋•Œ๊นŒ์ง€ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์„ธ์…˜์€ ์„œ๋ฒ„ ์ธก์—์„œ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋กœ๊ทธ์ธ ์ •๋ณด, ์‚ฌ์šฉ์ž๊ฐ€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ํ•œ ํ•ญ๋ชฉ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜์€ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์œ ๋‹ˆํฌํ•œ ์‹๋ณ„์ž, ์ฆ‰ ์„ธ์…˜ ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜์˜ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ธ์…˜ ์ƒ์„ฑ: ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ฒ˜์Œ ์ ‘์†ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ ์œ ํ•œ ์„ธ์…˜ ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ธ์…˜ ID๋Š” ์„œ๋ฒ„ ๋‚ด์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์™€ ์—ฐ๊ฒฐ๋˜์–ด, ๊ทธ ์„ธ์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜ ID ์ „๋‹ฌ: ์ƒ์„ฑ๋œ ์„ธ์…˜ ID๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜์–ด, ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ์ฟ ํ‚ค๋‚˜ URL ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์„ ํ†ตํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์ด ์„ธ์…˜ ID๋ฅผ ํ•จ๊ป˜ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜ ๋ฐ์ดํ„ฐ ํ™œ์šฉ: ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์„ธ์…˜ ID๋ฅผ ์ด์šฉํ•ด ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ํ•ด๋‹น ์„ธ์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””๋‚˜ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ์„ธ์…˜ ๋ฐ์ดํ„ฐ์— ์ €์žฅํ•˜๊ณ , ์ดํ›„ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์ด ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ์…˜ ์ข…๋ฃŒ: ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ์ผ์ • ์‹œ๊ฐ„๋™์•ˆ ํ™œ๋™์ด ์—†๋Š” ๊ฒฝ์šฐ(์„ธ์…˜ ํƒ€์ž„์•„์›ƒ), ์„ธ์…˜์€ ์ข…๋ฃŒ๋˜๊ณ  ์„ธ์…˜ ์ €์žฅ์†Œ์—์„œ ํ•ด๋‹น ์„ธ์…˜์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

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

 

 

๐Ÿ“Œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์„ธ์…˜์„ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ ?

๋„ค, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ์…˜๊ณผ ์ฟ ํ‚ค๋Š” ์›น ์„œ๋ฒ„์™€ ์›น ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์—์„œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. HTTP๋Š” ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”(stateless) ํ”„๋กœํ† ์ฝœ์ด๋ฏ€๋กœ, ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ(์ฆ‰, ์›น ๋ธŒ๋ผ์šฐ์ €) ์ธก์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด ์ •๋ณด๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ฟ ํ‚ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ์— ํ•„์š”ํ•œ ์ •๋ณด(๋กœ๊ทธ์ธ ์ƒํƒœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ•ญ๋ชฉ ๋“ฑ)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฟ ํ‚ค๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ณ , ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ์ฟ ํ‚ค๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿด ๋•Œ ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ ์ •๋ณด๋Š” ์„œ๋ฒ„ ์ธก์— ์ €์žฅ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ์…˜ ID๋งŒ์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ธ์…˜ ID๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋กœ ์ „์†ก๋˜์–ด ํ•ด๋‹น ์„ธ์…˜์„ ์‹๋ณ„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜์€ ์„œ๋ฒ„ ์ธก์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋ณด์•ˆ์„ฑ์ด ๋†’์ง€๋งŒ, ๋„ˆ๋ฌด ๋งŽ์€ ์„ธ์…˜ ์ •๋ณด๊ฐ€ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ด€๋ฆฌ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ์Šคํ”„๋ง MVC ์™€ struts ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€ ?

Struts์™€ Spring MVC๋Š” ๋ชจ๋‘ Java ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์กฐ, ์„ค๊ณ„, ๊ธฐ๋Šฅ ๋“ฑ์— ์žˆ์–ด ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

์„ค๊ณ„์™€ ๊ตฌ์กฐ:

Struts๋Š” ์•ก์…˜ ๊ธฐ๋ฐ˜ MVC(Model-View-Controller) ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Struts๋Š” ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ผ์šฐํŒ…ํ•˜๊ธฐ ์œ„ํ•ด '์•ก์…˜'๊ณผ '์•ก์…˜ ๋งตํ•‘'์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ๊ณ ์ •๋œ ํŽ˜์ด์ง€ ํ๋ฆ„์„ ๊ฐ€์ง„, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด์— Spring MVC๋Š” ๋” ์œ ์—ฐํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Spring MVC๋Š” ๊ฐ•๋ ฅํ•œ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์›น ์š”์ฒญ์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋™์  ํŽ˜์ด์ง€ ํ๋ฆ„์„ ๊ฐ€์ง„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
ํ†ตํ•ฉ:

Struts๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ๊ณ„์ธต์— ์ดˆ์ ์„ ๋งž์ถ˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ๋‹ค๋ฅธ ๊ธฐ์ˆ ๊ณผ์˜ ํ†ตํ•ฉ์€ ๊ฐœ๋ฐœ์ž์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.
Spring MVC๋Š” Spring Framework์˜ ์ผ๋ถ€๋กœ, ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ์„ค์ •, ๋ณด์•ˆ ๋“ฑ๊ณผ ๊ฐ™์€ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ํ†ตํ•ฉํ•˜๊ณ  ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์œ ์ง€ ๊ด€๋ฆฌ์™€ ์ง€์›:

Struts๋Š” ์ด์ „์— ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ, 2017๋…„์— ๋ฐœ์ƒํ•œ ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์ด์Šˆ ์ดํ›„๋กœ ์‚ฌ์šฉ์ด ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. Struts 2๋Š” ์•„์ง๋„ ์ง€์›๋˜์ง€๋งŒ, ๊ทธ ํ™œ๋™์€ ์ƒ๋‹นํžˆ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
Spring MVC๋Š” Spring ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ฐ•๋ ฅํ•œ ์ง€์›์„ ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ์™€ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Spring Boot์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ์ดˆ๊ธฐ ์„ค์ • ๊ณผ์ •์ด ๊ฐ„์†Œํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ:

Spring MVC๋Š” ์˜์กด์„ฑ ์ฃผ์ž…(DI)๋ฅผ ์ด์šฉํ•ด ์œ ๋‹› ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Struts์—์„œ์˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์€ Spring MVC๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์„ ํƒ์€ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ, ํŒ€์˜ ๊ธฐ์ˆ ์  ๋Šฅ๋ ฅ, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๋“ฑ ์—ฌ๋Ÿฌ ์š”์ธ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ SQL Injection ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€

SQL Injection์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์˜์ ์ธ SQL ์ฝ”๋“œ๋ฅผ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฃผ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ณต๊ฒฉ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์‹ฌ์ง€์–ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ œ์–ด๋ฅผ ์™„์ „ํžˆ ์žƒ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ SQL Injection ๊ณต๊ฒฉ์„ ํ”ผํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค:

Prepared Statements (Parameterized Queries) ์‚ฌ์šฉ: Prepared Statements๋Š” SQL ์ฟผ๋ฆฌ์—์„œ ํŠน์ • ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ „์†กํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— SQL Injection ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

Stored Procedures ์‚ฌ์šฉ: Stored Procedures๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹๋„ Prepared Statements์™€ ์œ ์‚ฌํ•˜๊ฒŒ SQL Injection์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” ๋ชจ๋“  ์ž…๋ ฅ์€ ์ ์ ˆํ•œ ํ˜•์‹๊ณผ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ฆ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋˜๋Š” ์•…์˜์ ์ธ ๊ฐ’์„ ๊ฑธ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Œ ๊ถŒํ•œ์˜ ์›์น™: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ •์€ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋งŒ์•ฝ ๊ณต๊ฒฉ์ด ์„ฑ๊ณตํ•˜๋”๋ผ๋„ ๊ณต๊ฒฉ์ž๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ”ผํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ: ์ƒ์„ธํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ๊ณต๊ฒฉ์ž์—๊ฒŒ ๊ณต๊ฒฉ์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "table 'users' does not exist"์™€ ๊ฐ™์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ๊ณต๊ฒฉ์ž์—๊ฒŒ 'users'๋ผ๋Š” ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์•Œ๋ ค์ฃผ๋ฏ€๋กœ ๊ณต๊ฒฉ์— ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ฑฐ๋‚˜ ์ตœ๋Œ€ํ•œ ์ถ”์ƒํ™”๋œ ์ •๋ณด๋งŒ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฉํ™”๋ฒฝ (WAF) ์‚ฌ์šฉ: WAF๋Š” ์•…์˜์ ์ธ ์›น ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ฐจ๋‹จํ•˜๋Š” ๋ณด์•ˆ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค. WAF๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ SQL Injection ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ์ฐจ๋‹จํ•˜์—ฌ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ SQL Injection ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋ณด์•ˆ ์—ฐ๊ตฌ์™€ ์ตœ์„ ์˜ ๋ณด์•ˆ ๊ด€ํ–‰์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ XSS ๊ณต๊ฒฉ์ด ๋ฌด์—‡์ด๊ณ , ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€

XSS(Cross-Site Scripting) ๊ณต๊ฒฉ์€ ์›น์‚ฌ์ดํŠธ์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ๋‹ค๋ฅธ ์›นํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ฑฐ๋‚˜ ์›น์‚ฌ์ดํŠธ์˜ ๋™์ž‘์„ ๋ณ€์กฐํ•˜๋Š” ๋“ฑ์˜ ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

XSS ๊ณต๊ฒฉ์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค: Stored XSS, Reflected XSS, ๊ทธ๋ฆฌ๊ณ  DOM-based XSS. Stored XSS๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์ด ๊ฒ€์ฆ ์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ณ , ์ดํ›„์— ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. Reflected XSS๋Š” URL์— ํฌํ•จ๋œ ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ๋ฐ˜์˜๋˜์–ด ์‹คํ–‰๋˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. DOM-based XSS๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด DOM์˜ ๊ตฌ์กฐ๋‚˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” XSS ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

XSS๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•:

์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ๋ฐ ์ด์Šค์ผ€์ดํ•‘: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์›น์‚ฌ์ดํŠธ์—์„œ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์ด์Šค์ผ€์ดํ•‘(ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์•ˆ์ „ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜)๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ๊ฐ•๋ ฅํ•œ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…(Content Security Policy, CSP): CSP๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ์ถœ์ฒ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. CSP๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์–ด๋–ค ์ถœ์ฒ˜์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ• ์ง€ ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP-only ์ฟ ํ‚ค ์‚ฌ์šฉ: HTTP-only ์ฟ ํ‚ค๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด XSS ๊ณต๊ฒฉ์œผ๋กœ ์ธํ•œ ์ฟ ํ‚ค ํƒˆ์ทจ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ง€์›์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, React์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์„ ์ด์Šค์ผ€์ดํ•‘ํ•˜์—ฌ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ CSRF ๊ณต๊ฒฉ์ด ๋ฌด์—‡์ด๊ณ , ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€

CSRF(Cross-Site Request Forgery)๋Š” ์›น ์‚ฌ์ดํŠธ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์„ ํƒํ•œ ํ–‰๋™์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ, ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ์ด์šฉํ•ด ๋น„์ •์ƒ์ ์ธ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

CSRF๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•:

SameSite ์ฟ ํ‚ค: ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋Š” SameSite ์ฟ ํ‚ค ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์ฟ ํ‚ค๊ฐ€ ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ A์— ๋กœ๊ทธ์ธํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด๋„, ์›น์‚ฌ์ดํŠธ B์—์„œ๋Š” A์˜ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

CSRF ํ† ํฐ: ์„œ๋ฒ„๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ๊ณ ์œ ํ•œ CSRF ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์„ธ์…˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ํ† ํฐ์„ ์š”์ฒญ์— ํฌํ•จ์‹œ์ผœ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ด ํ† ํฐ์ด ์š”์ฒญ๋งˆ๋‹ค ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” CSRF ํ† ํฐ์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด ๋ฐฉ๋ฒ•์ด CSRF ๊ณต๊ฒฉ์„ ๋ง‰๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๊ฒ€์ฆ๋œ Referrer ํ—ค๋” ์‚ฌ์šฉ: ์ด ๋ฐฉ๋ฒ•์€ HTTP ์š”์ฒญ ํ—ค๋”์˜ Referer๋ฅผ ํ™•์ธํ•ด ์š”์ฒญ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค์—์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ—ค๋” ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์™ธ์—๋„ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์ž˜ ๊ด€์ฐฐํ•˜๊ณ  ๋น„์ •์ƒ์ ์ธ ํŒจํ„ด์„ ํƒ์ง€ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•