내부 클래스(Inner class)
클래스 내부에 클래스를 선언하여 외부 클래스의 필드에 쉽게 접근하기 위해서 사용한다.
다른 곳에서 볼 때에는 그 내부에 있는 클래스는 숨겨진 것처럼 보이게 된다.
내부 클래스의 필드를 사용(객체화)하기 위해서는 외부클래스의 객체에서 내부클래스를 객체화해야한다.
- 외부클래스의 필드에서는 자신이랑 같이 올라와 있는 내부클래스를 바로 객체화 할 수 있다.
외부클래스명 객체명 = new 외부클래스 생성자();
외부클래스명.내부클래스명 객체명 = 외부클래스객체.new 내부클래스 생성자();
굉장히 복잡하므로, 객체를 직접 만들지 말라는 뜻이다.(드물게 사용)
Ex) 내부클래스 사용 예
일반클래스 상속
public class InnerTest {
public static void main(String[] args) {
B obj = new B();
obj.f();
}
}
class A{
int data;
}
class B extends A{
void f() {
System.out.println(this.data);
}
}
내부클래스 사용
public class InnerTest {
public static void main(String[] args) {
Out out = new Out();
Out.In in = out.new In();
in.f();
}
}
class Out{
int data;
class In{
void f() {
System.out.println(data);
}
}
}
내부 클래스 사용 이유
- 상속처럼 사용
- 외부클래스의 필드를 마치 내것처럼 접근하여 사용하기 위함
- 캡슐화
- 외부 클래스가 없다면 내부 클래스도 존재할 수 없기 때문에 다른 클래스에서 접근하지 못하도록 내부 클래스를 숨기기위해 사용
사용하는 상황의 Ex:
A 클래스에서 b()라는 작업(메소드)이 자주 쓰이고 이 작업이 B 클래스를 만들어야 쉽게 관리할 수 있다.
다른 클래스에서는 b() 가 필요없거나 A 클래스를 외부에 노출시키고 싶지 않을 때 내부 클래스를 사용한다.
- 내부 클래스는 GUI(Graphic User Interface) 개발 시 많이 사용
- a 버튼 눌러야 b버튼이 생성되게 만들고 싶다면 클래스를 별도로만들지 않고 내부클래스를 만들어 구현하는 것이 적합
익명클래스(Anonymous inner class)
- 이름이 없는 클래스
- 단 하나의 객체를 위한 클래스 (일회용)
클래스명 객체명 = new 생성자(){
//익명의 클래스
@Override
void 메소드(){}
};
- 익명클래스는 앞에 있는 생성자의 클래스를 상속받고 있는 이름 없는 자식 클래스이다.
- 익명 자식 클래스는 부모클래스의 메소드를 오버라이딩할 수 있고, 업캐스팅 되기 때문에 자식 클래스의 새로운 메소드는 사용할 수 없다.
- 다운캐스팅은 불가능(이름이 없음)
'Java > Java(base)' 카테고리의 다른 글
[Java] Java API(Application Programming Interface) (0) | 2021.12.01 |
---|---|
[Java] 예외처리 try-catch-finally / throw throws 차이점 및 예제 (0) | 2021.12.01 |
[Java] 인터페이스 interface, 다중 상속, 마크 인터페이스 (0) | 2021.12.01 |
[Java] 추상클래스 abstract class, final (0) | 2021.12.01 |
[Java]접근 권한 제어자 public, private, protected, default / getter, setter (0) | 2021.11.30 |