내부클래스의 종류, 특징, 선언
✔ 내부클래스 (inner class)
: 클래스 안의 클래스
: 내부클래스에서 외부클래스의 멤버들을 쉽게 접근할 수 있다
: 코드의 복잡성을 줄일 수 있다 (캡슐화)
class A { // B의 외부클래스
class B { // A의 내부클래스
// 객체생성없이도 A의 멤버에 접근 가능
}
}
> class B가 class A안에서만 사용될 때 특히 유용. 다른 클래스에서 접근하기 힘들게 만든다.
내부클래스의 종류와 유효범위(scope)는 변수와 동일
int iv 👉 class InstanceInner{}
static int cv 👉 static class StaticInner{}
int lv = 0; 👉 class LocalInner{}
내부클래스 | 특징 |
인스턴스 내부클래스 (Instance class) |
: 외부클래스의 멤버변수 선언위치에 선언 : 외부클래스 인스턴스 멤버처럼 다루어짐 : 인스턴스 멤버들과 관련되어 사용될 목적 |
스태틱 내부클래스 (static class) |
: 외부클래스 멤버변수 선언위치에 선언 : 외부클래스의 static 멤버변수처럼 다루어짐 : 외부클래스의 static 멤버, static 메서드에서 사용될목적 |
지역 내부클래스 (Local class) |
: 외부클래스 메서드나 초기화블럭 안에 선언 : 선언된 영역 내부에서만 사용 |
익명클래스 (anonymous class) |
: 익명클래스 : 클래스 선언, 객체생성을 동시에 하는 이름없는 클래스 (일회용 클래스) |
내부클래스의 제어자와 접근성
: 내부클래스의 제어자는 변수에 사용가능한 제어자와 동일
: 일반 클래스에는 default, public만 가능하지만 내부클래스는 일반 변수처럼 접근제어자 4개 모두 사용 (즉 변수 자리에 내부클래스를 넣은것)
: 인스턴스 내부 클래스는 외부클래스의 인스턴스를 생성해야 내부 클래스에 인스턴스 생성 가능
: 스태틱 내부 클래스는 외부 클래스 인스턴스 생성 없이도 사용 가능.(iv, cv의 특징과 동일)
class InstanceInner {
int iv = 100;
// static int cv = 100; // 에러! static변수를 선언할 수 없다.
final static int CONST = 100; // final static은 상수이므로 허용
}
static class StaticInner {
int iv = 200;
static int cv = 200; // static클래스만 static멤버를 정의할 수 있다.
}
void myMethod() {
class LocalInner {
int iv = 300;
// static int cv = 300; // 에러! static변수를 선언할 수 없다.
final static int CONST = 300; // final static은 상수이므로 허용. 상수라고 static이 꼭 붙는건 아님
}
}
public static void main(String args[]) {
System.out.println(InstanceInner.CONST);
System.out.println(StaticInner.cv);
// System.out.println(LocalInner.cv); 에러. 지역 내부 클래스는 메서드 내에서만 사용가능
}
class Outer{ // 외부,내부, 내부클래스 메소드의 지역변수값이 모두 같을때 구별법
int value = 10; // Outer.this.value=10
class Inner{ // 내부클래스
int value=20; // this.value=20 (메인변수와 지역변수 구분할때의 this)
void method1(){
int value=30; // 메서드의 lv. value = 30
System.out.println("value:"+value);
System.out.println("this.value:"+ this.value);
System.out.println("Outer.this.value:"+Outer.this.value);}
}
}
Class Test{
public static void main(String[] args){
Outer out = new Outer(); // 외부 인스턴스 생성
Outer.Inner inner = Outer.new Inner(); // 내부 인스턴스 생성
Inner.method1(); // 메소드 호출
}
}
익명클래스
: 1번만 쓰고 버리는 일회용 클래스
: 익명이라서 클래스 이름이 없다.
: 클래스 정의와 객체 생성을 동시에 함.
class MyClass extends Object
MyClass mc = new MyClass();
// 여기서 익명클래스는 자기 클래스명이 없으므로, 객체 생성시 들어갈 타입도, 변수명도 없음.
// 따라서 조상클래스를 가져다가 사용.
new Object() {/*클래스의 내용 그대로 넣어줌*/}
//new 다음에 조상 이름을 쓰던가, 인터페이스 이름을 써줌.
'🔥 Vamos > Java' 카테고리의 다른 글
1022 | 자바의 정석 예제 :: 생성자를 이용한 final 멤버변수 초기화 (0) | 2022.10.23 |
---|---|
1021 | 자바의 정석 기초편 :: ch8-1~8-3 (0) | 2022.10.21 |
1019 | 자바의 정석 연습문제 :: 상속 관계 형변환 (1) | 2022.10.19 |
1018 | 자바의 정석 기초편 :: ch7-39 (2)~7-41 (1) | 2022.10.19 |
1017 | 자바의 정석 기초편 :: ch7-39 (1) (1) | 2022.10.18 |