DevLog ๐Ÿ˜ถ

[Spring] ์ž๋ฐ”์˜ inner class๋Š” ์Šคํ”„๋ง ๋นˆ์ด ๋  ์ˆ˜ ์žˆ์„๊นŒ? ๋ณธ๋ฌธ

Back-end/Spring

[Spring] ์ž๋ฐ”์˜ inner class๋Š” ์Šคํ”„๋ง ๋นˆ์ด ๋  ์ˆ˜ ์žˆ์„๊นŒ?

dolmeng2 2023. 4. 24. 12:25

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „

์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก ๊ณผ์ •์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๋‹ค๊ฐ€, inner class์˜ ๊ฒฝ์šฐ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ธ€์„ ๋ณด์•˜๋‹ค.

๋ญ”๊ฐ€ ๋“ฑ๋ก์ด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ ์•ˆ ๋œ๋‹ค๊ณ  ํ•ด์„œ ์ง์ ‘ ์‹คํ—˜์„ ํ•ด๋ณด์•˜๋‹ค ๐Ÿค”


โœ”๏ธ inner class์™€ static class

์šฐ์„ , ๋‘ ๊ฐ€์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ์žก๊ณ  ๊ฐ€์•ผ ํ•œ๋‹ค.

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

์ •ํ™•ํ•œ ๊ฐœ๋…์„ ์•Œ๊ธฐ ์œ„ํ•ด Oracle ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๐ŸŒฑ The Java programming language allows you to define a class within another class.
Such a class is called a nested class.

์ž๋ฐ”์—์„œ๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ 'nested class (์ค‘์ฒฉ ํด๋ž˜์Šค)'๋ผ๊ณ  ํ•œ๋‹ค.

Nested classes are divided into two categories: non-static and static.
Non-static nested classes are called inner classes.
Nested classes that are declared static are called static nested classes.

๊ทธ๋ฆฌ๊ณ , ์ด๋Ÿฌํ•œ ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, non-static nested class (inner class)์™€ static nested class๋กœ ๋‚˜๋‰œ๋‹ค.

class OuterClass {
    ...
    class InnerClass {
        ...
    }
    static class StaticNestedClass {
        ...
    }
}

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— inner class๊ฐ€ static class๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค. ์• ์ดˆ์— inner class์˜ ์ •์˜ ์ž์ฒด๊ฐ€ non-static ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

inner class๋Š” ๊ฒฝ์šฐ private๋กœ ์„ ์–ธ๋˜์—ˆ์–ด๋„, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ Outer class์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, static nested class์˜ ๊ฒฝ์šฐ Outer class์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

public class OuterClass {
    private int outerMember;
    
    public class InnerClass {
        public void test() {
            System.out.println(outerMember);
        }
    }
    public static class InnerStaticClass {
        public void test() {
            System.out.println(outerMember);
        }
    }
}

์‹ค์ œ๋กœ ํ™•์ธํ•ด๋ณด์ž. static nested class์˜ ๊ฒฝ์šฐ outer class์˜ ๊ฐ’์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Š” ๋‹น์—ฐํ•˜๋‹ค. static์œผ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๊ณผ non-static์œผ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ ์™ธ์—๋„ Outer class์˜ nested class์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” private, protected, public, ๊ทธ๋ฆฌ๊ณ  default (package-private)๋กœ ์„ ์–ธ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋ฉฐ, Outer class๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public ํ˜น์€ default๋กœ๋งŒ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

 

๐ŸŒฑ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ?

- ์˜๋ฏธ์ ์œผ๋กœ ๋น„์Šทํ•œ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๊ทธ๋ฃนํ™”๋ฅผ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด.

- ์บก์Šํ™” ์ด์  : nested class๊ฐ€ private์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ outer class์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋•Œ outer class์˜ ๋ณ€์ˆ˜๋ฅผ ์˜ค์ง nested class์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ตณ์ด ์™ธ๋ถ€๋กœ ๋…ธ์ถœ์‹œํ‚ฌ ํ•„์š” ์—†์ด private์œผ๋กœ ์„ ์–ธ๋œ outer class์˜ ํ•„๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์บก์Šํ™” ๊ด€์ ์—์„œ ์ข‹๋‹ค.

- ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€: ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์„ ์–ธ๋œ ์œ„์น˜๊ฐ€ ๊ฐ€๊น๋‹ค๋ฉด ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. (๋ฌผ๋ก , ์š”์ฆ˜์€ IDE๊ฐ€ ์ž˜ ๋‚˜์™€์„œ ์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ๋Š” ๋“œ๋ฌผ ๊ฒƒ ๊ฐ™์ง€๋งŒ)

 


โœ”๏ธ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด๋ณด๊ธฐ

์ž, ๊ทธ๋Ÿผ ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์„ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

@Component
public class OuterClass {
    public class InnerClass {
        public void test() {
        }
    }
    
    public static class InnerStaticClass {
        public void test() {
        }
    }
}

๋ฐ”๊นฅ์˜ OuterClass์— ๋Œ€ํ•ด์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์‹ค์ œ๋กœ ๋นˆ์ด ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

(์—ฌ๊ธฐ์„œ ์ด๋ฆ„ ์ž์ฒด๋งŒ inner static class๋กœ ์ง€์ •ํ–ˆ์„ ๋ฟ, static class๋Š” inner class๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž!)

