- Java 세팅 및 실습은 Windows 환경에서 IntelliJ를 통해 진행되었습니다.
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);
}
}
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, 등)는 코드의 동작 방식을 세밀하게 조절할 수 있도록 도와줍니다.
- 이 제어자들을 적절히 활용하면 코드의 재사용성, 유지보수성, 안정성을 높일 수 있으며, 멀티스레드 환경이나 상속을 사용할 때 중요한 역할을 합니다.
- 다음 포스팅에서는 객체 지향 프로그래밍에서 가장 중요한 개념인 다형성에 대해서 다루어 보겠습니다.