내부클래스와 익명클래스

15148 단어 자바자바

내부클래스와_익명클래스

내부클래스

  • 클래스 안에 또다른 클래스가 존재

  • 그다지 많이 사용되지는 않음

  • 두 클래스의 멤버에 쉽게 접근 가능함

  • 그러나 로직이 복잡해지기 시작하면 오히려 꼬일 가능성 커짐..

// outerclass

package Inner;

public class OuterClass {
	int num = 10;
	String str1 = "java";
	static String str2 = "world";
	
	public OuterClass() {
		System.out.println("this is OuterClass");
	}
	
	
	class InnerClass {
		int num = 20;
		// 이런식으로 바깥 클래스의 데이터를사용 가능
		String str3 = str1;
		
		public InnerClass() {
			System.out.println("this is InnerClass");
		}
		
	}
	
	static class SInnerClass {
		int num = 30;
		// 이런식으로 바깥 클래스의 데이터를사용 가능
		String str4 = str2;
		
		public SInnerClass() {
			System.out.println("this is static InnerClass");
		}
		
	}
	
}
// main

package Inner;

public class MainClass {

	public static void main(String[] args) {
		
		OuterClass oc = new OuterClass();
		System.out.println("outer class num = " + oc.num);
		System.out.println("outer class str1 = " + oc.str1);
		System.out.println(" ---- ");
		
		// 도트노테이션으로 이너클래스에 접근
		// 비정적 중첩 클래스는 바깥 클래스의 객체를 통해 객체를 만들어야함
		// in은 oc에 대한 '숨은 외부 참조'를 갖게 됨
		// 따라서 클래스 안에서 this. 를통해 바깥 클래스의 요소에 접근 가능
		OuterClass.InnerClass in = oc.new InnerClass();
		System.out.println("inner class num = " + in.num);
		System.out.println("inner class num = " + in.str3);
		System.out.println(" ---- ");
		
		// 정적 중첩 클래스는 바깥 클래스의 객체가 없어도 객체를 생성할 수 있음
		// 정적 중첩 클래스는 외부 인스턴스 없이 생성 가능하므로 '외부 참조'가 존재하지 않음
		// 따라서 클래스 안에서 this. 를 통해 바깥 클래스의 요소에 접근할 수 없다.
		OuterClass.SInnerClass sin = new OuterClass.SInnerClass();
		System.out.println("static inner class num = " + sin.num);
		System.out.println("static inner class num = " + sin.str4);
		System.out.println(" ---- ");
		
	}

}

/*
결과
this is OuterClass
outer class num = 10
outer class str1 = java
 ---- 
this is InnerClass
inner class num = 20
inner class num = java
 ---- 
this is static InnerClass
static inner class num = 30
static inner class num = world
 ---- 
*/
  • 외부 참조로 인한 단점때문에 내부 클래스를 만들게 된다면 가능한 static으로 만들어야 함
    • 외부참조의 단점
      • 참조값을 담아야 해서 인스턴스 생성시 시간, 공간적 성능 하락
      • 외부 인스턴스에 대한 참조가 존재하므로 gc가 인스턴스를 수거하지 못해 메모리 누수 발생 가능

익명클래스

  • 이름이 없는 클래스로 주로 메서드를 재정의(override) 하는 목적으로 사용
  • 익명클래스는 인터페이스나 추상클래스에서 주로 사용
// ananymousclass

package Inner;

public class AnonymousClass {
	
	public AnonymousClass() {
		System.out.println("this is anonymousclass");
	}
	
	public void method() {
		System.out.println("this is anonymousclass's original method");
	}
}
// main

package Inner;

public class MainClass {

	public static void main(String[] args) {
		
		// 익명클래스
		// 이름이 없다. 따라서 한번만 사용하고 버려짐
		new AnonymousClass() {
			
			@Override
			public void method() {
				System.out.println("this is override");
			};
		}.method();
		// 재정의한 메서드를 바로 사용
		
	}

}

/*
결과
this is anonymousclass
this is override
*/
// 오버라이드한 결과가 출력됨을 알 수 있다.

좋은 웹페이지 즐겨찾기