Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- stream
- s
- R
- 윤성우의 열혈 자료구조
- Serialization
- 알기쉬운 알고리즘
- insertion sort
- 윤성우 열혈자료구조
- 이스케이프 문자
- Selection Sorting
- 이것이 자바다
- Algorithm
- Graph
- coding test
- Stack
- buffer
- 메모리구조
- C programming
- C 언어 코딩 도장
- list 컬렉션
- 혼자 공부하는 C언어
- datastructure
- JSON
Archives
- Today
- Total
Engineering Note
[Java] Access Modifier, Encapsulation 본문
Programming Language/Java
[Java] Access Modifier, Encapsulation
Software Engineer Kim 2022. 9. 9. 00:20Access Modifier, Encapsulation
- Package
- Access modifier(private, default, protected, public)
- Access modifier 사용 이유, 캡슐화
- Getter, Setter 사용 이유
Package
- 패키지, 클래스의 묶음
- 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶음으로써 클래스를 효율적으로 관리할 수 있다.
- 모든 클래스는 반드시 하나의 패키지에 포함 되어야 하고, 클래스명과 쉽게 구분하기 위해 소문자로 명명하는 것을 원칙으로 하고 있다.
Access modifier(접근 제한자)
- 제한자(제어
- 자) - 클래스, 변수, 또는 메서드의 선언부와 함께 사용되어 부가적인 의미를 부여함.
- 접근 제한자 - public, protected, default, private
- 접근 제한자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다. 즉, 하나의 대상(변수,클래스, 메서드)에 대해서 public, private, protected, default를 함께 사용할 수 없다.
- 접근 제한자의 접근 범위
public > proected > (default) > private
### public
- 접근 제한이 전혀 없는 것
### protected
- 패키지에 관계없이 상속 관계에 있는 자손 클래스에서 접근할 수 있도록 하는 것
### default
- 같은 패키지 내의 클래스에서만 접근이 가능하도록 하는 것
### private
- 가장 높은 제한을 두는 접근 제한자
- 같은 클래스 내에서만 접근 가능하도록 제한함
### 접근 제한자의 허용 범위
| 제한자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
| --- | --- | --- | --- | --- |
| public | O | O | O | O |
| protected | O | O | O | |
| (defalut) | O | O | | |
| private | O | | | |
### 접근 제한자의 대상
| 대상 | 사용 가능 한 접근 제한자 |
| --- | --- |
| class | public, (default) |
| method | public, protected, (default), private |
| field(member variable) | public, protected, (default), private |
| local variable | X |
Access modifier 사용 이유
- 클래스 내부에 선언된 데이터를 보호하기 위해서이다. - 캡슐화(encapsulation)
- 외부에는 불필요한, 내부적으로만 사용하는 메서드 등을 감추어 복잡성을 낮출 수 있다.
- class 내부에서 반복되는 로직을 추출하여 메서드로 만들었을 때, 해당 메서드는 private으로 선언하여 다른 클래스에서 접근을 제한할 수 있다. 이렇게 했을 때 이점은 해당 메서드를 수정했을 때, 오류 검사를 해야 하는 부분을 class 내부로 한정할 수 있다.
Getter, Setter 사용 이유
- 접근이 제한된 필드에 값을 바꾸고, 불러오기 위해서 사용한다.
- 외부에서 넣어주는 값에 오류가 있을 경우 내부에서 가공하여 객체의 무결성을 깨지는 일을 막을 수 있다.
실습
public 접근 제한자
- Time Class에서 public으로 선언한 필드(hour, minute, second)는 같은 클래스에서 접근 사용 가능
package modifier.exam001;
public class Time {
public int hour;
public int minute;
public int second;
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 10;
pt.second = 10;
}
}
- Time Class에서 public으로 선언한 필드(hour, minute, second)는 같은 패키지에서 접근 사용 가능
package modifier.exam001;
public class TimeTest {
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 30;
pt.second = 15;
System.out.println("Time: " + pt.hour + ":" + pt.minute + ":" + pt.second);
}
}
- Time Class에서 선언한 필드(hour, minute, second)는 다른 패키지에서 접근 사용 가능
package modifier.exam002;
import modifier.exam001.Time;
public class PublicTimeTest {
public static void main(String[] args){
Time t = new Time();
t.hour = -1;
t.minute = -1;
t.second = -1;
System.out.println("Time: " + t.hour + ":" + t.minute + ":" + t.second);
}
}
protected 접근 제한자
- modifier.exam001 패키지에 속한 Time Class, 필드 속성은 protected로 선언
package modifier.exam001;
public class Time {
protected int hour;
protected int minute;
protected int second;
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 10;
pt.second = 10;
}
}
- modifier.exam002 패키지에 속한 자손 클래스 ChildProtectedTimeTest 에서 필드에 접근가능
package modifier.exam002;
import modifier.exam001.Time;
public class ChildProtectedTimeTest extends Time{
public static void main(String[] args){
ChildProtectedTimeTest ct = new ChildProtectedTimeTest();
ct.hour = 10;
ct.minute = 10;
ct.second = 30;
}
}
- Time Class와 같은 패키지에 속한 TimeTest Class 에서 Time의 필드에 접근 가능
package modifier.exam001;
public class TimeTest {
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 30;
pt.second = 15;
System.out.println("Time: " + pt.hour + ":" + pt.minute + ":" + pt.second);
}
}
(default) 접근 제한자
- Time Class에서 (default)로 선언한 필드(hour, minute, second)는 같은 클래스에서 접근 사용 가능
package modifier.exam001;
public class Time {
int hour;
int minute;
int second;
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 10;
pt.second = 10;
}
}
2.Time Class에서 (default)로 선언한 필드(hour, minute, second)는 같은 패키지에서 접근 사용 가능
package modifier.exam001;
public class TimeTest {
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 30;
pt.second = 15;
System.out.println("Time: " + pt.hour + ":" + pt.minute + ":" + pt.second);
}
}
private 접근 제한자
- private으로 선언한 필드는 같은 Class에서만 접근 가능
package modifier.exam001;
public class Time {
private int hour;
private int minute;
private int second;
public static void main(String[] args){
Time pt = new Time();
pt.hour = 10;
pt.minute = 10;
pt.second = 10;
}
}
- private으로 Class의 필드를 캡슐화 하면서도 외부에서 필드를 사용 가능 하도록 하기 위해서는 메서드를 이용할 수 있다. getter 메서드를 통해서 필드의 값을 가져오고, setter 메서드를 통해서 필드에 값을 대입할 수 있다. 그리고, setter 메서드를 통해 변수에 잘못된 값을 대입하는 것을 방지할 수도 있다.
package modifier.exam003;
public class PrivateTime {
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;
}
public int getMinute() {
return minute ;
}
public void setMinute(int minute ) {
if(minute < 0 || minute > 59) return;
this.minute = minute ;
}
public int getSecond() {
return second;
}
public void setSecond(int second) {
if(second < 0 || second > 59) return;
this.second = second;
}
}
package modifier.exam003;
public class PrivateTimeTest {
public static void main(String[] args) {
PrivateTime privateTime = new PrivateTime();
// privateTime.time = 10;
privateTime.setHour(-1);
privateTime.setMinute(-1);
privateTime.setSecond(-1);
System.out.println("Time:" + privateTime.getHour() +":" + privateTime.getMinute() + ":" + privateTime.getSecond());
privateTime.setHour(10);
privateTime.setMinute(30);
privateTime.setSecond(11);
System.out.println("Time:" + privateTime.getHour() + ":" + privateTime.getMinute() + ":" + privateTime.getSecond());
}
}'Programming Language > Java' 카테고리의 다른 글
| [Java] 변수의 종류 (0) | 2022.09.15 |
|---|---|
| [Java] Inheritance (0) | 2022.09.09 |
| [Java] Object Oriented Programming (0) | 2022.09.09 |
| [Java] Dependency (0) | 2022.09.02 |
| Window에 Java 파일 여러개 설치 feat batch (0) | 2022.08.03 |
Comments