μλ°μ μμ±μ λμλ°©μ (+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 ν΄λμ€λ₯Ό κΊΌλ΄μ μ¬μ©νκ²λλ©΄ λ©λͺ¨λ¦¬ λμλ±μ λ¬Έμ κ° μλλ°, 그건 μ΄ λ§ν¬μ μμ² μμΈνκ² λμμμ΅λλ€.
μ μ , λΉμ μ λ΄λΆ ν΄λμ€ μκ³ μ¬μ©νκΈ°
μλ°μ μ€μ²© ν΄λμ€(Nested Class)μλ μ¬λ¬ κ°μ§ μ’ λ₯κ° μλλ° κ·Έμ€ μ μ λ΄λΆ ν΄λμ€μ λΉμ μ λ΄λΆ ν΄λμ€μ λν΄ λ€λ€λ³΄κ³ μ νλ€. κΈμμ μ¬μ©λ μ½λλ Github…
woowacourse.github.io
'πκΈ°λ³Έ μ§μ > 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