JiwonDev

์ž๋ฐ”์˜ ์ƒ์„ฑ์ž ๋™์ž‘๋ฐฉ์‹ (+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๊ฐ€ ๋ฐ˜ํ™˜๋จ
}

hashcode๋ฅผ ๋ณด๋ฉด ์‹ค์ œ๋กœ ๋ถ€๋ชจ์™€ ์ž์‹์˜ name ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‹ค๋ฆ„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ด๋Š” 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){ } //์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž๋™ ์ƒ์„ฑ๋˜์ง€์•Š์Œ.
   
}

์ƒ์„ฑ์ž๊ฐ€ ์—†์–ด๋„ ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ–ˆ๋˜๊ฑด, Default ์ƒ์„ฑ์ž์˜ ์ž๋™์ƒ์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.

 


# Inner ํด๋ž˜์Šค์˜ ๋™์ž‘๋ฐฉ์‹ (๋‚ด๋ถ€ ์ •์  ํด๋ž˜์Šค)

Q. static ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š”๋ฐ, ์™œ Innerํด๋ž˜์Šค์—๋Š” static์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

  1. ์ผ๋‹จ ์ •์  ํด๋ž˜์Šค๋ผ๋Š”๊ฑด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ ์ •ํ™•ํžˆ๋Š” '์ •์ ์ด ์•„๋‹Œ' ํด๋ž˜์Šค๋ผ๋Š” ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ํด๋ž˜์Šค์˜ ์ •๋ณด๋Š” JVM์˜ ClassLoader๊ฐ€ ์ฝ์–ด๋“ค์ผ๋•Œ ์ „๋ถ€ ์ •์ ์˜์—ญ(๋ฉ”์„œ๋“œ ์˜์—ญ)์— ์ €์žฅํ•˜๋‹ˆ๊นŒ์š”.
    * ๋‹ค๋งŒ JVM์€ Lazyํ•˜๊ฒŒ ํด๋ž˜์Šค๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค ํ•ด๋„ ์‹ค์ œ ์‚ฌ์šฉํ•˜๊ธฐ ์ „๊นŒ์ง€ ClassLoading์„ ๋ฏธ๋ฃน๋‹ˆ๋‹ค.
  2. ์‚ฌ์‹ค์€ ํด๋ž˜์Šค์ •๋ณด, static ํ•„๋“œ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ฉ”์„œ๋“œ ์ •๋ณด๋„ ์ •์ ์˜์—ญ(๋ฉ”์„œ๋“œ ์˜์—ญ)์— ์ €์žฅํ•ด์„œ ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. static์ด ๋ถ™์ง€ ์•Š์€ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋„ ์ „๋ถ€์š”.

 

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ [ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ํ˜„์žฌ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜]๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒ ์ฃ . ๊ทธ๋ž˜์„œ JVM์€ ์ถ”๊ฐ€์ ์œผ๋กœ [์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” ๊ฐ์ฒด์˜ ํž™๋ฉ”๋ชจ๋ฆฌ ๋ ˆํผ๋Ÿฐ์Šค]๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๊ฒŒ ๋ฐ”๋กœ thisํ‚ค์›Œ๋“œ์ฃ . thisํ‚ค์›Œ๋“œ๋Š” ๋‹จ์ˆœํžˆ ํŽธ์˜์ƒ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ, ์ด๋Ÿฐ ๋น„๋ฐ€์ด ์ˆจ์–ด ์žˆ์—ˆ๋‹ค๊ณ  ํ•˜๋„ค์š”.

 

  1. ๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€์„œ, ํด๋ž˜์Šค์— static์„ ๋ถ™์˜€๋‹ค๊ณ ํ•ด์„œ ์ •์  ํด๋ž˜์Šค๊ฐ€ ๋˜๋Š”๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ์›๋ž˜ ์ •์ ๊ณต๊ฐ„์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  2. ์ž๋ฐ”๋Š” class ๋‹จ์œ„๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์„ ํ•ด๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ inner ํด๋ž˜์Šค, outer ํด๋ž˜์Šค๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ(.class)๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ทธ๋ž˜์„œ inner ํด๋ž˜์Šค๋งŒ ๋”ฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์—์„œ๋Š” inner ํด๋ž˜์Šค๋Š” outerํด๋ž˜์Šค๊ฐ€ ์—†์œผ๋ฉด ๋งŒ๋“ค ์ˆ˜ ์—†๊ฒŒ ์„ค์ •๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋‹จ inner ํด๋ž˜์Šค์— static์„ ๋ถ™์ด๊ฒŒ ๋˜๋ฉด outer ํด๋ž˜์Šค๊ฐ€ ์—†์–ด๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ด์ค๋‹ˆ๋‹ค.
  5. ๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ ์–ต์ง€๋กœ inner ํด๋ž˜์Šค๋ฅผ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๊ฑด ์ด ๋งํฌ์— ์—„์ฒญ ์ž์„ธํ•˜๊ฒŒ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.
 

์ •์ , ๋น„์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ

์ž๋ฐ”์˜ ์ค‘์ฒฉ ํด๋ž˜์Šค(Nested Class)์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ์ค‘ ์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋น„์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ธ€์—์„œ ์‚ฌ์šฉ๋œ ์ฝ”๋“œ๋Š” Github…

woowacourse.github.io

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