본문 바로가기
Java/Java_basic

Step17. 내부클래스와 익명클래스

by Mr.DonyStark 2023. 9. 25.

□ 내부클래스(inner) : 클래스 안에 또 다른 클래스를 선언하는 것으로 이렇게 하면 두 클래스의 멤버에 쉽게 접근 가능

예제1) 클래스 파일 생성 및 내부클래스, Static클래스 지정

package person_test;

public class Outer_Class {

	//클래스 속성지정
	int num = 10;
	String str1 = "java";
	//static 을 활용하여 어디서나 공유가능한 속성
	static String str11 = "world";
	
	//생성자
	public Outer_Class() {
		System.out.println("최초 생성자");
	}
	
	//내부 클래스 생성
	class InnerClass{
		//내부클래스 속성 지정
		int num = 100;
		String str2 = "str1";
		//내부클래스 생성자
		public InnerClass(){
			System.out.println("내부클래스 생성자");
		}
	}
	
	//static을 활용하여 언제든지 공유가능한 클래스 생성
	static class SInnerClass{
		//속성 지정
		int num = 1000;
		String str3 = str11;
		//생성자
		public SInnerClass() {
			System.out.println("Static 클래스 생성자");
		}
	}
}

예제1-1) 객체 생성 및 내부클래스, Static클래스의 속성/메서드 활용

package person_test;

public class Outer_Class_Main {

	public static void main(String[] args) {
		
		//객체 생성 및 클래스에서 지정한 속성을 활용하여 객체 속성으로 출력
		Outer_Class oc = new Outer_Class();
		System.out.println("oc.num :" + oc.num );
		System.out.println("oc.str1 : "+ oc.str1 );
		
		//클래스 생성시 정의한 내부클래스 활용하여 객체 생성
		Outer_Class.InnerClass in = oc.new InnerClass();
		System.out.println("in.num : " + in.num);
		System.out.println("in.str2 : " + in.str2);

		//클래스 생성시 Static을 활용하여 어디서든 공유가능한 클래스를 활용하여 객체생성
		Outer_Class.SInnerClass s1 = new Outer_Class.SInnerClass();
		System.out.println("in.num : " + s1.num);
		System.out.println("in.str3 : " + s1.str3);

	}

}

□ 익명클래스(anonymous) : 이름이 없는 클래스로 주로 메서드를 재정의 하는 목적으로 사용됨

예제2) 클래스 파일 생성 및 메서드 지정

package person_test;

public class AnonymouseClass {
	
	//생성자 생성
	public AnonymouseClass() {
		System.out.println("나는 생성자");
	}
	//메서드 지정
	public void method() {
		System.out.println("익명클래스 메서드");
	}
}

예제2-1) 익명 객체생성 및 override활용하여 메서드 호출

package person_test;

public class AnonymouseClass_Main {

	public static void main(String[] args) {
		
		//익명객체 생성
		new AnonymouseClass() {
			//Override활용하여 메서드 호출
			@Override
			public void method() {
			System.out.println("익명클래스 메서드");
		};
	}.method(); //메서드호출{}.메서드명();
	}
}