DevLog ๐ถ
[Spring] ์๋ฐ์ inner class๋ ์คํ๋ง ๋น์ด ๋ ์ ์์๊น? ๋ณธ๋ฌธ
[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์ ์ธ์คํด์ค๋ก ์กด์ฌํด์ผ ํ๋ฉฐ, ์ง์ ์ ์ผ๋ก ์ฐ๊ด๊ด๊ณ๊ฐ ์์ด์ผ๋ง ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์์ ๊ฐ์ด, 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๊ฐ ๋น์ผ๋ก ๋ฑ๋ก์ด ๋์ด ์์ด์ผ๋ง ๋ฑ๋ก์ด ๊ฐ๋ฅํ๋ค.