[Java] 내포클래스(Nested Class)



1️⃣ 내포 클래스(Nested Class)

  • 자바에는 내포 클래스를 크게 두가지로 나눌 수 있습니다.
    1. 비정적 내포 클래스(non-static nested class)
    2. 정적 내포 클래스(static nested class)
  • Java를 제외한 대부분의 다른 언어들은 정적 내포 클래스만을 지원합니다. 비정저 내포 클래스Java에만 존재하는 개념이라고할 수 있습니다.
  • 내포 클래스를 이용하면 연관된 클래스들끼리 그룹화를 할 수 있습니다.
  • 내포 클래스는 외부클래스의 private제어자로된 멤버변수에도 접근이 가능합니다.


2️⃣ 내포클래스를 사용하지 않을 때

  • 내포클래스의 예시로 상속관계에 있는 것보다 컴포지션인 (has-a)관계에 있는 클래스들을 이용하겠습니다.
  • Mouse클래스를 가지는 Computer클래스의 예시입니다.
  • 먼저 내포클래스를 이용하지않고 구현했을 때 입니다.
/* Computer */
public class Computer {
    private Mouse mouse;

    public Computer(Mouse mouse) {
        this.mouse = mouse;
    }
}
/* Mouse */
public class Mouse {
    private int x;
    private int y;

    public void moveXY(int x, int y) {
        this.x = x;
        this.y = y;
    }
}




3️⃣ 비정적내포클래스(non-static nested class)를 이용할 떄

(1) 비정적내포클래스로 구현했을 때

public class Computer {
    private int x;
    private int y;

    public class Mouse {
        public void moveXY(int X, int Y) {
            this.x = X; // 컴파일 에러
            x = X;     // 올바른 접근방법
            y = Y;
        }
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
  • 내포클래스에서 외부의 private접근제어자를 사용한 멤버변수에 접근이 가능함을 보여주기 위해 x, y멤버변수를 외부에 배치하였습니다.
  • 또하나 특이한점은 내포클래스안에 존재하는 moveXY메소드를 보면 외부의 x멤버변수에 접근할 때 this를 이용하여 접근하면 컴파일에러가 일어납니다. (상속관계에서 자식클래스부모클래스의 멤버변수에 접근할때 super. 대신에 this.를 사용할 수 있었던 것과 대조됩니다.)

(2) 비정적내포클래스를 사용하기

  • 위에서 구현한 비정적내포클래스를 생성하여 사용하는 방법입니다.
public class main {
    public static void main(String[] argc) {
        Computer com = new Computer();
        Computer.Mouse mouse = com.new Mouse();
    }
}
  • 기존에 new를 이용하여 생성했던 것과 달리 com.new와 같이 다소 상식과 벗어난듯한 모습을 보이는 생성방법입니다.


4️⃣ 정적내포클래스(static nested class)를 이용할 떄

(1) 정적내포클래스로 구현했을 때

public class Computer {
    private int x;
    private int y;

    public static class Mouse {
        Computer computer;

        public Mouse(Computer computer){
            this.computer = computer;
        }
        public void moveXY(int X, int Y) {
            computer.x = X;
            computer.y = Y;
        }
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
  • 정적내포클래스라는 이름 그대로 내포클래스에 static키워드를 붙여서 구현합니다.
  • 여기서 static키워드의 쓰임은 기존에 알고 있던 쓰임과는 약간 다릅니다. (단순히 외부클래스의 것들에 접근하지 않기위함, 이러한 점에서 외부클래스의 private멤버변수가 OOP의 캡슐화 관점에서보면 다시 제 기능을 할 수있어집니다.)

(2) 정적내포클래스를 사용하기

  • 위에서 구현한 정적내포클래스를 생성하여 사용하는 방법입니다.
public class main {
    public static void main(String[] argc) {
        Computer com = new Computer();
        Computer.Mouse mouse = new Computer.Mouse(com);
    }
}
  • 비정적내포클래스를 사용하는 것보다 좀 더 상식적인 방법으로 바뀐 것같습니다.


5️⃣ 끝맞치며..

  • 내포클래스를 이용하면 서로 연관된 클래스끼리 그룹화를 지을 수 있습니다. 또한 privateprotected접근제어자를 클래스에 붙여서 사용할 수있습니다.(다양한 목적으로 사용가능)
  • 그러나 요즘에는 파일하나에 클래스하나의 원칙으로 사용하는 경우가 더 많은 것 같습니다.




© 2021.02. by kirim

Powered by kkrim