Modifier in Java

Jerry·2025년 7월 31일

Class Modifiers

  1. Access Modifiers(접근 제어자)
    • public 어디서든 접근 가능
    • default (명시하지 않음) 같은 패키지 내에서만 접근 가능. 생략 가능한 수식어 중 유일하게 명시가 허용되지 않는 키워드
  2. 기타 수식어
    • abstract 인스턴스화 불가
    • final 상속 불가. sealed 클래스의 하위 클래스는 final 또는 non-sealed 필요
    • sealed 지정한 클래스만 상속 가능 (permits 사용)
    • non-sealed sealed 클래스의 하위 클래스 중 상속을 허용함
    • strictfp 부동소수점 연산을 플랫폼에 관계없이 일관되게 수행

Nested Class Modifiers

수식어static nested classinner classlocal classanonymous 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();  // Meow
a.sleep();  // Animal is sleeping
  • 추상 클래스는 추상 메서드가 1개여도 람다로 대체 불가

Class Members Modifiers

Fields(Member Variable)

  • Access Modifiers
  • static 클래스 전체에서 공유
  • final 상수. 한 번만 초기화 가능
  • transient 직렬화 대상에서 제외
  • volatile 메인 메모리의 값을 항상 읽음

Constructors

  • Access Modifiers

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

profile
Backend engineer

0개의 댓글