Java 캡슐화(Encapsulation), 캡슐화와 접근 제어자
by 볼빵빵오춘기캡슐화(Encapsulation)
- 자바의 중요 특징 중 하나이다.!
- 관련 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 접근하지 못하도록 하여 데이터를 보호하는 것이다.
캡슐화와 접근 제어자
- 접근 제어자를 사용하여 외부로부터 데이터를 보호한다.
- 직접접근은 막고 메서드를 통해 간접접근하도록한다.
⇒ 접근제어자의 범위는 좁을 수록 좋다. 필요할때 넓히도록한다.
예제
접근제어자가 없을 경우에서 접근제어자를 이용하는 경우까지 수정하는 과정의 예이다.
1. 접근제어자가 없을 경우
class Time{
int hour;
int minute;
int second;
}
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.hour = 25;
System.out.println(t.hour);
}
}
⇒ class Time에 멤버들의 접근제어자 default로 했을 경우 class TimeTest에서 사용할때는 에러없이 잘 사용이 된다.
2. class Time의 멤버들의 접근제어자를 private로 변경해보자!
class Time{
private int hour;
private int minute;
private int second;
}
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.hour = 25;
System.out.println(t.hour);
}
}
⇒
class TimeTest에서 바로 접근하여 사용을 못해 에러가 나는것을 확인이 가능하다.
그러면 어떻게 사용해야하나 메서드를 만들어 접근하면된다.
3. 메서드를 만들어 접근해보자!
class Time{
private int hour;
private int minute;
private int second;
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);
System.out.println(t.getHour()); // 21
}
}
21
⇒ t.setHour(21)로 해서 값을 넣어주고 t.getHour()로 값을 빼와 출력하면 21이 출력된다.
4. setHour(int hour) 안에 if문 조건이 false인 경우인 숫자를 넣어보면 어떨까?
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.setHour(21);
System.out.println(t.getHour()); // 21
t.setHour(100);
System.out.println(t.getHour()); // 21
}
}
21
21
⇒ t.setHour(21)은 21 출력되고 serHour(100)을 했는데도 21이 출력된다.
응? 왜그럴까? 생각해보면 setHour 메서드에서 false일 경우에는 hour가 갱신되지 않는다.
5. serHour()안에 if문도 메서드로 만들어 써볼까?
class Time{
private int hour;
private int minute;
private int second;
public void setHour(int hour) {
if(isValidHour(hour)) return;
this.hour = hour;
}
// 매개변수로 넘겨진 hour가 유효한지 확인해주는 메서드
private boolean isValidHour(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);
System.out.println(t.getHour());
t.setHour(100);
System.out.println(t.getHour());
}
}
⇒ // 매개변수로 넘겨진 hour가 유효한지 확인해주는 메서드 를 private로 한 이유는 isValidHour() 메서드는 여기 자바파일에서만 쓰기 때문이다. 그럼 public으로 해도 상관 없는거 아님? 이렇게 생각할 수도있는데 추후 수정 후 테스트를 할 경우 public이면 전체 코드를 확인해야하지만 privte이기때문에 현 자바파일만 테스트 확인하면된다.
'👩🏻💻 About 프로그래밍 > Java' 카테고리의 다른 글
Java 참조변수의 형변환 (0) | 2023.11.29 |
---|---|
Java 다형성(polymorphism) (0) | 2023.11.29 |
Java 제어자(modifier), static, final, abstract (0) | 2023.11.29 |
Java import문, import문 선언, static import문 (0) | 2023.11.29 |
Java 패키지(package), 패키지 선언, 클래스패스(classpath) (0) | 2023.11.29 |
블로그의 정보
Hello 춘기's world
볼빵빵오춘기