• Nested Classes
다른 클래스 내에 정의된 클래스이다.
외부 클래스의 멤버로 간주하며 멤버 변수 및 메서드에 접근할 수 있다.
코드의 구조를 조직화하고 캡슐화하는데 유용하다.
• Nested 클래스 4가지
1. Static Nested 클래스 (정적 중첩 클래스)
외부 클래스의 정적 멤버로 선언되는 클래스이다
외부 클래스의 인스턴스에 종속되지 않고 정적 멤버에만 접근한다.
2. Inner 클래스 (인스턴스 중첩 클래스)
외부 클래스의 멤버 변수로 선언되는 클래스이다.
외부 클래스의 인스턴스에 종속되며 모든 멤버에 접근할 수 있다.
외부 클래스의 인스턴스를 통해 생성된다.
class OuterClass { // 외부 클래스
class InnerClass { // 인스턴스 중첩 클래스
int nonStaticField; // 인스턴스 필드
// static int staticField;
// 정적 필드는 인스터스 클래스에서 선언할 수 없다.
InnerClass() {} // 인스턴스 클래스의 생성자
void nonStaticMethod() {} // 인스턴스 메소드
// static void staticMethod() {}
// 정적 메소드는 인스턴스 클래스에서 선언할 수 없다.
}
static class StaticNestedClass { // 정적 중첩 클래스
int nonStaticField; // 인스턴스 필드
static int staticField; // 정적 필드
StaticNestedClass() {} // 정적 중첩 클래스의 생성자
void nonStaticMethod() {} // 인스턴스 메소드
static void staticMethod() {} // 정적 메소드
}
}
3. Local 클래스 (지역 클래스)
지역 변수와 마찬가지로 메서드 내부에서만 접근할 수 있다.
메서드 내에서만 인스턴스화된다.
class AClass {
void method() { // 외부 클래스의 메소드 정의
class LocalClass { // 로컬 클래스 정의 시작 (method() 내부에서만 사용 가능)
int nonStaticField; // 인스턴스 필드 (비정적 필드)
// static int staticField;
// 로컬 클래스에서 정적 필드는 선언할 수 없다.
LocalClass() {} // 로컬 클래스의 생성자
void nonStaticMethod() {} // 인스턴스 메소드 (비정적 메소드)
// static void staticMethod() {}
// 로컬 클래스에서 정적 메소드는 선언할 수 없다.
}
LocalClass lc = new LocalClass(); // 로컬 클래스의 인스턴스 생성
lc.nonStaticField = 1; // 로컬 클래스의 인스턴스 필드에 값 설정
lc.nonStaticMethod(); // 로컬 클래스의 인스턴스 메소드 호출
}
}
4. Anonymous 클래스 (익명 클래스)
이름이 없는 클래스로 클래스 정의와 동시에 인스턴스를 생성한다.
주로 인터페이스를 구현하거나 추상 클래스를 상속하는 형태로 사용한다.
이벤트 처리기, 쓰레기 코드 등에서 사용한다.
class SuperClass { // 슈퍼 클래스 정의
void method() { // 슈퍼 클래스의 메소드 정의
System.out.println("method in Super Class");
}
}
public class AnonymousExample { // 메인 클래스 정의
private static void print(SuperClass obj) {
// 스태틱 메소드 print() 정의, SuperClass 타입의 매개변수를 받음
obj.method(); // 매개변수로 받은 객체의 method() 메소드 호출
}
public static void main(String[] args) { // 메인 메소드 정의
print(new SuperClass() {
// SuperClass를 상속받는 익명 클래스의 인스턴스를 생성하여 print() 메소드에 전달
@Override // 메소드 오버라이딩을 표시하는 어노테이션
void method() { // 익명 클래스에서 method() 메소드를 오버라이딩하여 재정의
System.out.println("method in Anonymous Class");
}
});
}
}
• effictively final 변수
java 8 이후의 버전에서 도입된 개념이다.
로컬 변수나 매개변수를 내부 클래스에서 사용할 때 final로 선언하지 않아도 자동으로 final로 취급되는 변수이다.
(익명 클래스, 로컬 클래스, 람다 표현식 등)
effectively final 변수는 한번 초기화되면 다른 값으로 변경하는 것이 불가능하다.
장점
코드의 가독성과 유지보수성이 향상된다.
내부 클래스에서 외부 변수의 값을 안전하게 사용할 수 있다.
public class Example {
public void performAction() {
int x = 10;
int y = 20;
// 익명 클래스에서 x와 y를 참조
Runnable runnable = new Runnable() {
@Override
public void run() { // run()
System.out.println("x + y = " + (x + y));
}
};
x = 30; // x 값을 변경
// y 값의 경우, 변경이 되지 않았기 때문에 자동으로 effectively final 변수 취급
runnable.run();
}
}
'CS > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향프로그래밍] #9 람다식 (0) | 2024.06.13 |
---|---|
[객체지향프로그래밍] #7 제네릭과 컬렉션 (0) | 2024.06.13 |
[객체지향프로그래밍] #6 모듈과 패키지 (0) | 2024.06.09 |
[객체지향프로그래밍] #5 상속 (0) | 2024.04.25 |
[객체지향프로그래밍] #4 클래스와 객체 (0) | 2024.04.21 |