프로그래밍 언어/JAVA
[JAVA] 중첩 클래스와 중첩 인터페이스 - 중첩클래스(2)
김곰댕
2021. 7. 20. 16:56
728x90
중첩 클래스의 접근 제한
바깥 필드와 메소드에서 사용 제한
예제)
package sec03.exam01_member_class.access;
public class A
{
class B { }
static class C { }
//인스턴스 필드
B field1 = new B(); //B 객체를 생성하여 초기화
C field2 = new C(); //C 객체를 생성하여 초기화
//인스턴스 메소드
void method1()
{
B var1 = new B(); //지역변수
C var2 = new C(); //지역변수
}
//정적 필드와 정적 메소드는 정적 멤버클래스만 쓸 수 있다.
//정적 필드
//static B field3 = new B(); 클래스 B는 A 객체가 반드시 생성되어야함. 따라서 A객체 없이 B를 생성하려고 했으므로 오류
static C field4 = new C(); //클래스 C가 static으로 선언되어 있기 때문에 A객체 없이도 C를 생성할 수 있음
//정적 메소드
static void method2()
{
//A객체 없이 실행될 수 있는 내용을 넣어야함
//B var1 = new B(); B는 A객체가 반드시 필요하므로 오류
C var2 = new C();
}
}
멤버 클래스에서 사용 제한
예제)
package sec03.exam02_field_method_access;
public class A
{
int field1;
void method1() { }
static int field2;
static void method2() { }
class B
{
void method()
{
field1 = 10; //바깥쪽의 fiedl1을 바로 접근해서 사용 가능
method1(); //바깥쪽 method1을 바로 접근해서 사용 가능
field2 = 10;
method2();
}
}
static class C
{
void method()
{
//field1 = 10; field1은 A객체가 반드시 있어야 사용이 가능, static class C는 A객체가 없이도 C객체가 생성이 가능하므로 오류
//method1();
field2 = 10; //A객체가 없이도 사용 가능한 static만 사용가능
method2();
}
}
}
로컬 클래스에서 사용 제한
예제)
package sec03.exam03_localclass_access;
public class Outter
{
//자바 7이전
//반드시 final을 붙여야함
public void method1(final int arg)
{
final int localVariable = 1;
class Inner
{
void method()
{
//final을 붙히게 되면
//method()안에 지역변수로 arg, localVariable을 복사하여 사용
//int arg = 10;
//int localVariable = 1;
//와 같은 효과
int result = arg + localVariable;
}
}
}
//자바 8이후
//final을 붙히지 않아도 final의 특성을 가짐
//1) 로컬클래스에서 localVariable을 사용하는 경우
public void method2(int arg)
{
int localVariable = 1;
//localVariable = 10; final 특성을 가지고 있기 때문에 한번 값을 저장하면 다른 값으로 변경이 안됨
class Inner
{
void method()
{
int result = arg + localVariable;
}
}
}
//2) 로컬클래스에서 localVariable을 사용하지 않는 경우
public void method3(int arg)
{
int localVariable = 1;
localVariable = 10; //값 변경이 가능, 로컬 클래스에서 localVariable을 사용하지 않았기 때문에 localVariable은 final의 특성을 가지지 않음
class Inner
{
void method()
{
int result = arg + 10;
}
}
}
}
중첩 클래스에서 바깥 클래스 참조 얻기
예제)
package sec03.exam04_outterclass_ref;
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-method");
}
void print()
{
System.out.println(this.field); //Nested의 field
this.method(); //Nested의 method
System.out.println(Outter.this.field); //Outter의 field
Outter.this.method(); //Outter의 method
}
}
}
package sec03.exam04_outterclass_ref;
public class OutterExample
{
public static void main(String[] args)
{
Outter outter = new Outter();
Outter.Nested nested = outter.new Nested();
nested.print();
}
}
728x90