๐Ÿ“•JAVA

[JAVA] String

๋น™๋””์šฉ 2024. 4. 20.

- String์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

String str1 = "hello"; //์Œ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ
String str2 = new String("hello"); //๊ฐ์ฒด์‚ฌ์šฉ

- String์€ ํด๋ž˜์Šค๋‹ค. int, boolean๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธํ˜•์ด ์•„๋‹Œ ์ฐธ์กฐํ˜•์ด๋‹ค.

- ๋ฌธ์ž์—ด์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Œ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌธ์ž์—ด์„ ๊ฐ์‹ธ๋ฉด ์ €์ ˆ๋กœ new String()์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

1. String ํด๋ž˜์Šค ๊ตฌ์กฐ

public final class String {
    //์†์„ฑ(ํ•„๋“œ)
    private final char[] value;  //๋ฌธ์ž ๋ฐ์ดํ„ฐ ์ž์ฒด๋Š” char[]์— ๋ณด๊ด€๋œ๋‹ค.
    
    //๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)
    public String concat(String str) {...}
    public int length() {...}
}

- ํด๋ž˜์Šค์ด๋ฏ€๋กœ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง

- ์ž๋ฐ” 9 ์ดํ›„๋ถ€ํ„ฐ๋Š” char์ด ์•„๋‹Œ byte ๋ฐฐ์—ด์„ ์‚ฌ์šฉ

   why? char์€ 2byte๋ฅผ ์ฐจ์ง€ํ•˜์ง€๋งŒ, ์˜์–ด, ์ˆซ์ž๋Š” 1byte๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด

1) String ์ฃผ์š” ๋ฉ”์„œ๋“œ

- length() : ๋ฌธ์ž์—ด ๊ธธ์ด ๋ฐ˜ํ™˜

- charAt(int index) : ํŠน์ • ์ธ๋ฑ์Šค์˜ ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜

- subString(int beginIndex, int endIndex) : ๋ฌธ์ž์—ด์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜

- indexOf(String str) : ํŠน์ • ๋ฌธ์ž์—ด์ด ์‹œ์ž‘๋˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜

- toLowerCase(), toUpperCase() : ๋ฌธ์ž์—ด์„ ์†Œ๋ฌธ์ž ๋˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ๋ฐ˜ํ™˜

- trim() : ๋ฌธ์ž์—ด ์–‘ ๋์˜ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ

- concat(String str) : ๋ฌธ์ž์—ด์„ ๋”ํ•จ

์ด์™ธ์—๋Š” ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ 

2) String ํด๋ž˜์Šค์™€ ์ฐธ์กฐํ˜•

- String์€ ์ฐธ์กฐํ˜•์ด์ง€๋งŒ ๋„ˆ๋ฌด ์ž์ฃผ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— + ์—ฐ์‚ฐ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. String ํด๋ž˜์Šค - ๋น„๊ต

- String ํด๋ž˜์Šค๋ฅผ ๋น„๊ตํ•  ๋•Œ์—๋Š” equals()๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 - ์ž๋ฐ”์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” equals(), toString()์€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋˜์–ด์žˆ๋‹ค.

1) ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด, ๋ฌธ์ž์—ด ํ’€

String class StringPrc{
	public static main(String[] args){
    
        String str1 = "hello";
    	String str2 = "hello";
    
    	System.out.println(str1 == str2); //true
    	System.out.println(str1.equals(str2)); //true
	}
}

 

- String str1 = "hello"์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋ฌธ์ž์—ด ํ’€์„ ์‚ฌ์šฉํ•œ๋‹ค.

- ์ž๋ฐ”๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์ด ์žˆ์œผ๋ฉด ๋ฌธ์ž์—ด ํ’€์— String ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ , ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ์žˆ์œผ๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

- String str1 = "hello"์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ํ’€์—์„œ "hello"๋ฅผ ์ฐพ๊ณ  ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ(x003)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- String str2 = "hello"๋„ "hello๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ทธ ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ์ธ x003์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- ๋•Œ๋ฌธ์— str1 == str2๊ฐ€ true๊ฐ€ ๋œ๋‹ค.

- ๊ทธ๋Ÿฌ๋‚˜ ๋„˜์–ด์˜ค๋Š” ๋ฌธ์ž์—ด์ด ๋ฆฌํ„ฐ๋Ÿด์ผ์ง€, ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜์ ์œผ๋กœ equals()๋กœ ๋น„๊ต๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

3. String ํด๋ž˜์Šค - ๋ถˆ๋ณ€ ๊ฐ์ฒด

