자바에서는 클래스, 인터페이스, 변수, 메서드 등의 멤버들을 선언할 때 접근제한자(Access Modifier)를 사용할 수 있습니다. 접근제한자는 해당 멤버에 접근할 수 있는 범위를 제어하기 위해 사용되며, 총 4가지 종류가 있습니다.
public: 모든 패키지에서 해당 멤버에 접근할 수 있습니다.
protected: 동일한 패키지 내에서는 public과 동일하게, 다른 패키지에서는 해당 멤버를 상속받은 자식 클래스에서만 접근할 수 있습니다.
default(package-private): 동일한 패키지 내에서만 해당 멤버에 접근할 수 있습니다. 따로 접근제한자를 명시하지 않으면 기본적으로 default로 설정됩니다.
private: 해당 멤버를 선언한 클래스 내에서만 접근할 수 있습니다.
접근제한자를 사용하는 이유는 클래스나 메서드 등의 멤버를 다른 사용자들과 공유하면서도, 내부적으로 사용하는 변수나 메서드 등을 숨기고 보호하기 위해서입니다.
예를 들어, public으로 선언된 메서드는 다른 패키지에서도 호출할 수 있으므로, 인터페이스의 일부분으로 사용되거나, 다른 프로그래머들이 사용할 수 있는 라이브러리로 배포될 때 유용합니다.
반면에, private으로 선언된 변수는 해당 클래스 내부에서만 사용할 수 있으므로, 다른 클래스에서 변수의 값을 변경하는 등의 잘못된 조작을 막을 수 있습니다.
접근제한자를 사용하는 경우는 대개 다음과 같습니다.
public: 다른 패키지에서도 해당 멤버를 사용할 수 있어야 할 때, 또는 인터페이스의 일부분으로 사용될 때.
protected: 상속 관계에 있는 자식 클래스에서 해당 멤버를 사용해야 할 때.
default(package-private): 같은 패키지 내에서만 해당 멤버를 사용해야 할 때.
private: 해당 클래스 내부에서만 사용해야 하는 변수나 메서드 등에 대해서.
public class ExampleClass {
public String publicVariable = "public";
public void publicMethod() {
System.out.println("This is a public method.");
}
}
위 코드에서 ExampleClass는 public으로 선언되어 있으므로, 다른 패키지에서도 이 클래스에 접근할 수 있습니다. 또한 publicVariable과 publicMethod도 public으로 선언되어 있으므로, 다른 클래스에서도 이 변수와 메서드에 접근할 수 있습니다.
public class ExampleClass {
protected String protectedVariable = "protected";
protected void protectedMethod() {
System.out.println("This is a protected method.");
}
}
public class ChildClass extends ExampleClass {
public void accessProtectedVariable() {
System.out.println("The value of protectedVariable is " + protectedVariable);
}
public void accessProtectedMethod() {
protectedMethod();
}
}
위 코드에서 ExampleClass의 protectedVariable과 protectedMethod는 해당 클래스를 상속받은 ChildClass에서 접근할 수 있습니다. ChildClass에서 accessProtectedVariable 메서드와 accessProtectedMethod 메서드를 사용하여 protectedVariable과 protectedMethod에 접근할 수 있습니다.
class ExampleClass {
String defaultVariable = "default";
void defaultMethod() {
System.out.println("This is a default method.");
}
}
public class AnotherClass {
public void accessDefaultVariable() {
ExampleClass example = new ExampleClass();
System.out.println("The value of defaultVariable is " + example.defaultVariable);
}
public void accessDefaultMethod() {
ExampleClass example = new ExampleClass();
example.defaultMethod();
}
}
위 코드에서 ExampleClass는 따로 접근제한자를 명시하지 않았으므로, default(package-private)로 설정됩니다. 따라서 ExampleClass 내부에서 선언된 defaultVariable과 defaultMethod는 같은 패키지 내에서만 접근할 수 있습니다. AnotherClass에서는 ExampleClass의 인스턴스를 생성하여, 이를 통해 defaultVariable과 defaultMethod에 접근할 수 있습니다.
public class ExampleClass {
private String privateVariable = "private";
private void privateMethod() {
System.out.println("This is a private method.");
}
public void accessPrivate() {
System.out.println("The value of privateVariable is " + privateVariable);
privateMethod();
}
}
위 코드에서 ExampleClass의 privateVariable과 privateMethod는 해당 클래스 내부에서만 접근할 수 있습니다. accessPrivate 메서드에서는 privateVariable과 privateMethod에 접근할 수 있습니다. 이는 ExampleClass 내부에서만 사용되는 변수와 메서드를 외부에서 접근하지 못하도록 보호하는데 사용됩니다.