์๋ฐ์ ์์ฑ์ ๋์๋ฐฉ์ (+Innerํด๋์ค)
by JiwonDev๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅด๊ฒ ๋์ํด์ ์ถ๊ฐ๋ก ์์ฑ-
#1. ๊ฐ์ฒด ์์ฑ ์์
์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑ๋ ๋, ๋ถ๋ชจ ํด๋์ค ๊ฐ์ฒด๊ฐ ๋จผ์ ์์ฑ๋๊ณ ์์ ํด๋์ค๊ฐ ์์ฑ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ์ด์ ๋ ์๋ฐ๋ ์ ์บ์คํ , ๋ค์ด์บ์คํ ์ ๋ ๋ค ์ง์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ๊ฒ๋งํ๋ฉด ๋ถ๋ชจ ๋ ํผ๋ฐ์ค( Animal dog = new Dog() )์ ์ ์บ์คํ ํ ๊ฐ์ฒด๋ฅผ ๋ค์ ์์๊ฐ์ฒด( Dog newDog = dog )๋ก ๋ค์ด์บ์คํ ํด๋ ์ ์๋์ํ๋ค. ์ฆ ์์ ๊ฐ์ฒด๋ ๋ถ๋ชจ ๋ ํผ๋ฐ์ค(super)๋ฅผ ๊ฐ์ง๊ณ ์์ด ํ์ํ๋ค๋ฉด ์์ ๊ฐ์ฒด ์์์ ๋ถ๋ชจ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๋ค.
์ด๋ this์ ๋์์๋ฆฌ์ ๋น์ทํ๋ค. ํ๋ฉ๋ชจ๋ฆฌ ๋ํ ๋ถ๋ชจ์ ์์์ด ๊ตฌ๋ถ์ง์ด์ ๊ฐ์ง๊ณ ์๊ฒ๋๋ค.
๐ค ๋ถ๋ชจ๋ ์์์ด ๋๊ฐ์ ์ด๋ฆ์ ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ๋๋์?
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฑด ์ ์ ๋๊ฐ ์ง์ด๋ผ ํด๋ณธ์ ์ ์๊ฒ ์ง๋ง, ์์ธ๋ก ๊ฐ๋ฅํ๋ค.
class Parent {
public String name;
public Parent(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Child extends Parent {
public String name; // ๋ถ๋ชจ์ ๋๊ฐ์ ์ด๋ฆ์ ํ๋
public Child(String pName, String cName) {
super(pName);
this.name = cName;
}
}
์ด ๊ฒฝ์ฐ, ๊ฐ์ ์ธ์คํด์ค๋ผ๋ Parent ํ์ ์ด๋ Child ํ์ ์ด๋์ ๋ฐ๋ผ ๋ค๋ฅธ ํ ๋ฉ๋ชจ๋ฆฌ์ name์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
public static void main(String[] args) {
Parent parent = new Child("parent", "child");
System.out.println(parent.name); // "parent"๊ฐ ๋ฐํ๋จ
System.out.println(parent.getName()); // "parent"๊ฐ ๋ฐํ๋จ
Child child = (Child) parent;
System.out.println(child.name); // "child"๊ฐ ๋ฐํ๋จ
System.out.println(child.getName()); // getter๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ์ํ์ผ๋ฏ๋ก, parent๊ฐ ๋ฐํ๋จ
}
์ฐธ๊ณ ๋ก ์ด๋ Outer - Inner์์๋ ๋์ผํ๊ฒ ๋์ํ๋ค. ๊ฒฐ๊ตญ ํด๋์ค๊ฐ 2๊ฐ ๋ง๋ค์ด์ง๊ณ , ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง๋๊ฑฐ๋๊น
๊ทธ๋์ Outer์ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ง์ง์๋ static Inner๋ Outer.name์ ์ฌ์ฉํ ์ ์๋ค. ์ปดํ์ผ์๋ฌ!
class Shadowing {
String name = "Outer John";
class innerShadowing {
String name = "Inner John";
public void print() {
System.out.println("Inner/name: " + name);
// System.out.println(Shadowing.name); ์ฐธ๊ณ ๋ก ์ด๊ฑด Static ํ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฌธ๋ฒ์ด๋ค.
System.out.println("Inner/Shadowing.this.name: " + Shadowing.this.name);
}
}
public void outerPrint() {
System.out.println("Outer/name: " + name);
}
}
class Main {
// Main driver method
public static void main(String[] args) {
Shadowing obj = new Shadowing();
Shadowing.innerShadowing innerObj
= obj.new innerShadowing();
obj.outerPrint(); // Outer.name
innerObj.print();
System.out.println("Main/inner.name :" + innerObj.name); // Inner.name
}
}
์ด๋ฐ์์ผ๋ก ํ๋์ด๋ฆ์ด ๊ฐ๋ ค์ ธ์, ์จ๊ฒจ์ง ๋ถ๋ชจ.name ์ด ์๋๊ฑธ Shadowing ์ด๋ผ๊ณ ํ๋ค. (JS์ ํด๋ก์ ์ ๋น์ท)
์ฌ์ค ์๋ฐ์์๋ Method์ ์ ๋ณด๋ Static์์ญ์ ์ ์ฅํด์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๊ณต์ ํด์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฌ๋ค๊ฐ ๋ณธ์ธ ๊ฐ์ฒด์ ํ๋๊ฐ ํ์ํด์ง ๊ฒฝ์ฐ, ๋ฉ์๋๊ฐ ๊ฐ์ง๊ณ ์๋ this(ํ ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค)๋ฅผ ํตํด์ ๋ณธ์ธ ๊ฐ์ฒด์ ํ๋๋ฅผ ๊ฐ์ ธ์ ๋ฉ์๋๋ฅผ ์คํ์ํค๊ณ , this๋ฅผ ์ด์ฉํด ํ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
์ฆ super๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ฉ๋ชจ๋ฆฌ์ ๋ถ๋ชจ๋ฉ์๋ ์ ๋ณด๊ฐ ์๋๊ฒ ์๋๋ผ, ๋จ์ง ๋ถ๋ชจ ํ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค์ผ ๋ฟ์ด๋ค.
Dog dog = new Dog()
# 2. ๋ํดํธ ์์ฑ์(Default Constructor)
์ด๋ ๊ฒ ์์๊ฐ์ฒด๋ ๋ถ๋ชจ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๋ถ๋ชจ์ ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
๋ค๋ง ์ํ๋ค๋ฉด ๋ช ์์ ์ผ๋ก ์ํ๋ ๋ถ๋ชจ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๋ค. ํ์ง๋ง ๋ฐ๋์ ์์ฑ์ ์ ์ผ ์ฒซ๋ฌธ์ฅ์ super()๋ฅผ ํธ์ถํด์ผํ๋ฉฐ, ์ด๋ฅผ ์ด๊ธด๋ค๋ฉด ์ปดํ์ผ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
public class Dog(){
Public Dog() {
super(); // ๋ช
์์ ์ธ ๋ถ๋ชจ ์์ฑ์์ ์ธ. ๋ฐ๋์ ์์ฑ์ ์ฒซ์ค์ ์ฌ์ฉ
...
}
}
์ด ๋ ๋ช ์์ ์ผ๋ก ์์ฑ์๋ฅผ ์์ฑํ์ง ์์๋ ์๋์ผ๋ก ๋ง๋ค์ด์ ํธ์ถ๋๋ ์์ฑ์๋ฅผ Default ์์ฑ์๋ผ๊ณ ํ๋ค. ๋ฌผ๋ก ์์ฑ์๋ฅผ ์์ฑํ์ง ์์์ ๋ ์ด์ผ๊ธฐ์ด๊ณ , ๋ง์ฝ ๋ช ์์ ์ผ๋ก ์์ฑํ ์์ฑ์๊ฐ ์๋ค๋ฉด ์ง์ ํ๋ผ๋ฉํ๊ฐ ์๋ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ผํ๋ค.
public class Animal {
public Animal() { } // ์์ฑ์๊ฐ ์๋ค๋ฉด ์๋์์ฑ.
public Animal(name){ } //์ด๋ ๊ฒ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์์ฑ์๊ฐ ์๋ค๋ฉด ์๋ ์์ฑ๋์ง์์.
}
# Inner ํด๋์ค์ ๋์๋ฐฉ์ (๋ด๋ถ ์ ์ ํด๋์ค)
Q. static ํด๋์ค๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋จ๋๋ฐ, ์ Innerํด๋์ค์๋ static์ ๋ถ์ผ ์ ์์๊น์?
- ์ผ๋จ ์ ์ ํด๋์ค๋ผ๋๊ฑด ์กด์ฌํ์ง ์์ต๋๋ค. ์๋ ์ ํํ๋ '์ ์ ์ด ์๋' ํด๋์ค๋ผ๋ ๊ฐ๋
์ด ์์ต๋๋ค. ์ ์ด์ ํด๋์ค์ ์ ๋ณด๋ JVM์ ClassLoader๊ฐ ์ฝ์ด๋ค์ผ๋ ์ ๋ถ ์ ์ ์์ญ(๋ฉ์๋ ์์ญ)์ ์ ์ฅํ๋๊น์.
* ๋ค๋ง JVM์ Lazyํ๊ฒ ํด๋์ค๋ฅผ ์ฝ์ต๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋ค ํด๋ ์ค์ ์ฌ์ฉํ๊ธฐ ์ ๊น์ง ClassLoading์ ๋ฏธ๋ฃน๋๋ค. - ์ฌ์ค์ ํด๋์ค์ ๋ณด, static ํ๋ ๋ฟ๋ง์๋๋ผ ๋ฉ์๋ ์ ๋ณด๋ ์ ์ ์์ญ(๋ฉ์๋ ์์ญ)์ ์ ์ฅํด์ ๋ชจ๋ ํด๋์ค๊ฐ ๊ณต์ ํฉ๋๋ค. static์ด ๋ถ์ง ์์ ์ผ๋ฐ ๋ฉ์๋๋ ์ ๋ถ์.
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋ฉ์๋๋ฅผ ์คํํ ๋ [ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ํ์ฌ ๊ฐ์ฒด์ ๋ฉค๋ฒ๋ณ์]๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ ์ฃ . ๊ทธ๋์ JVM์ ์ถ๊ฐ์ ์ผ๋ก [์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฐ์ฒด์ ํ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค]๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ๊ฒ ๋๋๋ฐ, ๊ทธ๊ฒ ๋ฐ๋ก thisํค์๋์ฃ . thisํค์๋๋ ๋จ์ํ ํธ์์ ์ ๊ณต๋๋ ๊ธฐ๋ฅ์ด ์๋๋ผ, ์ด๋ฐ ๋น๋ฐ์ด ์จ์ด ์์๋ค๊ณ ํ๋ค์.
- ๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์์, ํด๋์ค์ static์ ๋ถ์๋ค๊ณ ํด์ ์ ์ ํด๋์ค๊ฐ ๋๋๊ฒ ์๋๋๋ค. ์๋ ์ ์ ๊ณต๊ฐ์ ์ ์ฅ๋ฉ๋๋ค.
- ์๋ฐ๋ class ๋จ์๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ง๋ญ๋๋ค. ์ปดํ์ผ์ ํด๋ณด๋ฉด ์๊ฒ ์ง๋ง inner ํด๋์ค, outer ํด๋์ค๊ฐ ๋ฐ์ดํธ์ฝ๋(.class)๊ฐ ๋ฐ๋ก ์กด์ฌํฉ๋๋ค.
- ๊ทธ๋์ inner ํด๋์ค๋ง ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์์๋ inner ํด๋์ค๋ outerํด๋์ค๊ฐ ์์ผ๋ฉด ๋ง๋ค ์ ์๊ฒ ์ค์ ๋์ด์์ต๋๋ค.
- ๋จ inner ํด๋์ค์ static์ ๋ถ์ด๊ฒ ๋๋ฉด outer ํด๋์ค๊ฐ ์์ด๋ ๋ง๋ค ์ ์๋๋ก ํ์ฉํด์ค๋๋ค.
- ๋ค๋ง ์ด๋ ๊ฒ ์ต์ง๋ก inner ํด๋์ค๋ฅผ ๊บผ๋ด์ ์ฌ์ฉํ๊ฒ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฑ์ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ๊ทธ๊ฑด ์ด ๋งํฌ์ ์์ฒญ ์์ธํ๊ฒ ๋์์์ต๋๋ค.
'๐๊ธฐ๋ณธ ์ง์ > Java ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ๋น์ง ์ปฌ๋ ํฐ์ TLAB (0) | 2021.09.22 |
---|---|
JMX ํด, ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ๋ชจ๋ํฐ๋ง ๋๊ตฌ (0) | 2021.09.22 |
๋ฐ์ดํธ์ฝ๋ ์กฐ์(๋ฆฌํ๋ ์ , ๋ค์ด๋๋ฏน ํ๋ก์, ์ ๋ ธํ ์ด์ ํ๋ก์ธ์) (0) | 2021.08.17 |
JVM์ ์๋ฆฌ์ ๋ฐ์ดํธ์ฝ๋ (0) | 2021.08.16 |
์์ธ ์ฒ๋ฆฌ์ ๋ค์ํ ๋ฐฉ๋ฒ (0) | 2021.08.16 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev