- 내부 클래스는 주로 AWT 나 Swing과 같은 GUI 애플리케이션의 이벤트처리 외에는 잘 사용하지 않을 정도로 사용빈도가 높지 않다.
- 때문에 내부클래스의 기본 원리와 특징을 이해하는 정도까지만 학습해도 충분하다.
- 내부 클래스는 클래스 내에 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.
아래와 같이 클래스가 두개가 있다고 하여 내부 클래스는 아니다.
package hello.core.godofjava.inner;
public class PublicClass {}
class JustNotPublicClass {}
Nested 클래스
class A {
}
class B {
}
- A 와 B 두 개의 독립적인 클래스를 아래와 같이 바꾸면 B는 A의 내부클래스가 되고 A는 B의 외부클래스가 된다.
- 이때 내부 클래스 B 는 외부 클래스 A를 제외하고는 다른 클래스에서 잘 사용되지 않는다.
class A { // 외부 클래스
class B { // 내부 클래스
}
}
Nested 클래스 사용이유
static nested 클래스 사용이유 : 한 곳에서만 사용되는 클래스를 논리적으로 묶어서 처리할 필요가 있을 때
inner 클래스 사용 이유 : 캡슐화가 필요할때 즉 내부 구현을 감추고 싶을 때를 말한다.
소스의 가독성과 유지보수성을 높이고 싶을 때
Static nested 클래스의 특징
public class OutOfStaic { // OutOfStaic 클래스 생성
static class StaticNested { // OutOfStaic 내부에 static 으로 StaticNested 클래스가 선언됨,
// 그 안에 선언된 메소드의 내용들은 간단하게 인스턴스 변수의 값을 저장하고
// 조회하는 작업을 수행함.
private int value = 0;
public int getValue(){
return value;
}
public void setValue(int value) {
this.value = value;
}
}
}
package hello.core.godofjava.inner;
public class NestedSample {
public static void main(String[] args) {
NestedSample sample = new NestedSample();
sample.makeStaticNestedObject();
}
public void makeStaticNestedObject() {
// StaticNested 클래스 객체 생성 방법
// 클래스 이름뒤에 . 을 쓰고 쓰면 됨
OutOfStaic.StaticNested staticNested = new OutOfStaic.StaticNested();
staticNested.setValue(3);
System.out.println(staticNested.getValue());
}
}
- Static nested 클래스를 만드는 이유는 클래스를 묶기 위해서이다.
- 만약 학교를 관리하는 School 클래스와 대학을 관리하는 University 클래스가 있고 이때 Student라는 클래스를 만들면 Student 가 School 학생인지 University 학생인지 불분명해진다.
- 물론 이 경우에 SchoolStudent라는 식의 클래스를 만들어도 상관없지만 필요하다면 아래와 같이 만들 수 있다.
- School.Student 는 School 클래스에서 만들었기 때문에 University 클래스에서는 사용할 수 없다.
public class School {
static class Student {
}
}
public class University {
static class Student {
}
}
- 그래서 겉보기에는 유사하지만, 내부적으로 구현이 달라야 할 때 이와 같이 static nested 클래스를 이용한다.
public class OutOfInner {
class Inner {
private int value =0;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
}
내부 클래스
앞에 있는 Static nested 클래스와 내부 클래스의 차이는 겉으로 보기에는 그냥 static를 쓰느냐 쓰지 않는냐의 차이이다.
static 를 제외한 내부 내용은 동일하다.
하지만 Inner 클래스의 선언부에는 static 선언이 없으므로 Inner 클래스의 객체를 생성하는 방법도 다르다.
객체를 생성한 다음에 사용하는 방법은 차이가 없지만 객체를 생성하는 방법에 차이가 있다.
package hello.core.godofjava.inner;
public class NestedSample {
public static void main(String[] args) {
NestedSample sample = new NestedSample();
sample.makeInnerObject();
}
public void makeInnerObject() {
OutOfInner outOfInner = new OutOfInner(); // Inner 클래스의 객체 생성전 먼저 Inner 클래스를 감싸는 OutOfInner 클래스의 객체 생성
OutOfInner.Inner inner = outOfInner.new Inner(); // outOfInner 객체를 통해 Inner 클래스의 객체를 생성할 수 있음
inner.setValue(3);
inner.getValue();
}
}
- 내부 클래스는 캡슐화 때문에 생성한다. 하나의 클래스에서 어떤 공통적인 작업을 수행하는 클래스가 필요한데 다른 클래스에서는 그 클래스가 전혀 필요가 없을 때 이러한 내부 클래스를 사용한다. 대표적인 예시가 GUI 관련 프로그램이다.