내부클래스
내부클래스
내부클래스란?
내부 클래스란 클래스 내에 선언된 클래스이다. 클래스 내에 다른 클래스를 선언하는 이유는
두 클래스가 서로 긴밀한 관계에 있기 때문이다.
내부 클래스는 외부 클래스를 제외하고 다른 클래스에서 잘 사용되지 않는 것이여야 한다.
class Line {
public int line = 100;
// 내부클래스
public class Point {
public int x;
public int y;
public int getLine() {
return line; // <- 객체 생성없이 외부 클래스의 멤버변수 접근 가능.
}
}
public Point getPoint() {
return new Point();
}
}
내부 클래스의 장점
• 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
• 코드의 복잡성을 줄일 수 있다.(캡슐화)
내부 클래스 접근하기
public static void main(String[] args) {
Line line = new Line();
Line.Point test = line.getPoint();
}
내부 클래스의 종류와 특징
필드가 클래스로 바뀐 것 뿐이지 본질은 같다.(iv, cv, lv)
class Outer {
// iv
class InstanceInner {}
// cv
static class StaticInner {}
// lv
void myMethod() {
class LocalInner{}
}
}
내부 클래스의 제어자와 접근성
• 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
class InnerEx1 {
/**
* static 변수 및 메서드를 선언할 수 없다.
* final static은 상수이므로 허용한다.
*/
class InstanceInner {
int iv = 100;
final static int CONST = 200;
}
/**
* static 클래스만 static멤버를 정의할 수 있다.
*/
static StaticInner {
final static int iv = 300;
static int cv = 240;
}
void myMethod() {
/**
* static 변수 및 메서드를 선언할 수 없다.
* final static은 상수이므로 허용한다.
*/
class LocalInner{
int iv = 300;
final static int CONST = 400;
}
}
}
class InnerEx3 {
private int outerIv = 0;
static int outerCv = 0;
class InstanceInner {
int iiv = outerIv; //=> 외부 클래스의 private 멤버도 접근 가능하다.
int iiv2 = outerCv;
}
static class StaticInner {
// static class는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
// int siv = outerIv;
static int scv = outerCv;
}
void myMethod() {
int lv = 0;
final int LV = 0; //JDK1.8 부터 final 생략가능.
class LocalInner {
int liv = outerIv;
int liv2 = outerCv;
int liv3 = lv;
int liv4 = LV;
}
}
}
지역 클래스는 외부 클래스의 인스턴스멤버와 static멤버를 모두 사용할 수 있으며,
지역 클래스가 포함된 메서드에 정의된 지역변수도 사용할 수 있다. 단 final이 붙은
지역변수만 접근가능한데 그 이유는 메서드가 수행을 마쳐서 지역변수가 소멸된 시점에도,
지역 클래스의 인스턴스가 소면된 지역변수를 참조하려는 경우가 발생할 수 있기 때문이다.