안녕하세요. 성조입니다.
이번 포스팅은 학부에서 한참 자바 배울 때 온갖 이해 안 가는 것 중. 유일하게 비교적 쉽게 이해됐던 개념입니다.
혹여나 올바르지 못한 지식 전달이 있다면 언제든지 댓글 남겨주시면 감사드리겠습니다!
접근 지정자(Access Modifier)란?
자바에서 클래스, 변수, 메서드, 생성자에 대한 접근을 제한하거나, 제어하기 위해서 사용하는 키워드이다.
클래스 또는 객체의 상태와 동작과 같은 값을 보호하는 데 사용된다.
자바는 객체 지향 언어이므로, 객체 지향 프로그래밍을 해야 한다. 접근 지정자의 경우. 중요한 원칙인 캡슐화(Encapsulation)와 데이터 은닉화(Data Hiding)를 지키기 위한 수단으로 사용된다.
● 캡슐화(Encapsulation)
캡슐화란? A라는 데이터와 이 'A' 데이터를 처리하는 'B'라는 메서드를 하나로 묶는 과정을 말한다. 캡슐화 과정을 통해 직접적으로 접근하는 것이 아니라 메서드를 통해 간접적으로 접근하도록 하여, 데이터를 보호하고 코드의 재사용성을 향상한다.
● 데이터 은닉(Data Hiding)
데이터 은닉은 클래스의 내부 데이터를 외부로부터 숨기는 것을 말한다.
한국에서 일반 아파트 건축물을 지을 때. 현관문이나, 유리가 아닌 벽면 부분을 보이게 짓지는 경우는 거의 없다.
사생활이 보장되어야 하기 때문이다. 데이터 은닉도 건축물과 같이 클래스의 상태를 보호하고, 클래스 사용자가 클래스 내부의 복잡한 구현 세부사항을 이해할 필요가 없도록 도와주는 것을 데이터 은닉이라 말한다.
[정리표]
접근 지정자 종류와 활용법
- Private
Private 접근 지정자는 지정자가 선언된 변수, 메서드 또는 생성자와 같은 클래스 내에 있는 경우만 접근이 가능하다.
즉, 클래스 내부의 특정 데이터나 메서드를 숨기는 데 사용된다.
내부 구현에 대한 세부 정보를 외부에 노출시키지 않으며, 클래스 사용자가 내부 복잡성을 이해하지 않고도 클래스를 사용할 수 있도록 하기 위한 접근 지정자이다. 외부 클래스에서 이 멤버 값에 접근할 수 없기 때문에 클래스의 데이터가 캡슐화와 데이터 은닉성이 보장할 수 있다.
- Protected
Protected 접근 지정자는 같은 패키지 내의 클래스 또는 하위 클래스에서만 접근할 수 있다.
상위 클래스와 하위 클래스가 동일한 패키지에 있든 아니든, 하위 클래스에서 상위 클래스의 멤버에 접근해야 하는 경우에 사용된다. 상속과 캡슐화 개념이 활용된다.
- Default
접근 지정자를 명시적으로 선언하지 않은 경우를 디폴트 접근 지정자라고 한다.
기본적으로 디폴트 접근 지정자의 클래스, 변수, 메서드는 같은 패키지 내에서만 접근할 수 있다.
기본 접근 지정자는 클래스나 멤버가 동일한 패키지 내에서만 접근할 때 사용되는데 이것은 패키지 단위의 캡슐화를 제공하는 것이다.
- Public
접근 지정자가 선언된 클래스, 변수, 메서드 또는 생성자는 어디서든 접근할 수 있고, 제한 없이 접근할 수 있다.
일반적으로 인터페이스 메서드, 공용 API or 오픈 API 등에서 사용되며, 클래스 외부에서 자유롭게 사용할 수 있도록 한다.
접근 지정자 예제
- Private
public class ExampleClass {
private int privateVariable; // private 멤버 변수
private void privateMethod() { // private 메서드
// ...
}
}
Private 접근 지정자는 외부 클래스에서 접근이 불가능하기 때문에 주로 멤버 변수 또는 내부에서 사용될 메서드에 사용한다.
- Protected
public class ExampleClass {
protected int protectedVariable; // protected 멤버 변수
protected void protectedMethod() { // protected 메서드
// ...
}
}
Protected 접근 지정자는 같은 패키지 내의 다른 클래스 또는 다른 패키지의 하위 클래스에서 접근할 수 있으며, 상속 관계를 가진 클래스에서 사용된다.
- Default
class ExampleClass {
int defaultVariable; // default 멤버 변수
void defaultMethod() { // default 메서드
// ...
}
}
디폴트 접근 지정자는 뜻 그대로 기본적으로 Default(또는 package-private) 접근 지정자가 적용된다.
같은 패키지 내의 다른 클래스에서 접근 가능하지만 다른 패키지에서 접근이 불가능하다.
- Public
public class ExampleClass {
public int publicVariable; // public 멤버 변수
public void publicMethod() { // public 메서드
// ...
}
}
Public 접근 지정자는 어디서든 접근이 가능하다. 그렇기 때문에 공용으로 사용하는 API를 정의할 때 주로 사용된다.
[1. 예제]
public class ExampleClass {
private int privateVariable;
public int getPrivateVariable() {
return privateVariable;
}
public void setPrivateVariable(int privateVariable) {
this.privateVariable = privateVariable;
}
}
private 값은 getter/setter 메서드를 통해서만 클래스의 내부 데이터에 대해 제어 활용이 가능하게 된다.
[2. 예제]
public class ExampleClass {
private int privateVariable;
public int getPrivateVariable() {
return privateVariable;
}
public void setPrivateVariable(int privateVariable) {
if (privateVariable >= 0) { // 값이 0 이상인 경우에만 설정
this.privateVariable = privateVariable;
}
}
}
'1. 예제'를 조금 수정하여 private 변수의 값이 정수일 때만 받도록 할 수 있다.
private 접근 지정자를 사용하면 클래스의 내부 구현을 변경하더라도 해당 클래스를 사용하는 코드에는 영향을 미치지 않게 할 수 있다.
접근 지정자 사용 원칙
접근 권한 최소화
클래스, 메서드, 변수와 같은 값들을 최소한의 필요한 곳에 접근할 수 있도록 설정하면 필요한 곳에서 필요한 만큼만 호출하고 사용하기 때문에 코드의 유지 보수가 쉬워진다.
가장 좁은 범위의 접근 지정자를 활용하고, 필요에 따라 접근 범위를 확장하면서 넓히는 것을 권장한다.
캡슐화와 데이터 은닉
직접적인 접근을 허용하지 않고 메서드를 통해 클래스에 접근하는 것이 일반적으로 사용된다. getter/setter 메서드를 사용하여 접근하는데 getter/setter에 대해서는 향후 포스팅에서 자세하게 다뤄볼 예정이다.
클래스와 인터페이스
public 접근 지정자가 클래스나 인터페이스의 공개되는 API를 정의하는 데 사용된다. 이는 외부 코드가 이 메서드를 자유롭게 호출할 수 있도록 허용하는 것이다. 이때 중요한 민감 정보로 활용될 것 같은 정보에 대해서는 외부에서 접근할 수 없도록 주의하는 것이 좋다.
오타나 궁금한 부분이 있다면 언제든지 댓글 남겨주시면 최대한 답변드리겠습니다.
다음 포스팅 때 뵙겠습니다. 감사합니다.
'Java ☕ > Java' 카테고리의 다른 글
[Java] 자바 SE, EE 정리 (with ME, FX 맛보기 정리) (0) | 2023.05.30 |
---|---|
[Java] 개방-폐쇄 원칙 (Open-Closed Principle , OCP) (1) | 2023.05.30 |
[Java] 단일 책임 원칙(Single Responsibility Principle, SRP) (0) | 2023.05.29 |
[Java] 박싱(Boxing)과 언박싱(Unboxing) (0) | 2023.05.28 |
[Java] Call by Value와 Call by Reference 정리. (값 호출과 참조 호출.) (0) | 2023.05.24 |