[JAVA] ch.13 내부 클래스(인스턴스, 정적, 지역, 익명 클래스)
💡내부 클래스💡
- 클래스 안에 선언되는 또 다른 클래스로 중첩 클래스라고도 부른다.
- 두 클래스의 멤버들 간에 손쉽게 접근할 수 있다.
- 불필요한 클래스를 감춰 코드의 복잡성을 줄일 수 있다.
- 클래스 안의 선언된 위치에 따라 인스턴스 클래스, 정적 클래스, 지역 클래스, 익명 클래스로 나눈다.
//외부클래스
public class OutClass{
//내부클래스
class InnerClass{
}
}
인스턴스 클래스
- 기본적인 내부 클래스
- 외부 클래스 안에 생성되기 때문에 외부 클래스 객체가 생성된 상태에서 인스턴스 클래스의 객체를 생성을 한다.
- 외부 클래스의 인스턴스 멤버와 같은 위치에 선언
- 주로 외부 클래스의 멤버 변수와 관련된 작업에 사용될 목적으로 선언한다.
- 외부 클래스의 인스턴스 변수는 사용할 수 있으나 정적 변수나 메서드는 호출할 수 없다.
- 생성 방법
public class Outer{
private String name; // 멤버 변수
public class Inner{ // 인스턴스 클래스
private String name;
public void method(){
}
}
}
- 선언 방법 ( 외부 클래스를 객체화 해서 사용 )
Outer out = new Outer();
Outer.Inner in = out.new Inner();
//Outer.Inner in = new Outer().new Inner();
in.add();
정적 내부 클래스
- static 키워드를 사용해 선언
- 외부 클래스의 인스턴스 멤버와 같은 위치에 선언
- 정적 변수와 마찬가지로 클래스 안에 속하지만 독립적으로 존재한다. (외부 클래스 객체화x)
- 주로 외부 클래스의 static 메서드에서 사용될 목적으로 선언한다.
- 정적 변수나 정적 메서드를 호출하는 것을 가능하지만 외부 클래스의 인스턴스 변수나 메서드는 사용 x
- 생성 방법
public class Outer{
private String name; // 인스턴스 멤버
public static class Inner{ // 정적 내부 클래스
private String name;
}
}
- 선언 방법( 외부 클래스 객체화 없이 가능 )
Outer.Inner in = new Outer.Inner();
지역 클래스
- 외부 클래스의 메서드 안에 선언되어 사용하는 메서드
- 해당 메서드 내에서만 사용이 가능하기 때문에 메서드의 실행이 끝나면 클래스도 종료된다.
- 접근 제한자와 static 사용할 수 없다.
- 메서드 내에서 변수를 사용하려면 해당 변수는 final이여야 한다.
- 생성, 선언 방법 (메서드 내에서 선언)
class OuterClass {
void method() {
class LocalInner {
int a = 5;
}
LocalInner li = new LocalInner();
System.out.println(li.a);
}
}
public class Example {
public static void main(String[] args) {
OuterClass out = new OuterClass();
out.method();
}
}
익명 클래스
이름이 없는 일회용 클래스
특징
- 클래스의 선언과 생성을 동시에 한다.
- 하나의 객체만 생성할 수 있다.
- 추상 클래스나 인터페이스를 구현한다.
- 선언 후 세미콜론(;)을 붙인다.
✅익명클래스 구현
추상클래스나 인터페이스를 익명클래스로 구현
Button button = new Button(){ // 익명 클래스
@Override
public void onClick(){
}
};
익명 클래스 추가 설명
익명클래스도 내부 클래스기때문에 외부클래스 안에 선언되어야한다.
하지만 외부 클래스만 미리 정의하고 메서드를 정의해놓고 내부 클래스는 메인에서 작성하는 내부 클래스다.
그렇기 때문에 내부 클래스 선언과 객체 생성을 동시에 한다고 말할 수 있다.
또한 사용하는 부분에서 메서드 내용을 구현했기 때문에 다른 클래스에서는 사용할 수 없어 일회용 클래스다.