[Java 초급] 4. Java 제어자 (Modifiers)

Kyung Jae, Cheong·2024년 8월 22일
post-thumbnail

4. Java 제어자 (Modifiers)

  • Java에서 제어자(Modifiers)는 클래스, 메서드, 변수의 접근 범위와 동작 방식을 정의하는 데 사용됩니다.
    • 제어자는 크게 접근 제어자기타 제어자로 나눌 수 있으며, 이를 통해 코드의 가독성, 보안성, 유지보수성을 높일 수 있습니다.

4-1. 접근 제어자 (Access Modifiers)

  • 접근 제어자는 클래스, 메서드, 변수의 접근 범위를 제한하는 역할을 합니다. Java에서는 public, protected, default, private 네 가지 접근 제어자를 제공합니다.

public

  • public으로 선언된 클래스, 메서드, 변수는 어디서든 접근할 수 있습니다. 다른 패키지나 클래스에서도 접근이 가능합니다.
  • 사용 가능 위치 : 클래스, 메서드, 변수
public class MyClass {
    public int myVariable;  // 어디서든 접근 가능

    public void myMethod() {
        // ...
    }
}

protected

  • protected로 선언된 메서드나 변수는 같은 패키지 내에서 접근할 수 있으며, 다른 패키지의 자식 클래스에서도 접근이 가능합니다.
  • 사용 가능 위치 : 메서드, 변수
class MyClass {
    protected int myVariable;  // 같은 패키지와 상속받은 클래스에서 접근 가능

    protected void myMethod() {
        // ...
    }
}

default (package-private)

  • 접근 제어자를 명시하지 않은 경우 default 접근 제어자가 적용됩니다. 이는 같은 패키지 내에서만 접근할 수 있습니다.
  • 사용 가능 위치 : 클래스, 메서드, 변수
class MyClass {
    int myVariable;  // 같은 패키지 내에서만 접근 가능

    void myMethod() {
        // ...
    }
}

private

  • private으로 선언된 메서드나 변수는 해당 클래스 내에서만 접근할 수 있습니다. 외부 클래스나 다른 패키지에서 접근할 수 없습니다.
  • 사용 가능 위치 : 메서드, 변수
class MyClass {
    private int myVariable;  // 클래스 내에서만 접근 가능

    private void myMethod() {
        // ...
    }
}

4-2. 기타 제어자(Other Modifiers)

  • 이 외에도 Java에서는 static, final, abstract, synchronized, volatile, transient, native, strictfp 등의 제어자가 있습니다.
    • 현재 단계에서는 static, final, abstract 정도를 다룰 것이고, 나머진 좀 더 많은 배경지식의 설명이 필요하여 생략합니다.

static

  • static으로 선언된 멤버(변수나 메서드)는 클래스 레벨에서 관리되며, 객체 인스턴스와 무관하게 사용됩니다. 클래스 변수와 클래스 메서드라고도 불립니다.
  • 사용 가능 위치: 메서드, 변수, 내부(중첩) 클래스
public class MyClass {
    public static int myStaticVariable;  // 클래스 변수

    public static void myStaticMethod() {
        // 클래스 메서드
    }
}
  • 참고로 다른 클래스의 static 멤버(변수나 메서드)를 클래스 이름 없이 사용할 수 있도록 하는 import static 문이란 것이 있습니다.
    • import 구문에서 사용할 수 있습니다.
    • static으로 정으된 변수나 메서드들을 불러올 수 있습니다.
import static java.lang.Math.PI;
import static java.lang.Math.pow;

public class MyClass {
    public void calculateCircleArea() {
        double area = PI * pow(2, 2);  // Math.PI와 Math.pow를 클래스 이름 없이 사용
    }
}

final

  • final로 선언된 변수는 값을 변경할 수 없으며, 메서드는 오버라이딩할 수 없고, 클래스는 상속할 수 없습니다.
  • 사용 가능 위치: 클래스, 메서드, 변수
public final class FinalClass {
    public final int myFinalVariable = 10;  // 상수

    public final void myFinalMethod() {
        // 이 메서드는 오버라이딩할 수 없음
    }
}

abstract

  • abstract는 구현이 없는 메서드(추상 메서드)나 상속받아야만 사용할 수 있는 클래스(추상 클래스)를 정의할 때 사용됩니다.
    • 다음 포스팅인 다형성을 다룰때 자세히 다룰 예정입니다.
  • 사용 가능 위치: 클래스, 메서드
public abstract class Animal {
    public abstract void sound();  // 추상 메서드 (구현 없음)
}

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Bark");
    }
}
  • 참고로 추상 메서드가 하나라도 있으면 해당 클래스는 무조건 abstract 클래스가 되어야 합니다.

4-3. 클래스, 메서드, 변수별 사용 가능한 제어자

사용 위치사용 가능한 제어자
Top-Level 클래스public, default (protected와 private는 사용할 수 없음) // final, abstract
Inner (중첩) 클래스public, protected, default, private // static, final, abstract
메서드public, protected, default, private // static, final, abstract
변수public, protected, default, private // static, final
로컬 변수final (로컬 변수는 접근 제어자를 가질 수 없지만, final로 선언하여 상수로 만들 수 있음)
  • Top-Level 클래스(자바 파일명과 같은 최상위 클래스)는 public 또는 default 접근 제어자만 사용할 수 있습니다.
    • 이때, public은 한개만 가질수 있고, default는 여러개 정의될 수 있습니다.
  • 참고로 실무에서는 클래스 내부 변수들은 가능한 private으로 감추어 외부에서 수정할 수 없도록 하는 것이 권장되고, 메서드들은 필요한 기능들만 public으로 노출하고, 내부에서만 쓰이는 메서드들은 private으로 감추는 것이 권장됩니다.

마무리

  • 제어자는 클래스, 메서드, 변수의 동작과 접근 범위를 지정하는 데 중요한 역할을 합니다.
    • 접근 제어자(public, protected, default, private)는 코드의 접근성을 조절하여 보안과 구조적 일관성을 유지하는 데 기여합니다.
    • 기타 제어자(static, final, abstract, 등)는 코드의 동작 방식을 세밀하게 조절할 수 있도록 도와줍니다.
  • 이 제어자들을 적절히 활용하면 코드의 재사용성, 유지보수성, 안정성을 높일 수 있으며, 멀티스레드 환경이나 상속을 사용할 때 중요한 역할을 합니다.
  • 다음 포스팅에서는 객체 지향 프로그래밍에서 가장 중요한 개념인 다형성에 대해서 다루어 보겠습니다.
profile
일 때문에 포스팅은 잠시 쉬어요 ㅠ 바쁘다 바빠 모두들 화이팅! // Machine Learning (AI) Engineer & BackEnd Engineer (Entry)

0개의 댓글