- String์€ ๋ถˆ๋ณ€ ๊ฐ์ฒด์ž„.

 - ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๊ฐ’์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

- String์ด ๋ถˆ๋ณ€์ด ์•„๋‹ˆ๋ฉด String pool์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ๋„ ์žˆ๊ณ , ์ด๋Š” ์ด์ „์— ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

4. StringBuilder - ๊ฐ€๋ณ€ String

1)  ๋ถˆ๋ณ€์ธ String ํด๋ž˜์Šค์˜ ๋‹จ์ 

- ๋ฌธ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งˆ๋‹ค ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค

String str = "A" + "B" + "C"; //๋ชฉํ‘œ : ABC
String str = String("A") + String("B") + String("C"); 
String str =  String("AB") + String("C"); // ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” AB ์ƒ์„ฑ
String str = String("ABC"); //์›ํ•˜๋Š” ๊ฐ’

2) StringBuilder

- ์ž๋ฐ”๋Š” StringBuilder๋ผ๋Š” ๊ฐ€๋ณ€ String์„ ์ œ๊ณตํ•ด ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ (์‚ฌ์šฉ์‹œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฃผ์˜ํ•ด์•ผํ•จ)

- StringBuilder ๋‚ด๋ถ€์—๋Š” final์ด ์—†๋‹ค.

public class StringBuilderMAin {
	public static void main(String[] args) {
    	StringBuilder sb = new String Builder();
        
        sb.append("A");
        sb.append("B");
        sb.append("C");
        
        System.out.println(sb); //ABC
        
        sb.insert(3, "Java");
        System.out.println(sb); //ABCJava
        
        sb.delete(3, 7);
        System.out.println(sb); //ABC
        
        sb.reverse();
        System.out.println(sb); //ABC
        
        //StringBuilder -> String
        String string = sb.toString();
        System.out.println(string); //๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ String์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ€๋Šฅ, ๋ถˆ๋ณ€
	}
}

 - String์€ ๋ถˆ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๊ณ  ๊ธฐ์กด ๊ฐ์ฒด๋Š” ๋ฒ„๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์™€ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋” ๋งŽ์ด ์†Œ๋ชจ๋œ๋‹ค.

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

- ๋‹จ StringBuilder๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‚ฌ์ด๋“œ ์ดํŒฉํŠธ๋ฅผ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

5. String ์ตœ์ ํ™”

1) ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ์ตœ์ ํ™”

- ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ๋”ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ž๋™์œผ๋กœ ํ•ฉ์ณ์ค€๋‹ค.

String s1 = "Hello"+" World"; //Hello World!

2) String ๋ณ€์ˆ˜ ์ตœ์ ํ™”

- String ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์•ˆ์— ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์—†์–ด ๋‹จ์ˆœํ•˜๊ฒŒ ํ•ฉ์น  ์ˆ˜ ์—†๋‹ค.

String result = str1 + str2;
//์ปดํŒŒ์ผ (Example)
String result = new StringBuilder().append(str1).append(str2).toString();

3) String ์ตœ์ ํ™”๊ฐ€ ์–ด๋ ค์šด ๊ฒฝ์šฐ

1- ๋ฃจํ”„์•ˆ์—์„œ ๋ฌธ์ž์—ด์„ ๋”ํ•˜๋Š” ๊ฒฝ์šฐ

