-
์ค์ฒฉํด๋์ค(Nested class)๋ ๋ฌด์์ธ๊ฐ?๊ฐ๋ฐ/Java 2022. 4. 7. 00:54
์๋ ํ์ธ์, ๋ค๋ผ๋ฏธ๐ฟ๏ธ์ ๋๋ค :)
์ค๋์ ์ค์ฒฉํด๋์ค๋ผ๊ณ ๋ถ๋ฆฌ๋ Nested class์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
ํด๋น ๋ด์ฉ์ ์๋ฐ์์ 1๊ถ, chapter16์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
Nested Class
์๋ฐ์์๋ ํด๋์ค ์์ ํด๋์ค๊ฐ ๋ค์ด๊ฐ ์ ์๋๋ฐ, ์ด๋ฌํ ํด๋์ค๋ฅผ "Nested class"๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ํ๊ตญ์ด๋ก๋ "์ค์ฒฉ ํด๋์ค"๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค.
Nested class๋ static์ผ๋ก ์ ์ธ๋์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ "Static nested ํด๋์ค"์ "๋ด๋ถ(inner) ํด๋์ค"๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๋ง์ฝ ํด๋์ค๋ฅผ ์ ์ธํ ๋ static์ผ๋ก ์ ์ธ์ด ๋์๋ค๋ฉด, ๊ทธ ํด๋์ค๋ static nested ํด๋์ค๊ฐ ๋๊ณ , static์ด ์์ผ๋ฉด ๊ทธ๋ฅ ๋ด๋ถ ํด๋์ค๋ผ๊ณ ํฉ๋๋ค.
๋ด๋ถ ํด๋์ค๋ ๋ค์ ๋ ๊ฐ์ง๋ก ๋๋๋๋ฐ, ์ด๋ฆ์ด ์๋ ๋ด๋ถ ํด๋์ค๋ "๋ก์ปฌ(ํน์ ์ง์ญ) ๋ด๋ถ ํด๋์ค(local inner class)"๋ผ๊ณ ํ๊ณ , ์ด๋ฆ์ด ์๋ ํด๋์ค๋ฅผ "์ต๋ช ๋ด๋ถ ํด๋์ค(anonymous inner class)"๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก๋ ๊ฐ๋จํ๊ฒ ์ค์ฌ์ ๊ฐ๊ฐ "๋ด๋ถ ํด๋์ค"์ "์ต๋ช ํด๋์ค"๋ก ๋ถ๋ฆ ๋๋ค. ์์ผ๋ก ๋ก์ปฌ ๋ด๋ถ ํด๋์ค๋ ๊ทธ๋ฅ ๋ด๋ถ ํด๋์ค๋ก, ์ต๋ช ๋ด๋ถ ํด๋์ค๋ ์ต๋ช ํด๋์ค๋ก ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
ํ๋ก ํ์ธํ๊ธฐ
๋์ถฉ Nested class์ ๊ตฌ๋ถ์ ์ดํด๋ณด์์ผ๋ ๋ค์ ๋ด์ฉ์ ๋ค๋ฃจ๊ธฐ ์ ์ ์์ผ๋ก ๋ฐฐ์ธ ๋ด์ฉ๋ค์ ๊ฐ๋จํ๊ฒ ํ๋ก ์์ฝํด๋ณด์์ต๋๋ค. ์ญ ํ์ด๋ณด๋ฉด์ ์ด๋ค ๋ด์ฉ๋ค์ ๋ค๋ฃฐ์ง ์ง์ํด๋ณด์๊ณ , ๋ ์ด ๊ธ์ ๋ค ์ฝ๊ณ ๋์ ์ ๋ฆฌ์ฉ์ผ๋ก ํ๋ฒ ๋ ๋ณด๊ณ ํ์ธํด๋ณด์๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Nested class ๊ตฌ๋ถ Static nested class (static ์ ์ธ O) inner(๋ด๋ถ) class (static ์ ์ธ X) Local inner class
(๋ด๋ถ ํด๋์ค)Anonymous inner class (์ต๋ช ํด๋์ค) ๊ฐ์ฒด ์์ฑ ex)
OuterOfStatic.StaticNested staticNested = new OuterOfStatic.StaticNested();
staticNested.setValue(3);ex)
OuterOfInner outer = new OuterOfInner();
OuterOfInner.Inner inner = outer.new Inner();
inner.setValue(3);ex)
EventListener listener
= new EventListener() {
@Override
public void onClick() {
System.out.println("Magic
Button Clicked !!!");
}
};์ฐธ์กฐ ๊ฐ๋ฅ ๋ณ์ - (static nested -> ๊ฐ์ธ๋ ํด๋์ค)
๊ฐ์ธ๊ณ ์๋ ํด๋์ค์ static ๋ณ์๋ง ์ฐธ๊ณ ํ ์ ์๋ค. Static nested ํด๋์ค๊ฐ static์ผ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค์ static ํ์ง ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์๋ ์๋ค. ๋ง์ฝ ์ฐธ์กฐํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด, ์ปดํ์ผ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ด๋ป๊ฒ๋ผ๋ ์ฌ์ฉํ ์๋ ์๋ค.
- (๊ฐ์ธ๋ ํด๋์ค -> static nested) ๊ฐ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ๊ทธ ๊ฐ์ ์ฐธ์กฐํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค. ๊ทธ ๊ฐ์ด private๋ผ๊ณ ํ ์ง๋ผ๋ ๋ชจ๋ ์ ๊ทผํ ์ ์๋ค.- ๋ชจ๋ ๊ฐ๋ฅ ์ฌ์ฉ ๋ชฉ์ - ์์ค์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ ์ถ์ ๋
- ํ ๊ณณ์์๋ง ์ฌ์ฉ๋๋ ํด๋์ค๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ด์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ ๋- ์์ค์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ ์ถ์ ๋
- ์บก์ํ๊ฐ ํ์ํ ๋(๋ด๋ถ ๊ตฌํ์ ๊ฐ์ถ๊ณ ์ถ์ ๋)์ง๊ธ๋ถํฐ๋, ์์์ ์ ๋ฆฌํ ๋ด์ฉ์ ์์ ์ฝ๋๋ฅผ ํตํด ํ์ด์ ์ค๋ช ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Static nested ํด๋์ค์ ํน์ง
์๋์ ์์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ์ด ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ฉด ์ด๋ค ํด๋์ค๊ฐ ๋ง๋ค์ด์ง๊น์?
package nested; public class OuterOfStatic { static class StaticNested{ private int value = 0; public int getValue(){ return value; } public void setValue(int value){ this.value = value; } } }
์ปดํ์ผํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ํด๋์ค๊ฐ ๋ง๋ค์ด์ง๋๋ค.
OutOfStatic.class OutOfStatic$StaticNested.calss
Nested ํด๋์ค๋ ์์์ ๋ณด์๋ ๊ฒ ์ฒ๋ผ ๊ฐ์ธ๊ณ ์๋ ํด๋์ค ์ด๋ฆ $ Nested ํด๋์ค์ ์ด๋ฆ์ผ๋ก ํ๊ธฐ๊ฐ ๋๊ณ , ๋ณ๋์ ํด๋์ค ํ์ผ๋ก ๋ง๋ค์ด์ง๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด StaticNested ํด๋์ค์ ๊ฐ์ฒด๋ ์ด๋ป๊ฒ ์์ฑํ ์ ์์๊น์?
package nested; public class NestedSample { public static void main(String[] args){ NestedSample sample = new NestedSample(); sample.makeStaticNestedObject(); } public void makeStaticNestedObject(){ OuterOfStatic.StaticNested staticNested = new OuterOfStatic.StaticNested(); staticNested.setValue(3); System.out.println(staticNested.getValue()); } }
์ด๋ ๊ฒ Static Nested ํด๋์ค๋ฅผ ๋ง๋ค์์ ๋ ๊ฐ์ฒด ์์ฑ์ ํด๋์ค ํ์ผ ์ด๋ฆ์ฒ๋ผ ์ค๊ฐ์ $๋ฅผ ์ฐ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์ธ๊ณ ์๋ ํด๋์ค ์ด๋ฆ ๋ค์ .(์ )์ ์ฐ๊ณ ์ฐ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ดํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ผ๋ฐ ํด๋์ค์ ๋์ผํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Static nested class๋ฅผ ์ ์ฌ์ฉํ ๊น์?
์๋ฐ์์ Static nested class๋ฅผ ์ฐ๋ ์ด์
์ผ๋ฐ์ ์ผ๋ก Static nested ํด๋์ค๋ฅผ ๋ง๋๋ ์ด์ ๋ ํด๋์ค๋ฅผ ๋ฌถ๊ธฐ ์ํด์์ ๋๋ค.
๋ง์ฝ ํ๊ต๋ฅผ ๊ด๋ฆฌํ๋ School์ด๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๋ํ์ ๊ด๋ฆฌํ๋ University๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์์ ๋๋ฅผ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ Student๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด School์ ํ์์ธ์ง University์ ํ์์ธ์ง๊ฐ ๋ถ๋ถ๋ช ํด์ง๋๋ค. ํ์ง๋ง ๋ง์ฝ School ๋ด์ static nested ํด๋์ค์ธ student๋ฅผ ๋ง๋ ๋ค๋ฉด, ์ด ํด๋์ค์ ์ฉ๋๊ฐ ๋ณด๋ค ์ ํํด์ง๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฝ์ฐ์ SchoolStudent๋ผ๋ ์์ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ ๋์ง๋ง, ํ์ํ๋ค๋ฉด ์ด๋ ๊ฒ ๋ง๋ค ์๋ ์๋ค๋ ๋ง์ ๋๋ค. ๊ฒ๋ค๊ฐ School.Student ํด๋์ค๋ School์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ University ํด๋ ์ค์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
University
public class University{ static class Student{ } }
School
public class School{ static class Student{ } }
๊ทธ๋์ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ์ ์ฌํ์ง๋ง, ๋ด๋ถ์ ์ผ๋ก ๊ตฌํ์ด ๋ฌ๋ผ์ผ ํ ๋ ์ด์ ๊ฐ์ด static nested ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ด๋ถ ํด๋์ค์ ์ต๋ช ํด๋์ค
์ด๋ฒ์๋ ๋ด๋ถ ํด๋์ค์ ์ต๋ช ํด๋์ค์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
package nested; public class OuterOfInner { class Inner { private int value = 0; public int getValue(){ return value; } public void setValue(int value){ this.value = value; } } }
์์ ์์ ์์ ์ ์ธํ๋ StaticNested์ Inner ํด๋์ค์ ๋ด์ฉ์ ๋์ผํฉ๋๋ค. ํ์ง๋ง, Inner ํด๋์ค์ ์ ์ธ๋ถ์๋ static ์ ์ธ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ์ด Inner ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ๋ค๋ฆ ๋๋ค.
package nested; public class InnerSample { public static void main(String[] args){ InnerSample sample = new InnerSample(); sample.makeInnerObject(); } public void makeInnerObject(){ OuterOfInner outer = new OuterOfInner(); OuterOfInner.Inner inner = outer.new Inner(); inner.setValue(3); System.out.println(inner.getValue()); } }
์๋์ ๋ ์ค์ ๋ณด๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ํ์ง๋ง, ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. Inner ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ ์๋ ๋จผ์ Inner ํด๋์ค๋ฅผ ๊ฐ์ธ๊ณ ์๋ OuterOfInner๋ผ๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ outer๋ผ๋ ๊ฐ์ฒด์ด๋ค. ๊ทธ๋ฆฌ๊ณ , ์ด outer๋ผ๋ ๊ฐ์ฒด๋ฅผ ํตํด์ Inner ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด์ ๊ฐ์ด Inner ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ณต์กํ๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์ ๋ง๋ค์ด์ก์๊น์?
์๋ฐ์์ Inner class๋ฅผ ์ฐ๋ ์ด์
์ด๋ฌํ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋๋ ์ด์ ๊ฐ ์บก์ํ ๋๋ฌธ์ ๋๋ค. ํ๋์ ํด๋์ค์์ ์ด๋ค ๊ณตํต์ ์ธ ์์ ์ ์ํํ๋ ํด๋์ค๊ฐ ํ์ํ๋ฐ ๋ค๋ฅธ ํด๋์ค์์๋ ๊ทธ ํด๋์ค๊ฐ ์ ํ ํ์๊ฐ ์์ ๋ ์ด๋ฌํ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํฉ๋๋ค. ๋ด๋ถ ํด๋์ค๋ GUI ๊ด๋ จ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
GUI์์ ๋ด๋ถ ํด๋์ค๋ค์ด ๋ง์ด ์ฌ์ฉ๋๋ ๋ถ๋ถ์ ๋ฆฌ์ค๋(Listener)๋ผ๋ ๊ฒ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, ํค๋ณด๋๋ฅผ ์ ๋ ฅํ ๋์๋ ๋ชจ๋ ์ด๋ฒคํธ(Event)๋ผ๋ ๊ฒ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ์ด๋ค ๋ฒํผ์ด ๋๋ ธ์ ๋ ํด์ผ ํ๋ ์์ ์ ์ ์ํ๊ธฐ ์ํด์ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ค ๋ฒํผ์ด ๋๋ ธ์ ๋ ์ํํด์ผ ํ๋ ์์ ์ ๋๋ถ๋ถ ์์ดํฉ๋๋ค. ๊ทธ๋ฌ๋, ํ๋์ ๋ณ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค๋ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ํจ์ฌ ํธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ "์ต๋ช ํด๋์ค"๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์ต๋ช ์ด๋ผ๋ ๊ฒ์ ์์ด๋ก Anonymous๋ผ๊ณ ํ๊ณ , ์๋ฐ์์ ์ต๋ช ํด๋์ค๋ ๋ง ๊ทธ๋๋ก ์ด๋ฆ์ด ์๋ ํด๋์ค์ ๋๋ค.
package nested; public class MagicButton { public MagicButton(){ } private EventListener listener; public void setListener(EventListener listener){ this.listener = listener; } public void onClickProcess(){ if(listener!=null){ listener.onClick(); } } }
package nested; public class AnonymousSample { public static void main(String[] args){ AnonymousSample sample = new AnonymousSample(); sample.setButtonListenerAnonymous(); } public void setButtonListenerAnonymous(){ MagicButton button = new MagicButton(); button.setListener(new EventListener() { @Override public void onClick() { System.out.println("Magic Button Clicked !!!"); } }); } }
setListener() ๋ฉ์๋๋ฅผ ๋ณด๋ฉด new EventListener()๋ก ์์ฑ์๋ฅผ ํธ์ถํ ํ ๋ฐ๋ก ์ค๊ดํธ๋ฅผ ์ด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ทธ ์ค๊ดํธ ์์๋ onClick() ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ ์ค๊ดํธ๋ฅผ ๋ซ์์ต๋๋ค. ์ด๋ ๊ฒ ๊ตฌํํ ๊ฒ์ด ๋ฐ๋ก "์ต๋ช ํด๋์ค"์ ๋๋ค.
ํด๋์ค์๋ ์ด๋ฆ์ด ์์ง๋ง, onClick()๊ณผ ๊ฐ์ ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์์ต๋๋ค. ์ด๋ ๊ฒ ์ต๋ช ํด๋์ค๋ฅผ ๊ตฌํํ ๋ ์กฐ์ฌํด์ผ ํ๋ ๊ฒ์ ๊ดํธ๋ฅผ ๋ซ๋ ๊ฒ์ ๋๋ค. ์ค๊ดํธ๋ฅผ ๋ซ๊ณ , ์๊ดํธ๋ฅผ ๋ซ๊ณ ์ธ๋ฏธ์ฝ๋ก ์ ํ์ต๋๋ค. ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ํด๋์ค๋ฅผ ์ ์ธํ ๊ฒ์ด์ง๋ง, ์ค์ ๋ก๋ setListener() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ณผ์ ๋ด์ ์ต๋ช ํด๋์ค๊ฐ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ด ์๊ดํธ๋ฅผ ๋ซ๊ณ ์ธ๋ฏธ์ฝ๋ก ์ ํด ์ค์ผ๋ง ํฉ๋๋ค.
setListener() ๋ฉ์๋๊ฐ ํธ์ถ๋์ด onClick() ๋ฉ์๋๊ฐ ํธ์ถ๋ ํ์๊ฐ ์์ ๋ ๊ทธ ์์ ๊ตฌํ๋์ด ์๋ ๋ด์ฉ๋ค์ด ์คํ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ ๊ฒ ๊ตฌํํ์ ๋์๋ ํด๋์ค ์ด๋ฆ๋ ์๊ณ , ๊ฐ์ฒด ์ด๋ฆ๋ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค๋ ๋ฉ์๋์์๋ ์ฐธ์กฐํ ์๊ฐ ์์ต๋๋ค. ๊ทธ๋์, ๋ง์ฝ ๊ฐ์ฒด๋ฅผ ํด๋น ํด๋์ค ๋ด์์ ์ฌ์ฌ์ฉํ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
package nested; public class AnonymousSample2 { public static void main(String[] args){ AnonymousSample2 sample = new AnonymousSample2(); sample.setButtonListenerAnonymous(); } public void setButtonListenerAnonymous(){ MagicButton button = new MagicButton(); EventListener listener = new EventListener() { @Override public void onClick() { System.out.println("Magic Button Clicked !!!"); } }; button.setListener(listener); button.onClickProcess(); } }
๊ทธ๋ฐ๋ฐ, ๊ทธ๋ฅ ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ํธํ ๊ฒ ๊ฐ์๋ฐ ์ ์๋ฐ์์๋ ์ด๋ ๊ฒ ๋ณต์กํ๊ฒ ์ต๋ช ํด๋์ค๋ผ๋ ๊ฒ์ ์ ๊ณตํ๋ ๊ฒ์ผ๊น์?
์ต๋ช ํด๋์ค๋ฅผ ๋ง๋ค์์ ๋์ ์ฅ์ ์ ์๊ฐํด๋ณด๋ฉด ๋ฉ๋๋ค.
ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ํด๋์ค๋ฅผ ํธ์ถํ๋ฉด ๊ทธ ์ ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋๋ค. ์ฆ, ํด๋์ค๋ฅผ ๋ง์ด ๋ง๋ค๋ฉด ๋ง๋ค์๋ก ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ํ์ํด์ง๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ๋ ๋ง์ ์๊ฐ์ด ์์๋ฉ๋๋ค. ๋ฐ๋ผ์, ์๋ฐ์์๋ ์ด๋ ๊ฒ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ก ํด๋์์ต๋๋ค.
์ฐธ์กฐ ๊ฐ๋ฅํ ๋ณ์
Nested ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๊ณ ์์ด์ผ ํ๋ ์ฌํญ์ ์ฐธ์กฐ ๊ฐ๋ฅํ ๋ณ์๋ค์ ๋๋ค.
package nested; public class NestedValueReference { public int publicInt = 0; protected int protectedInt = 1; int justInt = 2; private int privateInt = 3; static int staticInt = 4; static class StaticNested{ public void setValue(){ staticInt = 14; } } class Inner{ public void setValue(){ publicInt = 20; protectedInt = 21; justInt = 22; privateInt = 23; staticInt = 24; } } public void setValue(){ EventListener listener = new EventListener() { @Override public void onClick() { publicInt = 30; protectedInt = 31; justInt = 32; privateInt = 33; staticInt = 34; } }; } }
์์ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ด Static Nested ํด๋์ค์์๋ ๊ฐ์ธ๊ณ ์๋ ํด๋์ค์ static ๋ณ์๋ง ์ฐธ๊ณ ํ ์ ์์ต๋๋ค. StaticNested ํด๋์ค๊ฐ static์ผ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ํด๋์ค์ static ํ์ง ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์๋ ์์ต๋๋ค. ๋ง์ฝ ์ฐธ์กฐํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด, ์ปดํ์ผ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ด๋ป๊ฒ๋ผ๋ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ฆ, ์ฌ๊ธฐ์ publicInt, protectedInt, justInt, privateInt๋ผ๋ ๋ณ์๋ StaticNested์์ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ง์ ๋๋ค.
๋ฌผ๋ก , static nested ํด๋์ค์๋ ๋ค๋ฅด๊ฒ ๋ด๋ถ ํด๋์ค์ ์ต๋ช ํด๋์ค๋ ๊ฐ์ธ๊ณ ์๋ ํด๋์ค์ ์ด๋ค ๋ณ์๋ผ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋ฐ๋๋ก ๊ฐ์ธ๊ณ ์๋ ํด๋์ค์์ Static Nested ํด๋์ค์ ์ธ์คํด์ค ๋ณ์๋ ๋ด๋ถ ํด๋์ค์ ์ธ์คํด์ค ๋ณ์๋ก์ ์ ๊ทผํ๋ ๊ฒ์ ๊ฐ๋ฅํ ๊น์?
๋ฐ๋๋ก์ ์ฐธ์กฐ๋ ๋ฌผ๋ก ๊ฐ๋ฅํฉ๋๋ค.
package nested; public class ReferenceAtNested { static class StaticNested{ private int staticNestedInt = 99; } class Inner{ private int innerValue = 100; } public void setValue(int value){ StaticNested nested = new StaticNested(); nested.staticNestedInt = value; Inner inner = new Inner(); inner.innerValue = value; } }
StaticNested ํด๋์ค์ Inner ํด๋์ค์ ๊ฐ๊ฐ ๋ณ์๊ฐ ๋๊ณ , ๊ฐ์ธ๊ณ ์๋ ReferenceNested ํด๋์ค์ intํ์ ์ value๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ๋ setValue(int) ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ ๊ฒ ๊ฐ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ๊ทธ ๊ฐ์ ์ฐธ์กฐํ๋ ๊ฒ์ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ ๊ฐ์ด private๋ผ๊ณ ํ ์ง๋ผ๋ ๋ชจ๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
.
.
.
์ด์์ผ๋ก ๋ด์ฉ์ ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค.
๊ณ ์ํ์ จ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค :)
'๊ฐ๋ฐ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Garbage Collector ์ด์ผ๊ธฐ - ์ ์, ์, ์ธ์ , ์ด๋ป๊ฒ, ์๊ณ ๋ฆฌ์ฆ, ์ข ๋ฅ (0) 2022.04.11 ์ ์ฐจ์งํฅ์ธ์ด VS ๊ฐ์ฒด์งํฅ์ธ์ด (0) 2022.04.10 ์ฐธ์กฐ ์๋ฃํ - ๊ธฐ๋ณธ ์์ฑ์, ์ค๋ฒ๋ก๋ฉ(overloading), return (0) 2022.03.21 ๋ณ์ ์ด์ผ๊ธฐ(2) - ์๋ฐ์ ํ์ (์๋ฃํ) (1) 2022.03.17 ๋ณ์ ์ด์ผ๊ธฐ(1) - ์๋ฐ์ 4๊ฐ์ง ๋ณ์ (1) 2022.03.17