안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
로컬 클래스 내부에서는 바깥 클래스의 필드나 메서드를 제한 없이 사용할 수 있습니다.
로컬 클래스의 객체는 메서드 실행이 끝나도 힙 메모리 영역에 존재해서 계속 사용될 수 있지만,
매개 변수나 로컬 변수는 메서드의 실행이 끝나면 스택 메모리 영역에서 사라지기 때문에 로컬 객체에서 사용할 수 없는 문제가 발생합니다.
로컬 클래스에서 사용 가능한 것은 final로 선언된 매개 변수와 로컬 변수 뿐입니다.
자바 8부터는 final 키워드 없이 선언된 매개 변수나 로컬 변수를 선언해도 컴파일 에러가 나지 않습니다.
그렇다고 final 이 아닌 매개 변수와 로컬 변수를 허용하는 것은 아니라 final 을 선언하지 않아도 여전히 값을 수정할 수 없는 final 특성을 갖습니다. final 키워드가 있다면 로컬 클래스의 메서드 내부에 지역 변수로 저장되고, final 키워드가 없으면 로컬 클래스의 필드로 저장됩니다.
로컬 클래스의 내부 복사 위치에 신경 쓸 것 없이 로컬 클래스에서 사용된 매개 변수와 로컬 변수는 모두 final 특성을 갖는다는 것만 알고 있으면 됩니다.
예제)
public class Outter {
//자바7 이전
public void method1(final int arg) {
final int localVariable = 1;
//arg = 100; (x)
//localVariable = 100; (x)
class Inner {
public void method() {
int result = arg + localVariable;
}
}
}
//자바8 이후
public void method2(int arg) {
int localVariable = 1;
//arg = 100; (x)
//localVariable = 100; (x)
class Inner {
public void method() {
int result = arg + localVariable;
}
}
}
}
중첩 클래스에서 바깥 클래스 참조 얻기
클래스에서 this는 객체 자신의 참조입니다. 중첩 클래스에서 this 키워드를 사용하면 바깥 클래스의 객체 참조가 아니라 중첩 클래스의 객체 참조가 됩니다. 그렇게 때문에 중첩 클래스 내부에서 this.필드, this.메서드()로 호출하면 중첩 클래스의 필드와 메서드가 사용됩니다. 중첩 클래스 내부에서 바깥 클래스의 객체 참조를 얻으려면 바깥 클래스의 이름을 this 앞에 붙여주면 됩니다.
ex)
바깥클래스.this.필드
바깥클래스.this메서드();
바로 예제로 보겠습니다.
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);
this.method();
System.out.println(Outter.this.field);
Outter.this.method();
}
}
}
실행 클래스
'자바' 카테고리의 다른 글
JAVA 자바 : 익명 자식 객체 생성 (0) | 2017.03.13 |
---|---|
JAVA 자바 중첩 인터페이스 Interface (0) | 2017.03.13 |
JAVA 자바 중첩 클래스 : 중첩 클래스의 접근 제한 - 바깥 필드와 메서드에서 사용 제한, 멤버 클래스에서 사용 제한 (0) | 2017.03.13 |
JAVA 자바 중첩 클래스: 인스턴스 멤버 클래스, 정적 멤버 클래스, 로컬 클래스 (0) | 2017.03.13 |
JAVA - 중첩 클래스와 중첩 인터페이스의 개념 (0) | 2017.03.13 |