내부 클래스
- 소스 파일 줄이기
- 공개할 필요없는것 숨기기
- 클래스 내부 클래스의 종류와 상관없이 외부 클래스 객체는 내부 클래스 객체의
멤버를 접근 권한 수식어 상관없이 접근할 수 있음 - 클래스 내부 클래스를 정의할 때 보통 private로 함 (다른 클래스에서 사용못하게)
- 일반 내부 클래스는 static 멤버를 가질수없음(중첩클래스는 가능)
- private로 정의해도 outter 클래스는 접근가능
public class OuterClass {
private String message = "Hello from OuterClass";
// private 내부 클래스
private class InnerClass {
public void displayMessage() {
System.out.println(message); // 외부 클래스의 private 필드에 접근
}
}
// 외부 클래스에서 내부 클래스 사용
public void useInnerClass() {
InnerClass inner = new InnerClass();
inner.displayMessage();
}
}
- 메소드 내 클래스를 정의할때 class에 접근 제어 수식어 사용불가
void sortByName(String[] names) {
class NameComparator implements Comparator<String> {
@Override public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
};
Arrays.sort(names, new NameComparator());
}
- 메소드 내 클래스는 메소드의 지역변수사용가능
- final 변수거나 실질적 final 이면 괜찮음
void printSum() {
int total = 100;
// total = 200; // 실질적 final
class Calculator {
public int add(int value) {
// total = 300; // 여기서도 수정 불가 실질적 final
return total + value; //메소드의 지역변수 사용
}
}
// total = 400; // 여기서도 수정 불가 실질적 final
Calculator calc = new Calculator();
System.out.println(calc.add(50));
}
내부 클래스 vs 중첩클래스
- 중첩클래스는 static 을 통해 정의된 클래스
- 중첩클래스는 외부 클래스의 인스턴스에 의존하지 않음.
- 외부 클래스의 정적 멤버처럼 동작하며, 외부 클래스의 정적 멤버에만 접근 가능
public class OuterClass {
private String message = "Hello from OuterClass";
// 내부 클래스
public class InnerClass {
public void displayMessage() {
System.out.println(message); // 외부 클래스의 멤버에 접근
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass(); // 외부 클래스 객체 필요
inner.displayMessage(); // 출력: Hello from OuterClass
}
}
public class OuterClass {
private static String staticMessage = "Hello from Static Nested Class";
// static 중첩 클래스
public static class StaticNestedClass {
public void displayMessage() {
System.out.println(staticMessage); // 정적 멤버에 접근 가능
}
}
public static void main(String[] args) {
StaticNestedClass nested = new StaticNestedClass(); // 외부 클래스 객체 불필요
nested.displayMessage(); // 출력: Hello from Static Nested Class
}
}
'Language > JAVA' 카테고리의 다른 글
[Java]쓰레드, 레코드 (0) | 2024.12.03 |
---|---|
[Java] 인터페이스 (0) | 2024.12.03 |
[Java] 열거형 (0) | 2024.12.03 |