본문 바로가기
Work & Study/JAVA (& 혼공자Java)

자바(Java) - 중첩 클래스의 접근 제한

by a.k.a DUKI 2020. 11. 23.
728x90
반응형

중첩 클래스의 접근 제한

바깥 필드와 메소드에서 사용 제한

혼공자 유툽 참고

A 가 있어야, B를 사용할 수 있다. C는 A가 없이도 사용 가능하다.

 

예시1) 바깥 필드와 메소드에서 사용 제한

public class A {
	//인스턴스 멤버 클래스
	class B{}
	
	//정적 멤버 클래스
	static class C{}
	
	//인스턴스 필드
	B field1 = new B();
	C field2 = new C();
	
	//인스턴스 메소드
	void method1() {
		B var1 = new B();
		C var2 = new C();
	}
	
	//정적 필드 초기화
	//static B field3 = new B(); //A객체가 있어야 B객체를 이용할 수 있다.
	static C field4 = new C(); //A객체 없이도 C객체를 사용할 수 있다.
	
	//정적 메소드
	static void method2() {
		//B var1 = new B(); //method2()는 A객체가 필요 없으나, B객체는 A객체가 필요해서 오류가 난다.
		C var2 = new C();
	}

}

 

멤버 클래스에서 사용 제한

혼공자 유툽 참고

인스턴스 멤버 클래스(B)안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근할 수 있지만, 정적 멤버 클래스(C) 안에서는 바깥 클래스의 정적필드(field2)와 메소드(method2())만 접근 가능하며, 인스턴스 필드(field1)와 메소드(method1())에는 접근 할 수 없다.

 

예시2) 멤버 클래스에서 사용 제한

public class A {
	int field1;
	void method1() {}
	
	static int field2;
	static void method2() {}
	
	class B{
		void method() { //모든 필드와 메소드에 접근할 수 있음
			field1 = 10;
			method1();
			
			field2 = 10;
			method2();
		}
	}
	
	static class C{ //A객체 없이도 C객체는 만들 수 있으며 메소드도 호출이된다.
		void method() {
			//A객체가 있어야지 사용할 수 있다.인스턴스 필드와 메소드는 접근할 수 없다.
			//field1 = 10;
			//method1();
			
			//정적 필드와 정적 메소드는 A객체가 없이도 사용 가능하다.
			field2 = 10;
			method2();
		}
	}
}

 

로컬 클래스에서 사용 제한

  • 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 제한이 있어, 매개 변수나 로컬 변수는 final의 속성을 가져야 한다.

  • 자바 8 부터는 final을 선언하지 않아도 final 특성이 부여되어 있다.

혼공자 유툽 참고

  • Inner: 로컬 클래스
  • arg: 메소드의 매개 변수 -> final 속성을 가져야함.
  • localVariable: 로컬 변수 -> final 속성을 가져야함.

예시3) 로컬 클래스에서 사용 제한

public class Outter {
	// 자바 7 이전
	public void method1(final int arg) {
		final int localVariable = 1;
		// arg 100; //final 특성을 갖고 있어, 값을 변경하면 method()안에 arg가 오류
		// localVariable = 100; //final 특성을 갖고 있어, 값을 변경하면 method()안에 localVariable가 오류

		class Inner {
			public void method() {
				int result = arg + localVariable;
			}
		}
	}

	// 자바 8 이후
	public void method2(int arg) {
		int localVariable = 1;
		// arg 100; //final 특성을 갖고 있어, 값을 변경하면 method()안에 arg가 오류
		// localVariable = 100; //final 특성을 갖고 있어, 값을 변경하면 method()안에 localVariable가 오류;

		class Inner {
			public void method() {
				int result = arg + localVariable;
			}
		}
	}
}

 

 

중첩 클래스에서 바깥 클래스 참조 얻기

클래스 내부에서 this는 객체 자신의 참조이다. 중첩 클래스에서 this키워드를 사용하면 바깥 클래스의 객체 참조가 아니라, 중첩 클래스의 참조가 된다.

중첩 클래스 내부에서 this.필드, this.메소드()로 호출하면 중첩 클래스의 필드와 메소드가 사용 된다.

바깥 클래스 이름을 this 앞에 붙인다.

바깥클래스.this.필드
바깥클래스.this.메소드();

 

예시4) 중첩 클래스에서 바깥 클래스 참조 얻기

public class Outter {
	String field = "Outter-field";

	void method() {
		System.out.println("Outter-method");
	}

	class Nested {
		String field = "Nested-field";

		void method() {
			System.out.println("Nested-field");
		}

		void print() {
			// 중첩 객체 참조 --> Nested-field
			System.out.println(this.field);
			this.method();

			// 바깥 객체 참조--> Outter-field
			System.out.println(Outter.this.field);
			Outter.this.method();
		}
	}

}

 실행 클래스

public class OutterEx {

	public static void main(String[] args) {
		Outter outter = new Outter();
		Outter.Nested nested = outter.new Nested();
		nested.print();
	}

}

 

 

 

※용어 정리

  • 중첩 클래스: 클래스 내부에 선언한 클래스이다. 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

  • 멤버 클래스: 클래스의 멤버로서 선언되는 중첩 클래스를 말한다. 멤버 클래스는 바깥 객체의 필요 여부에 따라 인스턴스 멤버 클래스와 정적 멤버 클래스로 구분된다.

  • 로컬 클래스: 생성자 또는 메소드 블록 내부에 선언된 중첩 클래스를 말한다.

  • 중첩 인터페이스: 클래스의 멤버로 선언된 인터페이스 이다. 중첩 인터페이스는 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능하다. 주로 정적 멤버 인터페이스를 많이 사용하는데 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용 된다.

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.

 

728x90
반응형