728x90
- 중첩 클래스는 4 가지가 있다. 이중 2가지 정도만 살펴보면될듯,
- 정적 멤버 클래스
- 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스
- outer class 와 별개라 생각하면 될듯
- 비정적 멤버 클래스
- 바깥 클래스와 암묵적으로 연결된다.
- 멤버 클래스에서 바깥 인스턴스를 참조할 필요가 없다면 무조건 정적 멤버 클래스로 만들자
- 익명 클래스
- 람다를 지원하기전에 즉석에서 작은 함수 객체나 처리 객체를 만들 때 사용.
- 쓰이는 시점과 동시에 인스턴스가 만들어진다.
- 지역 클래스
- 가장 드물게 사용되며, 지역 변수를 사용하는 곳이면 어디든 정의해 사용할 수 있다.
public class OuterClass {
private static int outerVariable = 20;
private int variable = 10;
//정적 멤버 클래스
//독립적이며, 정적필드에 접근가능.
static private class StaticNestedClass {
public void accessOuterVariable() {
System.out.println(outerVariable);
// System.out.println(variable);
}
}
//비정적 멤버 클래스
void printNumber() {
InnerClass innerClass = new InnerClass();
}
private class InnerClass {
public void accessOuterVariable() {
System.out.println(variable);
System.out.println(outerVariable);
OuterClass.this.printNumber();
}
}
//익명 클래스
public Runnable method() {
return new Runnable() {
public void run() {
System.out.println(variable);
System.out.println(outerVariable);
}
};
}
//지역 클래스
public void method_local_inner() {
class MethodLocalInnerClass {
public void accessOuterVariable() {
System.out.println(variable);
System.out.println(outerVariable);
}
}
MethodLocalInnerClass inner = new MethodLocalInnerClass();
inner.accessOuterVariable();
}
public static void main(String[] args) {
//정적 멤버 클래스
StaticNestedClass staticNestedClass = new StaticNestedClass();
staticNestedClass.accessOuterVariable();
System.out.println("==============");
//비정적 멤버 클래스
InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.accessOuterVariable();
System.out.println("==============");
//익명 클래스
OuterClass outer = new OuterClass();
Runnable runnable = outer.method();
runnable.run();
System.out.println("==============");
//지역 클래스
OuterClass outerClass = new OuterClass();
outerClass.method_local_inner();
}
}
- 비정적 멤버 클래스는 어댑터를 정의할 떄 자주 쓰인다. 아래는 어댑터 패턴 예제
interface Target {
void request();
}
class Adaptee {
void specificRequest() {
System.out.println("Adaptee specificRequest");
}
}
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.specificRequest();
}
}
class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
728x90
'공부 > 이펙티브자바' 카테고리의 다른 글
[이펙티브자바]item 26.로 타입은 사용하지 말라 (0) | 2023.02.10 |
---|---|
[이펙티브자바]item 25.톱레벨 클래스는 한 파일에 하나만 담으라. (0) | 2023.02.08 |
[이펙티브자바]item 23.태그 달린 클래스보다는 클래스 계층구조를 활용하라. (0) | 2023.02.06 |
[이펙티브자바]item 22.인터페이스는 타입을 정의하는 용도로만 사용하라. (0) | 2023.02.06 |
[이펙티브자바]item 21.인터페이스는 구현하는 쪽을 생각해 설계하라. (0) | 2023.02.06 |
댓글