Java
[Java] Local Class & Anonymous 클래스
꽃달린감나무
2022. 2. 7. 08:37
728x90
- Local 클래스
- 메소드 내에서만 정의가 가능한 클래스
- 정으된 메소드 내에서만 인스턴스 생성과 참조변수 선언이 가능
Local, Anonymous 클래스 공부해도, 당분간은 쓸 일이 없어 까먹을 것 같다. 기억나지 않을 때마다 들어와서 찾아보자!
- Local 클래스를 메소드의 반한형으로 사용하고 싶다면?
- 인터페이스를 활용하면 됩니다. 인터페이스를 선언하고 이를 메소드의 반환형으로 만듭니다. Local 클래스가 해당 인터페이스를 구현하고 return new Local클래스명() 을 통해 반환하면 Local 클래스의 인스턴스를 메소드의 반환값으로 사용할 수 있습니다.
- Local 클래스가 접근 가능한 변수는 무엇이 일까요?
- Local 클래스는 메소드 내에 존재하기 때문에 매개변수와 지역변수에 접근이 가능합니다. 단, final로 선언된 매개변수와 지역변수에 접근이 가능합니다. 왜 final로 선언되어야 할까요? 매개변수와 지역변수는 메소드가 종료됨가 동시에 소멸됩니다. 이러한 점 때문에 컴파일러는 Local 클래스가 접근하는 지역, 매개변수의 복사본을 Local 클래스가 접근 가능한 메모리 영역에 저장합니다. 이 때 final로 선언되지 않았다면, 메소드 내에서 복사본의 내용이 바뀌어 원본과 값이 달라질 수 있기 때문에, 컴파일러는 final로 선언하는 것을 강요합니다.
- Local 클래스 예제!
-
interface Readable{ public void read(); } class OuterClass1{ private String myName; OuterClass1(String name){ myName = name; } public Readable createLocalClassInt(final int instID) { class LocalClass implements Readable{ public void read() { System.out.println("Outer is name " + myName); System.out.println("Local inst ID " + instID); } } return new LocalClass(); } } public class LocalClassTest { public static void main(String[] args) { // TODO Auto-generated method stub OuterClass1 out1 = new OuterClass1("Frist"); Readable localInst1 = out1.createLocalClassInt(111); // 반환값이 인스턴스 생성 localInst1.read(); OuterClass1 out2 = new OuterClass1("Secanmd"); Readable localInst2 = out2.createLocalClassInt(222); localInst2.read(); } }
-
- Anonymous 클래스
- 이름이 없는 클래스입니다. 왜 이름이 없을까요? 클래스가 참조변수 선언으로도, 메소드의 반환형 등으로 쓰이지 않고 오직 인스턴스 생성으로만 사용된다면, 이름이 필요할까요? 아닙니다. 이름이 필요 없습니다. 따라서 Java는 메소드의 몸체를 채워 넣는 방식의 인스턴스 생성을 허용하고 있습니다. 인터페이스에 메소드를 채워 넣는 형식으로 정의되는 클래스를 가리켜 Anonymous 클래스라고 합니다.
-
//1 return new Readable(){ public void read() { System.out.println("Outer is name " + myName); System.out.println("Local inst ID " + instID); } }; //2 Readable read = new Readable(){ public void read() { System.out.println("Outer is name " + myName); System.out.println("Local inst ID " + instID); } };
728x90