정리/Java
자바의 정석 94~96강 내부클래스, 익명 클래스
민발자
2023. 8. 7. 06:15
728x90
ch 7-42~44 내부클래스 종류, 특징, 선언
1. 내부클래스
내부 클래스에서 객체 생성 없이 외부클래스의 멤버들을 쉽게 접근 가능
코드의 복잡성 줄일 수 있음(캡슐화)
2. 내부 클래스의 종류와 유효범위scope는 변수와 동일
내부 클래스 | 특징 |
인스턴스 클래스 | 외부 클래스 멤버변수 위치에 선언 인스턴스 멤버처럼 다루어짐 외부클래스 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언 |
static 클래스 | 외부 클래스 멤버변수 위치에 선언 외부 클래스 static멤버처럼 다루어짐 외부클래스 static멤버, 특히 static 메서드에서 사용될 목적으로 선언 |
지역 클래스 | 외부 클래스의 메서드나 초기화 블럭안에 선언 선언된 영역 내부에서만 사용 |
익명 클래스 | 클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스 일회용으로 사용 |
class outer {
class InstanceInner {} // 인스턴스 클래스
static class StaticInner {} // static 클래스
void method() {
class LocalInner {} // 지역 클래스
}
}
ch 7-45~50 내부 클래스의 제어자와 접근성
1. 내부 클래스 제어자는 변수 제어자와 동일
클래스 → default, public
내부 클래스 → default, public, protected, private
2. 내부 클래스 접근성
class outer {
private int outerIv = 0;
// 인스턴스 내부 클래스
class InstanceInner {
int iv = 100;
// static int cv = 100; static 변수 선언 불가
final static int CONST = 100; // final static은 상수라 허용
int iiv = outerIv; // 외부클래스 private멤버도 접근 가능
}
// static 내부 클래스
static class StaticInner {
int iv = 200;
static int cv = 200; // static 클래스만 static멤버 정의 가능
// 객체 생성없이 사용가능한 static멤버이기 때문에 static 클래스만 정의 가능
// static 내부 클래스에서는 외부 클래스의 인스턴스 멤버 접근 불가
}
void method() {
int Iv = 0;
final int LV = 0;
// 지역 내부 클래스
class LocalInner {
int iv = 300;
// static int cv = 300; static 변수 선언 불가
final static int CONST = 300; // final static은 상수라 허용
// 지역 내부 클래스의 static 상수는 메서드 내애서만 사용 가능
int liv = outerIv;
int liv2 = outerCv;
int liv3 = lv;
int liv4 = Lv;
// 외부 클래스의 지역변수는 final이 붙은 상수만 가능
// 내부 클래스의 객체가 지역변수보다 더 오래 존재할 수 있기 때문에
}
int i = LocalInner.CONST; // 메서드 내에선 사용 가능
}
}
class class Ex7_12 {
public static void main(String args[]) {
// 상수 사용
System.out.println(InstanceInner.CONST);
System.out.println(StaticInner.cv);
// System.out.println(LocalInner.cv); 지역 내부클래스 메서드 내에서만
// 인스턴스클래스의 인스턴스를 생성하려면
// 외부 클래스의 인스턴스를 먼저 생성해야 한다.
Outer oc = new Outer();
// 외부 클래스 인스턴스 생성 후 내부 클래스 인스턴스 생성하여 사용
Outer.InstanceInner ii = oc.new InstanceInner();
System.out.println("ii.iv : "+ ii.iv);
System.out.println("Outer.StaticInner.cv : "+Outer.StaticInner.cv);
// 외부 클래스의 객체 생성 없이 사용 가능
// 스태틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.
Outer.StaticInner si = new Outer.StaticInner();
System.out.println("si.iv : "+ si.iv);
}
}
ch 7-51~52 익명 클래스
1. 익명 클래스
이름이 없는 일회용 클래스, 정의와 생성을 동시에
new 조상 클래스 이름() {
// 멤버 선언
}
new 구현 인터페이스 이름() {
// 멤버 선언
}
Object iv = new Object() { /*멤버 선언*/ }
728x90