충분히 쌓여가는
캡슐화 본문
캡슐화와 접근 제어자
접근제어자를 사용하는 이유: 1. 외부로부터 데이터를 보호하기 위해 => 캡슐화
예를 들어 Time이라는 클래스에서 시, 분, 초가 해당 하는 범위가 있는데
멤버변수에 직접 대입을하여 hour가 25가 입력되는 사태가 발생할 수 있다
public class Time {
public int hour; // iv
public int minute; // iv
public int second; // iv
}
Time t = new Time();
t.hour = 25; // 멤버변수에 직접 접근
따라서 iv들을 보호하기 위해 접근 제어자를 private로 하여 외부에서 직접 접근하지 못하도록 해야한다
메서드는 public로 하여 외부에서 직접적인 접근은 막고, 외부에서 메서드를 통해 간접적으로 iv에 접근하도록 한다
public class Time {
private int hour;
private int minute;
private int second;
public int getHour() { return hour; }
public void setHour(int hour) {
if (hour < 0 || hour > 23) return;
this.hour = hour;
}
}
접근제어자를 사용하는 이유: 2. 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
class Time {
private int hour; // 0 ~23
private int minute;
private int sencond;
public void setHour(int hour) {
if (hour < 0 || hour > 23) return;
this.hour = hour;
}
public int getHour() {return hour; }
}
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.setHour(21); // hour의 값을 21로 변경
System.out.println(t.getHour()); // 21
t.setHour(100); // 100은 유효한 값이 아니기 떄문에 if문이 true가 되어 해당 문을 빠져나간다
System.out.println(t.getHour()); // 21
}
}
메서드 추출
인텔리제이 MAC: cmd + opt + m
isNotValidHour 는 외부에 굳이 보여질 필요는 없기 때문에
public보다 private로 하는 것이 좋다
class Time {
private int hour; // 0 ~23
private int minute;
private int sencond;
public void setHour(int hour) {
if (isNotValidHour(hour)) return;
this.hour = hour;
}
// 매개변수로 넘겨진 hour이 유효한지 확인해서 알려주는 메서드
private static boolean isNotValidHour(int hour) {
return hour < 0 || hour > 23;
}
public int getHour() {return hour; }
}
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.setHour(21); // hour의 값을 21로 변경
System.out.println(t.getHour()); // 21
t.setHour(100); // 100은 유효한 값이 아니기 떄문에 if문이 true가 되어 해당 문을 빠져나간다
System.out.println(t.getHour()); // 21
}
}
'Java > 객체지향' 카테고리의 다른 글
참조변수의 형변환 (0) | 2023.06.12 |
---|---|
다형성(polymorphism) (0) | 2023.06.12 |
접근 제어자(access modifier) (0) | 2023.06.09 |
제어자(modifier) (0) | 2023.06.08 |
import 문, static import문 (0) | 2023.06.08 |