일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 코테
- sorting
- greedy
- array
- hash table
- Stack
- string
- dynamic programming
- simulation
- Counting
- 코딩테스트
- 파이썬
- Number Theory
- Math
- database
- 자바
- Binary Tree
- 구현
- bit manipulation
- Method
- geometry
- Tree
- Data Structure
- two pointers
- SQL
- java
- Binary Search
- implement
- Class
- Matrix
- Today
- Total
코린이의 소소한 공부노트
접근 제어자를 이용한 캡슐화 본문
접근 제어자는 해당 클래스/변수/메서드의 접근 범위를 정해준다. 이는 아래 글에 자세히 설명되어있다.
왜 접근 범위를 설정해줘야 하는 것일까? 그 이유는
1. 외부로부터 데이터를 보호하기 위해서
2. 내부적으로는 사용되지만 외부에는 불필요한 부분을 감추기 위해서다.
여기서 밑줄 친 부분을 캡슐화라고 한다.
예를 들어보자. 시간, 분, 초가 멤버 변수로 있는 Time 클래스를 만든 후, 시간 설정을 해보려 한다.
class Time{
public int hour; // 0시 ~ 23시
public int minute; // 0초 ~ 59분
public int second; // 0초 ~ 59초
}
public class Test{
public static void main(String[] args){
Time t = new Time();
t.hour = 30; // ??
}
}
- 접근 제어자가 public인 hour는 다른 클래스인 Test에서도 접근이 가능하다.
- t 객체를 만든 후 hour에 직접 접근해 30을 대입한다.
- 사람은 30시 = 6시인 것을 알지만 프로그램은 사용자가 지정한 대로만 작업을 수행하기 때문에 모른다.
-> 이것을 달리 얘기해보자면, 데이터의 범위가 있는데 이것이 보호받지 못하는 상태라는 것이다.
그래서 어떻게 바꿀 거냐면,
1) 멤버 변수에 직접 접근을 막고, 메서드를 통해서만 변수에 접근 가능하게 할 것이다.
-> 변수는 private로, 메서드는 public으로
2) 사용자들에게 변수의 범위를 굳이 알릴 필요는 없다. 하지만 프로그램에겐 범위를 알려줘 알맞은 값만 할당해줘야 한다.
-> 메서드 내부에서 범위 설정
class Time{
private int hour; // 0시 ~ 23시
private int minute; // 0초 ~ 59분
private int second; // 0초 ~ 59초
public int getHour() { return hour; }
public int getMinute() { return minute; }
public int getSecond() { return second; }
public void setHour(int hour){
if ( hour < 0 || hour > 23) return;
this.hour = hour;
}
public void setMinute(int minute){
if ( minute < 0 || minute > 59) return;
this.minute = minute;
}
public void setSecond(int second){
if ( second < 0 || second > 59) return;
this.second = second;
}
}
public class Test{
public static void main(String[] args){
Time t = new Time();
t.setHour(22); // 범위 내
System.out.println(t.getHour()); // 22
t.setHour(30); // 범위 밖
System.out.println(t.getHour()); // 22
}
}
22는 시간 범위 내여서 설정이 가능했지만, 30은 범위 밖이기 때문에 설정되지 않고 그대로 22가 출력된 것을 확인할 수 있다.
정리해보자면, 캡슐화는
1. 외부로부터 데이터를 보호하는 것을 말한다.
- 내 노트북에는 2개의 계정이 있다. 손님용은 비번이 없지만 내가 쓰는 계정은 꼭 비밀번호를 건다.
- 캡슐화를 통해 외부로부터의 직접 접근을 막아 검토된(범위 내의) 데이터만 이용한다.
2. 내부적으로는 사용되지만 외부에는 불필요한 부분을 감춘다.
- 3사람이 만원씩 더치페이를 할 때, 돈만 내면 되지 내가 이 돈을 벌기 위해 어떤 일을 하는지까지 알릴 필요는 없다.
- 캡슐화를 통해 내부에는 필요하지만 외부에는 TMI가 될 수 있는 정보를 가린다.
- 한 패키지에 A, B, C 3개의 클래스가 있다. A에는 a1, a2 2개의 메서드가 있는데, 이중 a1은 A 클래스에서만 이용한다. 그럼 이 메서드는 private으로 선언한다.
-> public메서드를 수정했을 때 에러가 발생하면 다른 클래스도 테스트를 해봐야 하지만, private메서드를 수정했을 때 에러가 발생하면 해당 클래스만 테스트를 해보면 된다. -> 테스트 범위가 줄어들어 디버깅이 수월해진다.
'Java' 카테고리의 다른 글
참조변수의 형변환 (0) | 2022.04.20 |
---|---|
다형성 (0) | 2022.04.19 |
제어자 (0) | 2022.04.16 |
임포트와 스태틱 임포트 (0) | 2022.04.14 |
패키지와 클래스 경로 (0) | 2022.04.13 |