@SpringBootApplication
public class StudyApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext ac = SpringApplication.run(StudyApplication.class, args);
		OuterClass bean = ac.getBean(OuterClass.class);
		System.out.println(bean);
	}
}

๋‹น์—ฐํ•˜๊ฒŒ๋„ ์™ธ๋ถ€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋นˆ์œผ๋กœ ์ž˜ ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@Component
public class OuterClass {
    
    @Component
    public class InnerClass {
        public void test() {
        }
    }
    
    @Component
    public static class InnerStaticClass {
        public void test() {
        }
    }
}

๊ทธ๋ ‡๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ inner class์™€ inner static class์— ๋Œ€ํ•ด์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘์— ๋Œ€ํ•ด์„œ ๋นˆ์œผ๋กœ ์ž˜ ๋“ฑ๋ก๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

String[] names = ac.getBeanDefinitionNames();
for (String name: names) {
    if (name.contains("InnerClass") || name.contains("InnerStaticClass")) {
        System.out.println(ac.getBean(name));
    }
}

 


 

โœ”๏ธ ์™œ ๋‘˜ ๋‹ค ๋“ฑ๋ก์ด ์ž˜ ๋˜๋Š” ๊ฒƒ์ผ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ static nested class์˜ ๊ฒฝ์šฐ ์‚ฌ์‹ค์ƒ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์— ์„ ์–ธํ•œ ๊ฒƒ์ผ ๋ฟ์ด์ง€, ์‹ค์ œ๋กœ ์ทจ๊ธ‰๋˜๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค. ์œ„์—์„œ ๋งํ–ˆ๋˜ nested class๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์ ์„ ์ฆ๋Œ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ ๋ฟ์ด๋ฉฐ, ์‹ค์ œ๋กœ public์œผ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€๋กœ ๋นผ์„œ static ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“  ๋Œ€์ฒด๋  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, inner class์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ outer class์˜ ์ธ์Šคํ„ด์Šค๋กœ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์‹œ InnerStaticClass์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ public์œผ๋กœ ๋Œ๋ฆฐ ์ƒํƒœ์ด๋‹ค.

์œ„์™€ ๊ฐ™์ด, inner static class์˜ ๊ฒฝ์šฐ ๋‹จ๋…์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด outer class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();

์•„๋‹ˆ๋ฉด ์•„์˜ˆ Outer class์˜ ์–ด๋– ํ•œ ๋ฉ”์„œ๋“œ์—์„œ Inner class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์Šคํ”„๋ง ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด๋ณด์ž.

๋นˆ์„ ๋งŒ๋“ค ๋•Œ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋นˆ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ, inner class์˜ ๊ฒฝ์šฐ ๋…์ž์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋Š” ๊ฒŒ ๋งž๋‹ค.

 

??? ๊ทผ๋ฐ ๊ทธ๋Ÿฌ๋ฉด ์œ„์—์„œ๋Š” ์™œ ๋๋˜ ๊ฑธ๊นŒ?

 

์•ž์„œ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Inner class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, outer class์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์šฐ๋ฆฌ๋Š” Outer class๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋๋˜ ๊ฒƒ์„ ํ™•์ธํ–ˆ์—ˆ๋‹ค. 

์Šคํ”„๋ง์—์„œ๋Š” Outer class๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋นˆ์„ ์ด์šฉํ•ด์„œ inner class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค.

 

์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ดค๋Š”๋ฐ, ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” ์ •๋ง ์–ด์ง€๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ถฉ๋งŒ ๋ณด์ž. 

์—ฌ๊ธฐ์„œ ๋ณด๋ฉด, ํŒŒ๋ผ๋ฏธํ„ฐ ์นด์šดํŠธ๋ผ๋Š” ๊ฒƒ์„ ์„ธ๋Š”๋ฐ, Inner Class์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์นด์šดํŠธ๋Š” 1์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ๋ฐ›์•„์˜ค๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ name์„ ๋ณด๋ฉด ๋ฐ”๊นฅ ํด๋ž˜์Šค ์ •๋ณด์ธ OuterClass๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ง€๋ง‰์— Inner class์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋‚ด๋ถ€ ์ธ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋กœ OuterClass์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

 


 

โœ”๏ธ Outer class๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด inner class๋„ ์•ˆ ๋ ๊นŒ?

public class OuterClass {

    @Component
    private class InnerClass {
        public void test() {
        }
    }

    @Component
    private static class InnerStaticClass {
        public void test() {
        }
    }
}

์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ, OuterClass์˜ @Component ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ๋ ค๋ณด์•˜๋‹ค.

์•„๊นŒ์ฒ˜๋Ÿผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค๊ฐ€๋ฉฐ ์ฐพ์€ ๊ฒฐ๊ณผ์ด๋‹ค.

InnerStaticClass๋งŒ ๋“ฑ๋ก์ด ๋˜์—ˆ๊ณ , InnerClass๋Š” ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 


๐ŸŒฑ ๊ฒฐ๋ก 

nested class๋Š” non-static nested class (=inner class)์™€ static nested class๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.
static nested class์˜ ๊ฒฝ์šฐ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
inner class์˜ ๊ฒฝ์šฐ outer class๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ์–ด์•ผ๋งŒ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
Comments