Class Modifiers
- Access Modifiers(접근 제어자)
public 어디서든 접근 가능
default (명시하지 않음) 같은 패키지 내에서만 접근 가능. 생략 가능한 수식어 중 유일하게 명시가 허용되지 않는 키워드
- 기타 수식어
abstract 인스턴스화 불가
final 상속 불가. sealed 클래스의 하위 클래스는 final 또는 non-sealed 필요
sealed 지정한 클래스만 상속 가능 (permits 사용)
non-sealed sealed 클래스의 하위 클래스 중 상속을 허용함
strictfp 부동소수점 연산을 플랫폼에 관계없이 일관되게 수행
Nested Class Modifiers
| 수식어 | static nested class | inner class | local class | anonymous class |
|---|
public | ✅ | ✅ | ❌ | ❌ |
protected | ❌ | ✅ | ❌ | ❌ |
private | ✅ | ✅ | ❌ | ❌ |
default | ✅ | ✅ | ✅ | ✅ |
static | ✅ (필수) | ❌ | ❌ | ❌ |
abstract | ✅ | ✅ | ✅ | ✅ |
final | ✅ | ✅ | ✅ | ✅ (기본적으로 final) |
strictfp | ✅ | ✅ | ✅ | ❌ |
sealed | ✅ | ✅ | ❌ | ❌ |
non-sealed | ✅ | ✅ | ❌ | ❌ |
Static Nested Class modifiers
public class Outer {
private static String data = "Static Data";
public static class StaticNested {
public void print() {
System.out.println("Access: " + data);
}
}
}
Outer.StaticNested nested = new Outer.StaticNested();
- 외부 클래스의 인스턴스 없이 사용 가능
- 외부 클래스의 정적(static) 멤버만 접근 가능
Inner Class
Instance Inner Class modifiers
public class Outer {
private String outerField = "Outer";
public class Inner {
public void printOuter() {
System.out.println("Access: " + outerField);
}
}
}
new Outer().new Inner()로 인스턴스 생성 가능
- 외부 클래스의
private 멤버에도 접근 가능
- 외부 클래스 인스턴스와 암묵적인 참조(Outer.this)를 유지
Local Class
public class Outer {
public void doSomething() {
class Local {
public void hello() {
System.out.println("Local class");
}
}
Local l = new Local();
l.hello();
}
}
- 메서드 내부에 정의됨
- 메서드 내 로컬 변수는 effectively final이어야 접근 가능
- Java에서 effectively final이란, 명시적으로
final 키워드를 붙이지 않았지만, 사실상 값을 변경하지 않는(변경되지 않는) 지역 변수를 의미합니다.
- 바깥 메서드가 끝나면 클래스 정의도 사라짐
Anonymous Class
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Anonymous class");
}
};
- 이름 없는 일회성 클래스
- 주로 인터페이스나 추상 클래스 구현 시 사용
- 람다 표현식으로도 대체 가능 (Java 8+)
익명 클래스 - 인터페이스 구현 예시
@FunctionalInterface
interface Greetable {
void greet();
}
Greetable g = new Greetable() {
@Override
public void greet() {
System.out.println("Hello from anonymous class");
}
};
g.greet();
람다 표현식 대체 (Java 8+)
Greetable g = () -> System.out.println("Hello from lambda");
g.greet();
- 조건: 인터페이스가
@FunctionalInterface (추상 메서드 1개)일 때만 람다로 대체 가능
익명 클래스 - 추상 클래스 상속 예시
abstract class Animal {
abstract void sound();
void sleep() {
System.out.println("Animal is sleeping");
}
}
Animal a = new Animal() {
@Override
void sound() {
System.out.println("Meow");
}
};
a.sound();
a.sleep();
- 추상 클래스는 추상 메서드가 1개여도 람다로 대체 불가
Class Members Modifiers
Fields(Member Variable)
Access Modifiers
static 클래스 전체에서 공유
final 상수. 한 번만 초기화 가능
transient 직렬화 대상에서 제외
volatile 메인 메모리의 값을 항상 읽음
Constructors
Initializer Blocks
default (명시하지 않음) 인스턴스가 생성될 때마다 실행
static 클래스가 처음 로드될 때 단 한 번 실행
Method
Access Modifiers
abstract 추상 클래스나 인터페이스에서만 사용 가능
final 오버라이드 불가
static 클래스 소속. this 사용 불가
synchronized 스레드 동기화
native Java 외 언어로 구현됨 (본문 없음)
strictfp 부동소수점 연산 일관성 보장
Nested (interface, class, enum, annotation)
Access Modifers
static (생략 가능)
abstract (생략 가능)
strictfp 부동소수점 계산의 일관성 보장
sealed, non-sealed, permits 상속(구현) 가능한 타입을 제한
Interface Modifiers
Access Modifiers
- 외부 클래스 안에 선언된 경우에만
protected, private 사용 가능
abstract (생략 가능)
strictfp 부동소수점 계산의 일관성 보장
sealed, non-sealed, permits 상속(구현) 가능한 타입을 제한
Interface Members Modifiers
Fields(Member Variable)
public static final (생략 가능)
Methods
public abstract (암묵적 적용, 생략 가능) — 추상 메서드
default 기본 구현 제공 (암묵적으로 public)
static 정적 메서드 (암묵적으로 public)
private 내부 재사용용
strictfp 부동소수점 일관성 보장
Nested (interface, class, enum, annotation)
Access Modifiers
static (생략 가능)
abstract
strictfp
sealed, non-sealed, permits
Enum Modifiers
Access Modifiers: public, (default)
strictfp 부동소수점 연산 일관성 보장
sealed, non-sealed, permits 상속 제한 제어
Annotaion
Access Modifiers: public, (default)
abstract (생략 가능)
strictfp
sealed, non-sealed, permits
Record
Access Modifiers: public, (default)
final (생략 가능)
strictfp: 부동소수점 연산 일관성 보장
sealed, non-sealed, permits 상속 제어
Reference
Java Documentation - Nested Classes