내부 클래스란?
내부 클래스는 말 그대로 안에 선언된 클래스이다.
클래스 내에 선언된 클래스를 내부 클래스라고 한다.
내부 클래스를 사용하는 이유는 다음과 같다.
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다. (캡슐화)
이 때 사용하는 내부 클래스는 다른 클래스에서는 사용하지 않는 내용이여야 한다.
내부 클래스의 종류
- 인스턴스 클래스
- 외부 클래스의 메멉변수 선언위치에 선언한다.
- 외부 클래스의 인스턴스멤버 처럼 다루어진다.
- 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다.
- 스태틱 클래스
- 외부 클래스의 멤버변수 선언위치에 선언한다.
- 외부 클래스의
static
멤버 처럼 다루어진다. - 특히
static
메서드에서 사용될 목적으로 선언된다.
- 지역 클래스
- 외부 클래스의 메서드나 초기화블럭 안에 선언한다.
- 선언된 영역 내부에서만 사용될 수 있다.
- 익명 클래스
- 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스이다. (일회용)
이러한 내부 클래스의 선언위치는 다음과 같다.
class InnnerClassTest{
class 인스턴스클래스 {}
static class 스태틱 클래스 {}
void method(){
class 내부클래스{}
}
}
내부 클래스의 제어자와 접근성
내부클래스는 앞에 선언위치와 같이 그냥 Class 내부에 선언되는 것이다.
이러한 내부 클래스도 클래스이기 때문에 abstract
나 final
같은 제어자를 안에서 사용할 수 있다. 또한, 접근 제어자도 마음대로 사용할 수 있다.
내부 클래스에서 static
을 사용하기 위해서는 static
클래스로 정의를 해야한다.
그렇지 않으면 static
을 사용해야하는데 클래스가 안읽혀서 static
을 사용하지 못하는 모순이 생긴다.
하지만 final static
은 상수로서 사용이 가능하다.
또한, static
멤버는 인스턴스 멤버를 직접호출을 할 수 없다.
하지만 인스턴스 멤버는 인스턴스 멤버와 static
멤버를 모두 직접호출이 가능하다.
static
클래스는 외부의 클래스의 인스턴스 멤버를 객체 생성없이 사용할 수 없지만
인스턴스 멤버는 클래스의 인스턴스멤버를 객체 생성 없이 사용할 수 있다.
지역 클래스는 외부 클래스의 인스턴스 멤버와 static
멤버를 모두 사용할 수 있다.
또한, 지역클래스가 포함된 메서드에 정의된 지역변수도 사용할 수 있다.
final
이 붙은 지역변수만 접근이 가능하다. 하지만 JDK1.8이후로는 final
을 컴파일러가 자동적으로 붙여준다.
컴파일을 하면 외부 클래스명$내부 클래스명.class
형식으로 된다. 하지만 안에 중복된 이름의 클래스가 있을 수도 있기 때문에 외부 클래스명$숫자 내부 클래스명.class
로 이루어진다.
마지막으로 내부 클래스와 외부 클래스에 선언된 변수의 이름이 같을 떄가 있다.
이럴 때는 외부 클래스명.this
를 붙여서 서로 구별 할 수 있다.
익명 클래스(anonoymous class)
익명 클래스는 내부 클래스와 다르게 일므이 없다.
클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직하나의 객체만 생성할 수 있는 일회용 클래스이다.
이는 다음과 같이 생성된다.
new 부모 클래스이름(){
}
new 구현 인터페이스이름(){
}
Object ob = new Object(){ void method() };
이는 이름이 없어서 생성자를 가질 수 없다.
또한, 구현하고자 하는 부모 클래스이름과 구현 인터페이스 이름을 사용하기 때문에
둘이상의 인터페이스를 구현할 수 없다.
하나의 클래스를 상속 받거나 단 하나의 인터페이스만을 구현할 수 있다.
익명 클래스를 사용하면 다음과 같은 형태로 클래스파일이 생성이된다.
외부 클래스명&숫자.class
Reference
- 자바의 정석
'Java > Java' 카테고리의 다른 글
[Java/Study] java.time 패키지 (0) | 2021.09.18 |
---|---|
[Java/Study] 예외처리 (0) | 2021.09.14 |
[Java/Study] 인터페이스 (0) | 2021.09.11 |
[Java/Study] 추상클래스 (0) | 2021.09.11 |
[Java/Study] 다형성 (0) | 2021.09.10 |