Java Nested Class
Java Nested Class ์ข ๋ฅ
๐ Nested Class
Java์๋ ์ค์ฒฉ ํด๋์ค๋ผ๋๊ฒ ์กด์ฌํ๋ค. C++์๋ ์กด์ฌํ์ง๋ง, ๊ทธ ์ข ๋ฅ๊ฐ ๋ ๋ค์ํ๋ค. Java Nested Class๋ ์ค๋ผํด docs๋ฅผ ์ฐธ๊ณ ํ๋ค. https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
๐ฅ Static Nested Class
๋ง์ ์ฌ๋๋ค์ด Static Nested Class์ ๋ํด Static Inner Class๋ก๋ ์ง์นญ์ ํ๋๋ฐ ๊ณต์ ์ฉ์ด๋ Static Nested Class๊ฐ ๋ง๋ ๊ฒ ๊ฐ๋ค.
Terminology: Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes. from https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
Nested Class๋ผ๋๊ฒ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๋ด์ฉ์ ๊ฐ์ Class์ ๋ฌถ๊ธฐ ์ํด ๋์จ ๊ฐ๋ ์ธ๋ฐ, ์๋ฐ๋ Static Nested Class๋ผ๋ ๊ฐ๋ ์ ๋ง๋ค์ด์ ์ธ๋ถ ํด๋์ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง์ง ์๋ Nested Class๋ฅผ ๋ง๋ค์๋ค. ์ด๋ก์จ ์ป๋ ์ฅ์ ์ GC๊ฐ ์์ ํ์๋ฅผ ๋ ์ฝ๊ฒ ํ ์ ์๊ณ (์ธ๋ถ ์ฐธ์กฐ x), ๋ Inner Class๋ก ๋ง๋๋ ์ธ์คํด์ค ์์ฑ ์ค๋ฒํค๋๊ฐ ๋ ์์ ์ฅ์ ์ด ์๋ค.
๐ฅ Inner Class
There are two special kinds of inner classes: local classes and anonymous classes. from https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
docs์์๋ class์์ ์ ์ธํ class๋ Inner Class๋ผ๊ณ ์ค๋ช ํ๋ค. ๊ทธ๋ฆฌ๊ณ Inner Class์ 2๊ฐ์ง ํน๋ณ ์ผ์ด์ค๋ก local class์ anonymous class๊ฐ ์กด์ฌํ๋ค๊ณ ์ค๋ช ๋์ด ์๋ค. Class์์ ๋จ์ Class์ ์ด๋ฆ๋ ์ ํด์ค์ผ ํ ๊ฒ ๊ฐ์๋ฐ ์์ผ๋.. ํธ์์ ํด๋์ค์์ ๊ทธ๋ฅ ํด๋์ค๋ Inner Class, ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง๋ ์ ํํ๊ฒ๋ Inner Class๊ฐ ๋ง์ง๋ง ์ฌ์ฉ ์ํฉ์ ๋ง๊ฒ ์ ํํ ๋ช ์นญ์ ๋ง์ถ์ด Local Class, Anonymous Class๋ผ๊ณ ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
Inner Class๋ ์ ์ธ ๋ฐฉ๋ฒ๊ณผ ์ ์ธ ์์น์ ๋ฐ๋ผ 3๊ฐ์ง๋ก ๋๋๋ค.
- Inner Class
class ์์ class
class A {
class B {
}
}
- Local Class
method ์์ class
class A {
void showExample() {
class B {
}
}
}
- Anonymous Class
java๋ top-level class๋ static class๊ฐ ์๋๋ฉด static member field๋ฅผ inner class์ method ์์์ ํ๋ฝํ์ง ์๋๋ค. ๊ทธ๋ฐ๋ฐ interface๋ inherently staticํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋์์ interface๋ฅผ ์ ์ธํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ์ง์ ์จ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ Anonymous Class๋ฅผ ์ด์ฉํ๋ฉด, Class์์์ Interface๋ฅผ ์ ์ธํ๊ณ method์์์ Anonymous Class๋ฅผ ์ฌ์ฉํ ์ ์๋ค. (Anonymous Class๋ expression์ด๋ผ๊ณ docs์ ์ฐ์ฌ์ ธ ์๋ค. new operator๋ฅผ ํตํ ๊ฐ์ฒด ์์ฑ ํํ์)
class A {
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
void showExample() {
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
}
}