그냥 제어자에 대한 내용이 궁금하다면 아래 링크를 확인하시라 🐱👤
2020/12/14 - [JAVA BASE/05. OOP(객체지향 프로그래밍)] - 09-1. [JAVA] 제어자(modifier)
접근 제어자(access modifier)
접근 제어자는 멤버 또는 클래스에 사용되어, 해당 멤버 또는 클래스를 외부에서 접근하지 못하게
제한하는 역할을 한다.
접근제어자가 지정되어 있지 않다면, 접근제어자는 default이다
private 같은 클래스 내에서만 접근이 가능
default 같은 패키지 내에서만 접근이 가능
protected 같은 패키지내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
public 접근 제한이 전혀 없음.
public > protected > default > private
표로 정리를 해보자
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전 체 |
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | |
default | ○ | ○ | ||
private | ○ |
대상 | 사용가능한 접근 제어자 |
클래스 | public, (defaule) |
메서드 | public, protected, (default), private |
멤버변수 | |
지역변수 | 없 음 |
접근 제어자를 이용한 캡슐화
주로 멤버에 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다.
데이터가 유요한 값을 유지하도록, 또는 비밀번호롸 같은 데이터를 외부에서 함부로 변경하지 못하게 하기 위해
접근을 제어하는 것이 필요하다.
이를 데이터 감추기(data hiding)라고 하며, 객체지향개념의 캡슐화(encapsulation)에 대한 내용이다.
외부에서 접근 할 필요가 없는 멤버들을 private으로 지정하여 노출시키지 않음으로써 복잡성을 줄여줄수 있고
이것역시 캡슐화이다.
접근 제어자를 사용하는 이유
* 외부로부터 데이터를 보호하기 위해서
* 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
하나 예를 들어보면..
public class Time{
public int hour;
public int min;
public int sec;
}
main{
Time t = new Time();
t.hour = 25;
}
위의 내용에서 시간을 25로 바꿔주었는데 시간은 0과 같거나 크고 24보다는 작은 범위를 가져야 한다
틀린 시간을 입력해도 막을 방법이 없다.
이때 private나 protected로 제한하고 멤버변수의 값을 변경할 public 메소드를 지정하여
hour변수에 올바르게 데이터를 넣게 유도할수 있다.
public class Time {
private int hour; // 접근 제어자를 private으로 하여 외부에서 직접 접근을 막는다.
public int getHour() { return hour; }
public int setHour(int hour) {
if(hour < 0 || hour > 23) return;
this.hour = hour;
}
}
getHour메서드는 멤버변수의 값을 반환해주고 setHour메서드는 매개변수의 값이 조건에 맞는 값인지 확인 후
조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성되어 있다.
보통 멤버변수의 값을 읽는 메서드는 이름을 'get멤버변수이름'
멤버변수의 값을 변경하는 메서드는 이름을 'set멤버변수이름'으로 한다.
암묵적인 규칙이므로 특별한 이유가 없다면 이렇게 하도록 하자.
그리고 get으로 시작하는 메서드를 겟터(getter), set으로 시작하는 메서드를 셋터(setter)라고 부른다.
제어자(modifier)의 조합
대 상 | 사용가능한 제어자 |
클래스 | public, (default), final, abstract |
메서드 | 모든 접근 제어자, final, abstract, static |
멤버변수 | 모든 접근 제어자, final, static |
지역변수 | final |
제어자를 조합해서 사용할 때 주의점.
1. 메서드에 static과 abstract를 함께 사용할 수 없다.
static메서드는 몸총이 있는 메서드에만 사용할 수 있기 때문이다.
2. 클래스에 abstract와 final은 동시에 사용할 수 없다.
클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고
abstract는 상속해야 완성된다는 의미이므로 서로 상반되기 때문이다.
3. abstract메서드의 접근 제어자가 private일 수 없다.
2번과 마찬가지로 abstract는 자손을 만들어야 하는데
private는 자손을 만들수 없기 때문
4. 메서드에 private과 final을 같이 사용할 필요는 없다.
접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다.
둘중 하나만 사용해도 의미가 충분하다.
protected를 정확히 언제 쓰는건지 헷갈려 하고 있었는데😆
접근 제어자에 대한 정리르 확실하게 한거 같다
다른 패키지에서 까지 상속받아서 쓸 일이 있을까 싶기는 하지만
다른 패키지에서 상속받을 일이 생기면 사용해봐야지👌
댓글