Java/POJO
중첩클래스 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스)
SKaSha
2019. 6. 30. 17:18
중첩 클래스는 하기와 같은 구조를 가지고 있습니다.
- Nested Classes
- Static Nested Classes (정적 중첩 클래스)
- Inner Classes
- Inner Classes (내부 클래스)
- Method Local Inner Classes (지역 클래스)
- Anonymous Inner Classes (익명 클래스)
중첩 클래스를 사용하는 이유
- 한 곳에서만 사용되는 클래스를 논리적으로 그룹화하는 방법
- 캡슐화 증가
- 좋은 가독성과 유지보수성
Static Nested Classes (정적 중첩 클래스)
내부클래스는 밖에 있는 클래스의 자원을 마음대로 사용할 수 있지만 중첩클래스는 static 키워드가 안붙었다면 사용할 수 없습니다.
Outer 클래스가 인스턴스화 되어있지 않아도 객체를 생성이 가능합니다.
정적 중첩 클래스는 행동 상으로는 패키징 편의를 위해 다른 최상위 클래스에 중첩 된 최상위 클래스입니다.
class OuterClass {
static class StaticNestedClass {
}
}
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Inner Classes (내부 클래스)
밖에 있는 클래스는 내부클래스를 멤버변수처럼 사용할 수 있으며 내부클래스는 자신의 밖에 있는 클래스의 자원을 직접 사용할 수 있습니다.
class OuterClass {
class InnerClass {
}
}
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
Method Local Inner Classes (지역 클래스)
메소드 내부에 클래스를 정의하여 메소드 내의 지역변수처럼 사용하며, 메소드 밖에서 사용할 수 없다(지역변수 룰)
class OuterClass {
public void fuc() {
class LocalClass {
}
LocalClass localClass = new LocalClass();
}
}
Anonymous Inner Classes (익명 클래스)
익명클래스는 말그대로 이름이 없는 클래스이며 new 와 동시에 부모클래스를 상속받아 내부에서 오버라이딩해서 사용합니다. 매개변수로도 사용이 가능하며 상속은 받아야하지만 일회성으로 사용할때 주로 사용합니다.
익명클래스는 외부의 자원을 이용할때 final이 붙은 자원만 사용 가능합니다.
class OuterClass {
interface AnonymousClass {
public void hello();
}
public void fuc() {
new AnonymousClass() {
public void hello() {
System.out.println("hello world");
}
}.hello();
}
}
대표적인 예
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});