뚜sh뚜sh

내부 클래스와 익명 클래스 본문

Language/Java

내부 클래스와 익명 클래스

뚜sh뚜sh 2023. 7. 3. 21:40

내부 클래스

- 개념 : 클래스 안에 클래스를 정의한 것

- 내부 클래스는 외부 클래스의 모든 자원 사용 가능

 

 

 

형식

- 기본 형식

class 클래스명 {
	class 내부클래스명 {
		// 멤버 변수, 메소드, 생성
	}
}

 

 

 

특징

1. new로 생성

2. 내부 클래스는 외부 클래스의 모든 자원 사용

3. 외부 클래스를 통해 내부 클래스 사용

4. 선언에 따라 인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스로 나눌 수 있다

 

 

 

사용 방법

1. 외부 클래스에서 new를 통해 내부 클래스를 생성하고 메소드를 호출하는 예

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		OutClass OutTest1 = new OutClass();
		OutTest1.Inner.Print();
	}
}

class OutClass {
	int nVar1 = 3;
	
	class InnerClass {
		void Print() {
			System.out.println("OutClass nVar1 : " + nVar1);
		}
 	}
	
	InnerClass Inner = new InnerClass();
}

 

2. 외부에서 내부 클래스를 생성하여 호출하는 예 => 드물게 사용

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		OutClass OutTest1 = new OutClass();
		OutClass.InnerClass InnerTest1 = OutTest1.new InnerClass();
		InnerTest1.Print();
	}
}

class OutClass {
	int nVar1 = 3;
	
	class InnerClass {
		void Print() {
			System.out.println("OutClass nVar1 : " + nVar1);
		}
 	}
}

 

3. 정적 내부 클래스의 사용 예

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		OutClass.InnerClass.Print();
	}
}

class OutClass {
	static int nVar1 = 3;
	
	static class InnerClass {
		static void Print() {
			System.out.println("static inner class");
			System.out.println("out class static nVar1 : " + nVar1);
		}
 	}
}

 

4. 외부 클래스 메소드에서 내부 클래스를 사용하는 예(지역 클래스)

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		OutClass OutTest1 = new OutClass();
		OutTest1.Print();
	}
}

class OutClass {
	int nVar1 = 3;
	
	class InnerClass {
		void Print() {
			System.out.println("out class nVar1 : " + nVar1);
		}
 	}
	
	void Print() {
		InnerClass Inner = new InnerClass();
		Inner.Print();
	}
}

 

 

 

익명 클래스

- 개념

1. 클래스명이 없는 클래스를 말함

  • 일반 내부 클래스 : 외부클래스명$내부클래스명.class로 저장
  • 익명 클래스 : 외부클래스명$1.class로 파일로 존재

2. 선언과 생성이 동시에 이뤄진다

3. 일회성

4. 안드로이드 프로그래밍에서 익명 클래스 형식을 많이 사용한다

 

- 형식

클래스명 클래스변수 = new 클래스명() {
	멤버 변수와 메소드들 선언
};

인터페이스명 인터페이스변수 = new 인터페이스명() {
	변수와 메소드들 선언
};

 

- 사용 예

1. 인터페이스를 상속한 클래스 사용의 일반적인 형식

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		InterfaceClass Test1 = new InterfaceClass();
		Test1.Print(); // 일반적인 클래스 호출
		A Test2 = new A();
		Test2.Print(); // 일반적인 클래스 호출
		}
}

interface Testable {
	public void Print();
}

class InterfaceClass implements Testable {
	public void Print() {
		System.out.println("HI!");
	}
}

class A {
	public void Print() {
		System.out.println("GOOD!");
	}
}

 

2. 인터페이스를 상속한 익명 클래스 이용 형식

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		InterfaceClass Test1 = new InterfaceClass();
		Test1.Print(); // 일반적인 클래스 호출
		A Test2 = new A();
		Test2.Print(); // 일반적인 클래스 호출
		
		InterfaceClass Test3 = new InterfaceClass() {
			public void Print() {
				System.out.println("Anonymous interface test3");
			}
		};
		Test3.Print();
		
		A Test4 = new A() { // 익명 클래스
			public void Print() {
				System.out.println("Anonymous interface test4");
			}
		};
		Test4.Print();
		
		Testable Test6 = new Testable() {
			public void Print() {
				System.out.println("Anonymous interface test6");
			}
		};
		Test6.Print();
	}
}

interface Testable {
	public void Print();
}

class InterfaceClass implements Testable {
	public void Print() {
		System.out.println("HI!");
	}
}

class A {
	public void Print() {
		System.out.println("GOOD!");
	}
}

 

3. 익명 클래스를 메소드의 매개변수로 사용하는 예

package test1;

public class test1 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
	ClassB Test1 = new ClassB();
	Test1.SetClass(new ClassA());
	
	Test1.SetClass(new ClassA() {
		public void Print() {
			System.out.print("Good!!");
		}
	});
	
	}
}

interface Testable {
	public void Print();
}

class ClassA implements Testable {
	public void Print() {
		System.out.println("HI!");
	}
}

class ClassB {
	void SetClass(ClassA ObjectA) {
		ObjectA.Print();
	}
}

'Language > Java' 카테고리의 다른 글

컬렉션 클래스  (0) 2023.07.06
유용한 클래스들  (0) 2023.07.05
예외 처리  (0) 2023.07.03
인터페이스(interface)  (0) 2023.07.03
추상 클래스(abstract class)  (0) 2023.07.03
Comments