YTCW

java 내부 클래스 본문

java

java 내부 클래스

YTCW 2024. 9. 13. 11:16

정적 중첩 클래스와 내부 클래스의 차이는

정적 중첩 클래스는 static이 붙는다.

바깥 클래스의 인스턴스에 소속되지 않는다.

 

내부 클래스

static이 붙지 않는다.

바깥 클래스의 인스턴스에 소속된다.

 

내부 클래스의 종류 3가지

내부 클래스 (inner class) 바깥 클래스의 인스턴스의 맴버에 접근가능

지역 클래스 (local class) 내부 클래스의 특징 + 지역 변수에 접근가능

익명 클래스 ( anonymous class) 지역 클래스의 특징 + 클래스의 이름이 없는 특별한 클래스이다.

 

용어를 정리하자면

중첩 클래스는 정적 중첩 클래스 + 내부 클래스 종류 모두를 포함하는것이고

정적 중첩 클래스는 정적 중첩 클래스는 그자체이고

내부 클래스는 내부 클래스, 지역 클래스, 익명 클래스를 포함해서 말한다.

 

 

package chapter16;

// 인스턴스 : 메모리에 올라가는 객체
// 외부 클래스
class OuterClass {
	private String outerField = "외부 클래스의 필드"; 
	static String staticField = "외부 클래스 스태틱 필드"; // static 는 모든 필드에서 공유하는 값이다
	
	// 비정적 내부 클래스 - 인스턴스 필드, 인스턴스 메서드 처럼 사용한다.
	class InnerCalss {
		void display () {
			System.out.println("외부 클래스 필드에 접근" + outerField);
		}
	}
	
	// 정적 내부 클래스
	// 외부 클래스의 정적 멤버, 외부 클래스의 인스턴스 변수에 접근 안되고,
	// 외부 클래스의 정적 맴버에만 접근 가능
	// 인스턴스화 하지 않아도 사용은 가능하다 (클래스명만으로 접근이 가능)
	// new 생성자 초기화가 가능하다
	static class StaticClass {
		void display () {
//			System.out.println("외부 클래스 필드에 접근(인스턴스) : " + OuterField); // 쓸 수 없음
			System.out.println("외부 클래스 필드에 접근(인스턴스) : " + staticField);
		}
	}
	
	// 메서드 내부 클래스 ( 지역 클래스 )
	// 메서드 내에 정의된 내부 클래스이고 해당 메서드 내에서만 사용이 가능하다
	// 메서드의 지역 변수에만 접근 가능하고 로컬 변수가 final 인 경우에만 접근 가능하다.
	// final : 상수, 생성되자마자 초기화
	// outerMethod() 를 호출하면 내부에 클래스가 생성된다.
	
	void outerMethod () {
		final String localVar = "로컬 변수";
		
		class MethodClass {
			void display () {
				System.out.println("로컬 변수에 접근 " + localVar);
			}
		}
		// 로컬 클래스의 인스턴스화
		MethodClass inner = new MethodClass();
		inner.display();
		
	}
	
	// 익명 내부 클래스
	// 이름이 없는 내부 클래스를 말하고 주로 인터페이스나 추상 클래스 구현에 사용한다.
	// 즉시 객체를 생성 가능하다
	// 주로 클래스를 한번만 사용할때 익명 내부 클래스를 사용한다.
	
	
}
// 추상 클래스
abstract class AbstractClass {
	// 하나 이상의 추상 메서드를 포함
	// 추상 메서드는 무엇이 없는 메서드 ? -> 구현부 (중괄호) 가 없는 메서드
	// 추상 메서드
	abstract void display ();
}
public class A_Inner01 {
	public static void main(String[] args) {
		// 1) 외부 클래스 인스턴스화하기
		// 외부 클래스를 객체화 시켰고
		OuterClass outer1 = new OuterClass();
		
		// 2) 외부 클래스.내부 클래스 형식으로 내부 클래스를 초기화하여 사용
		// 내부 클래스에 인스턴스(객체)를 생성하려면 외부 클래스.내부 클래스로 접근하여 객체를 생성해준다
		OuterClass.InnerCalss inner = outer1.new InnerCalss();
		inner.display();
		
		
		// 정적 내부 클래스 static 클래스
		// 1) 외부 클래스 인스턴스화가 필요없이 클래스를 통한 내부 클래스 생성이 가능하다.
		// 위의 OuterClass.InnerCalss inner = outer1.new InnerCalss();를 보면 외부 클래스의 인스턴스화가 필요 없다는 차이점을 정확히 알수 있다.
		OuterClass.StaticClass staticInner = new OuterClass.StaticClass();
				
		// 메서드 내부 클래스 ( 지역 클래스 )
		OuterClass outer2 = new OuterClass();
		outer2.outerMethod(); // 로컬 메소드를 사용
		
		
		// 익명 내부 클래스
		// 클래스 타입 변수명 new 클래스명() {메서드 구현 - 추상 클래스, 인터페이스};
		AbstractClass obj = new AbstractClass() {
			@Override
			void display() {
				System.out.println("익명 내부 클래스");
			}
		}; // 추상 클래스를 구현하는 익명 클래스 >> 재사용이 불가, 이름이 없어서 어디서 오류가 났는지 디버깅이 어렵다. 
		obj.display(); // 익명 내부 클래스
	}
}

'java' 카테고리의 다른 글

servlet 과 jsp(javaServer Pages) 차이점  (1) 2024.10.08
java Lambda  (1) 2024.09.13
java singleton  (0) 2024.09.10
java lombok  (0) 2024.09.10
java MVC 패턴  (2) 2024.09.10