String class LoopString {
	public Static main(String[] args){
    	
        long startTime = System.currenTimeMillis();
        String result = "";
        
        for(int i = 0; i<10000; i++){
        	result += "Hello Java";
		}
        long endTime = System.currenTimeMillis();
        
        System.out.println(result); //Hello Java X 100000
        System.out.println(endTime - startTime) //์˜ค๋ž˜๊ฑธ๋ฆผ
//์ตœ์ ํ™” (Example)
String result = "";
for(int i = 0; i < 100000; i++) {
	result = new StringBuilder().append(result).append("Hello JAVA").toString();
} // ๋ฐ˜๋ณต ํšŸ์ˆ˜๋งŒํผ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ

- ๋ฐ˜๋ณต๋ฌธ์˜ ๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ๋Š” ๋ฐ˜๋ณต ํšŸ์ˆ˜๋งŒํผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

- ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์€ ๋Ÿฐํƒ€์ž„์— ์—ฐ๊ฒฐํ•  ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜์™€ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‚ด์šฉ์ด ๊ฒฐ์ •๋˜๋Š”๋ฐ,

   ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฐ˜๋ณต์ด ์ผ์–ด๋‚ ์ง€ ๋ฌธ์ž์—ด์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”๊ฐ€ ์–ด๋ ต๋‹ค.

//StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐ๊ฐ€๋Šฅ
String class LoopStringBuilder {
	public Static main(String[] args){
    	
        long startTime = System.currenTimeMillis();
        StringBuilder sb = new StringBuilder();
        
        for(int i = 0; i<10000; i++){
        	sb.append("Hello Java");
		}
        String result = sb.toString();
        long endTime = System.currenTimeMillis();
        
        System.out.println(result); //Hello Java X 100000
        System.out.println(endTime - startTime) //๊ฑฐ์˜ ์ฆ‰์‹œ ์ด๋ฃจ์–ด์ง

- ๋ฌธ์ž์—ด์„ ํ•ฉ์น  ๋•Œ ๋Œ€๋ถ€๋ถ„ ๊ฒฝ์šฐ ์ตœ์ ํ™”๊ฐ€ ๋˜๋ฏ€๋กœ +๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” StringBuilder๊ฐ€ ๋” ์ข‹๋‹ค.

    - ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ๋ฐ˜๋ณตํ•ด์„œ ๋ฌธ์ž๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ

    - ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ๋ฌธ์ž์—ด์„ ๋™์ ์œผ๋กœ ์กฐํ•ฉํ•  ๋•Œ

    - ๋ณต์žกํ•œ ๋ฌธ์ž์—ด์˜ ํŠน์ • ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ

    - ๋งค์šฐ ๊ธด ๋Œ€์šฉ๋Ÿ‰ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ

5. Method Chaining

public class ValueAdder{
	
    private int value;
    
    public ValueAdder add(int addValue) {
    	value += addValue; //add()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด value์— ๊ฐ’์„ ๋ˆ„์ ํ•œ๋‹ค.
        return this; //์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
	}
    
    public int getValue() {
    	return value;
	}
}
public class MethodChainingMain {
	public static void main(String args[]){
    	
        ValueAdder adder = new ValueAdder();
        adder.append(1);
        adder.append(2);
        adder.append(3); 
        //add()๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•ด์„œ ๊ฐ’์„ ๋ˆ„์ ํ•˜๊ณ  ๋”ํ•จ
        // add()๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ์‚ฌ์šฉ X
        
        int result = add.getValue();
        System.out.println(result); // 6
	}
}

- add() ๋งค์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’ ์‚ฌ์šฉ

public class MethodChainingMain {
	public static void main(String args[]){
    	
        ValueAdder adder = new ValueAdder(); //x001
        ValueAdder adder1 = adder.add(1); //x001
        ValueAdder adder2 = adder.add(2); //x001
        ValueAdder adder3 = adder.add(3); //x001
        
        int result = adder3.getValue();
        System.out.println(result); // 6
	}
}

- add() ๋ฉ”์„œ๋“œ๋Š” ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ด๋ฅผ adder1, adder2,  adder3์— ๋ณด๊ด€

- ๋”ฐ๋ผ์„œ adder1,2,3๋Š” ๋ชจ๋‘ ๊ฐ™์€ ์ฐธ์กฐ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

- ๋” ๋ณต์žกํ•ด๋ณด์ด๋Š” add()๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ (๋ฉ”์„œ๋“œ ์ฒด์ด๋‹)

.. ์ƒ๋žต
public static void main(String[] args) {
	
    ValueAdder adder = new ValueAdder();
    int result = adder.adder(1).adder(2).adder(3).getValue();
    //int result = x001.adder(1).adder(2).adder(3).getValue();
    //int result = x001.adder(2).adder(3).getValue();
    //...
    //int result = x001.getValue();
    
    System.out.println(result); //6
}

- .์„ ์ฐ๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์† ์—ฐ๊ฒฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋งˆ์น˜ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ ์ด๋Ÿฐ ๊ธฐ๋ฒ•์„ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์ด๋ผ ํ•œ๋‹ค.

- ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์€ ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

1)String Builder์™€ Method Chain

- StringBuilder๋Š” Method Chaining ๊ธฐ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

- StringBuilder์—์„œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ๋„ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ๊ธฐ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž๊ธฐ ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

- ์•ž์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์ค„์ด๊ธฐ

public class StringBuilderMAin {
	public static void main(String[] args) {
    	
        StringBuilder sb = new String Builder();
        String result = sb.append("A").append("B").append("C").toString();
        
        System.out.println(result); //ABC

	}
}

 

 

- ์ฐธ๊ณ  : ๊น€์˜ํ•œ์˜ ์‹ค์ „ ์ž๋ฐ” - ์ค‘๊ธ‰ 1ํŽธ

 

 

 

 

 

๋Œ“๊ธ€