반응형
내부클래스란?
클래스내에서 선언된 클래스를 말한다
내부클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다
- 코드의 복잡성을 줄일 수 있다(캡슐화)
내부 클래스 사용 목적
내부 클래스를 사용하게 되면 비슷한 형태의 클래스들을 묶을 수 있어서 코드의 캡슐화를 증가시킬 수 있다. 또한, 내부클래스에서 외부 클래스의 멤버에 손쉽게 접근 할 수 있게 된다.
내부클래스의 종류와 특징
내부 클래스의 선언
class Outer{
class InstanceIneer{} //인스턴스클래스
static class StaticInner{} 스태틱 클래스
void method1(){
class LocalInner{} //지역클래스
}
}
instance 멤버 내부 클래스
- instance 멤버 내부 클래스는 클래스의 멤버와 동일한 위치에서 선언되는 내부 클래스
- 멤버 변수나 메서드와 동일한 위치에서 선언되었기 때문에 다른 외부 클래스에서도 사용 가능
- 내부 클래스의 객체 생성을 위해 외부 클래스 객체 생성이 필요
class Outside { // 외부 클래스 (=Top Level Class)
public class Inside { // 내부 클래스 (일반 멤버 변수와 동일한 위치) }
}
public class InnerClass {
public static void main(String args[]) {
Outside outer = new Outside(); // 내부 클래스의 객체 생성을 위해 외부 클래스 객체 생성
Outside.Inside inner = outer.new Inside();
}
static 멤버 내부 클래스
- 내부 클래스를 정의할 때도 static 예약어 사용 가능
- 외부 클래스의 객체를 생성하지 않고도 내부 클래스 객체 생성 가능
class Outside { // 외부 클래스 (=Top Level Class)
public static class StaticInside { // static 내부 클래스
// ...
}
}
public class InnerClass {
public static void main(String args[]) {
Outside.StaticInside sinner = new Outside.StaticInside();
}
}
이름을 갖는 지역 내부 클래스
- 메서드 내부에 정의된 클래스로서 지역 변수와 동일한 범위를 가짐 -> 클래스가 선언된 메서드 블록 내에서만 사용 가능
- 클래스의 이름이 명시
class Animal { // 외부 클래스 (=Top Level Class)
void performBehavior() {
class Brain { // 이름을 갖는 지역 내부 클래스
// ... 지역 내부 클래스 정의
}
}
}
public class InnerClass {
public static void main(String args[]) {
이름이 없는 지역 내부 클래스 (=무명의 내부 클래스)
- new 예약어 뒤에 명시된 클래스가 기존의 클래스인 경우, 자동적으로 이 클래스의 자식 클래스가 됨
- 이름이 없는 지역 내부 클래스는 추상 클래스의 객체를 내부 클래스 형태로 생성할 때 자주 사용
- 다른 내부 클래스에 비해 활용도가 높은 클래스
- 추상 클래스는 추상 메서드를 포함하고 있기 때문에,
추상 클래스를 상속한 클래스가 만들어져 객체를 생성해야만 객체 생성이 가능 -> 무명의 내부 클래스를 사용하는 것이 편리
디폴트메서드와 static메서드
- 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다
- 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.
참고자료
자바의 정석