이너클래스(inner class)
이너 클래스란 말 그대로 클래스 내부에 또 다른 클래스를 구현한 것이다.
이너 클래스는 outer class의 멤버를 자유롭게 사용이 가능하다.
이너클래스에는 4종류가 존재한다.
1. member inner class
2. static inner class
3. local inner class
4. anonymous inner class
member inner class
class Outer{ // Outer class
class Inner{ } // Inner class
}
멤버 이너클래스는 위 코드처럼 일반적으로 클래스내부 멤버처럼 선언하면 된다.
이너클래스를 사용하는 방법은
class Test{
Outer outer = new Outer(); //외부 클래스 객체 먼저 생성
Outer.Inner inner = outer.new Inner(); //내부 클래스 객체 생성
Outer.Inner inner = new Outer().new Inner(); //내부 클래스 객체 한줄로 생성 방법
}
위 코드처럼 외부클래스를 먼저 객체 생성하고 외부클래스객체를 이용하여 내부 클래스 객체를 생성한다.
3번째 방법은 내부 클래스를 한 줄로 생성하는 방법이다. 만약 코드를 줄이고 싶다면 사용하면 된다.
컴파일 시에 해당 이너 클래스의 파일 명은 아우터클래스명 $ 이너 클래스명. class로 생성이 된다.
Static Inner Class
class Outer{ //outer class
static class Inner{ } // static Inner class
}
위처럼 멤버 이너클래스처럼 생성하지만 이너 클래스에 static을 붙여만든 이너클래스이다.
static 이너 클래스의 사용방법은
class Test{
Outer.Inner inner = new Outer.Inner(); //static 내부 클래스 객체 생성
}
static으로 선언하였기 때문에 외부 클래스 객체 생성할 필요 없이 바로 내부 클래스를 생성 가능하다.
Local Inner Class
class Outer{ // outer class
void display(){ // outer method
class Inner{ //inner class
}
}
}
지역 이너 클래스는 위처럼 메서드 안에 선언되는 이너클래스이다.
지역 이너 클래스의 사용방법은
class Outer{
void display() {
class Inner{
}
Inner inner = new Inner(); //지역클래스가 존재하는 메소드 내에서 객체 생성
}
}
class Test{
public static void main(String[] args) {
Outer outer = new Outer(); //외부 클래스 객체 생성
outer.display(); //지역 클래스가 있는 메소드 호출
}
}
외부 클래스 객체를 생성하고 해당 이너클래스가 들어있는 메서드를 호출하여 사용한다.
지역 이너 클래스는 주의할 점이 있는데 이너클래스가 선언된 메서드의 지역변수에는 접근을 할 수없다. 다만 지역변수를 final로 선언한 경우는 접근이 가능하다.
또한 듣기로는 실무에서 사용이 잘 안 되는 이너클래스라고 한다.
Anonymous Inner Class
익명 이너 클래스는 보통 추상 클래스를 객체로 만들 때 사용한다.
추상적인 부분을 오버라이딩(구체화)함으로써 객체를 생성하고, 항상 부모타입인 추상클래스타입으로만 선언이 가능하다.
(당연히 본인 클래스명이 존재하지 않기 때문이다.)
abstract class Car{
abstract void display();
}
public class Test{
public static void main(String[] args[]){
Car car = new Car(){
void diplay{
System.out.println("Car");
}
}
}
}
위 코드와 같이 추상클래스를 객체로 만들 때 만들 때 추상메서드 때문에 객체로 만들지를 못한다 이때 객체를 만들 때 추상 메서드 들을 구체화를 함으로써 객체로 만들지 못했던 추상 클래스를 객체로 만들 수 있게 되는 것이다.
익명 이너 클래스는 클래스 이름이 없이 선언되기 때문에 구현된 메서드를 재활용할 수 없다.
따라서 한 번만 사용될 메서드가 필요할 때 선언하는 게 바람직하다
만약 여러 군데에서 필요로 하는 메서드를 익명 이너클래스를 통해 구현할 경우 동일한 코드가 늘어날 수 있기 때문이다.
'자바' 카테고리의 다른 글
제네릭(Generic) (0) | 2023.08.30 |
---|---|
이너 인터페이스(inner interface) (0) | 2023.08.29 |
추상클래스, 인터페이스 (0) | 2023.08.28 |
접근지정자(access modifier) (0) | 2023.08.27 |
JDK 설치, 환경변수 설정 (0) | 2023.05.03 |