JAVA

중첩클래스(Nested Class, Mehod Local, Anonymous, Inner Class)

lipnus 2019. 5. 9. 14:38
반응형


중첩클래스

클래스들의 논리적인 그룹을 나타낼 때 사용. 주로 model 객체에서 상위모델과 하위모델이 있을 때 사용.

향상된 캡슐화

좋은 가독성과 유지보수성


1. 내부클래스(Inner Class)

내부클래스로서 일반클래스 내부에 생성된다Non-Static Nested Class 라고도 불린다.

밖에 있는 클래스는 내부클래스를 멤버변수처럼 사용할 있다. 사용하려면 new 인스턴스를 만들어야한다.

내부클래스는 자신의 밖에 있는 클래스의 자원을 직접 사용할 있다.


class Outer {
변수;
메소드;

public class Inner {

}

}


Outer 객체1 = new Outer(); //외부
Outer.Inner 객체2 = 객체1.new Inner(); //내부




2. 중첩클래스(Nested Class) <Static>

s있으니까 Static이라고 외우면 된다.

위의 내부클래스와 비슷하나, static 으로 선언한다. 정확히는 Static Nested Class 라고 한다.

밖에 있는 클래스의 변수와 메소드 중에 static 붙은 것들은 사용할 있다.


내부클래스와의 차이

내부클래스는 밖에 있는 클래스의 자원을 마음대로 사용할 있지만, 중첩클래스는 static 키워드가 안붙었다면 사용할 없다.

Outer 클래스의 객체가 없어도 Inner 클래스의 객체 생성이 가능하다.

class Outer {
int value;
void method(){

}

static public class Inner {

void test(){
method();
}
}

}

public class Main {
public static void main(String[] args){
        ...
}

...

main에서 사용한다고 했을 때, Main scope안에서 사용하려면 static class로 선언해야 해야한다.

Main scope밖에면 그냥 class로 해도 된다. 



3. 지역클래스 (Mehod Local Inner Class)

메소드 내부에 클래스를 정의하는 경우이다. 마치 메소드 내의 지역변수처럼 쓰인다.

메소드 내부에서 new 사용해야 한다. 메소드 밖에서 사용할 없다(지역변수 )


class Outer {
변수;
method1();

method2() {
지역변수;
class Inner { }
}
}



4. 익명클래스 (Anonymous Inner Class)

익명클래스는 인스턴스 이름이 없다. new 동시에 부모클래스를 상속받아 내부에서 오버라이딩해서 사용한다.

매개변수로 사용할 수도 있다.

익명클래스 내부의 변수나 메소드는 익명클래스의 밖에서 사용이 불가능하다.

주로 익명클래스는 이럴때 사용 : 상속은 받아야하지만, 한번만 사용할 것이라서 extends 문법을 굳이 사용안함


익명클래스 내부에 생성자X

익명클래스 외부의 자원은 final 키워드가 붙은 것만 사용할 있다.

아래 모양새에서 보듯이 Inner 클래스가 이미 선언되어있어야 한다. Inner 클래스를 바로 상속받고 오버라이딩해서 쓰는 구조이다.






참고:https://yookeun.github.io/java/2017/01/24/java-anonymousclass/


자바에서 익명클래스 (혹은 익명객체)를 사용하는 방법. 보통의 경우, 우리는 부모클래스를 상속받아 처리하려면 부모클래스를 상속받는 클래스를 별도로 만들어 처리한다.


public class Person {
void whoAmI() {
System.out.println("나는 Person 이다.");
}
}


위와 같은 부모클래스를 사용하려면 상속받는 자식클래스를 만들어서 사용하게 된다.

public class Child extends Person {
@Override
void whoAmI() {
System.out.println("I'm child");
}
}


그런데 만약 Person를 상속받아 처리해야 하는 클래스가 또 필요한 경우, 매번 Child2, Child3… 등등을 만드는 것은 낭비고 불필요한 클래스만 많아진다. 상속받은 클래스가 재사용되면 모를까, 그냥 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다. 이럴 경우에 바로 익명 클래스를 사용하면 된다.


실행클래스에서 바로 사용한다고 하면 다음과 같이 하면 된다.

public static void main(String[] args) {
Person p = new Person() {
String name = "Kim";
@Override
void whoAmI() {
System.out.println("나는 " + name + " 이다.");
}
};
p.whoAmI(); // 나는 Kim 이다.
}


익명클래스의 형식은 다음과 같다

부모클래스 인스턴스 = new 부모클래스() {

};





참고: https://sjh836.tistory.com/145

반응형