| 캡슐화 (정보 은닉)
앞에서 상속과 다형성을 이야기할 때, 캡슐화의 원칙에 대해 언급했었다.
- 상속의 단점으로 상위 객체의 정보가 하위 객체에서 노출될 수 있고, 그것은 곧 캡슐화의 원칙을 깨는 것이라고 했다.
- 다형성 또한 instanceof를 통해 부모가 참조하고 있던 실제 자식 인스턴스를 외부에서 노출하면 캡슐화의 원칙이 깨졌다.
여기에서도 유추할 수 있는 캡슐화의 의미는 "정보 은닉"이다.
캡슐화 : 정보를 객체 내부로 숨겨 외부로부터 감추는 것
| 접근 제어자와 참조변수
1. 접근 제어자의 UML 표현
- | private | 자기 자신만 접근 가능 |
~ | default | 같은 패키지 내 |
# | protected | 상속 또는 같은 패키지 내 |
+ | public | 모두가 접근 가능 |
_ | static | - |
- 캡슐화를 이루기 위해서는
먼저 맴버 변수에 private 접근제어자를 사용하여 외부에서 맴버변수에 접근하지 못하도록 해야한다.
- private의 경우, 파생 클래스의 경우에도 접근이 불가하다.
2. 참조변수의 복사
기본 타입의 변수 값을 가져올 때는 call by value라 하여 값을 복사한다.
int x = 10;
int y = x; // y = 10; call by value
int z = x + y; // 20
x값을 y에 줄 때는 값을 복사해서 전달한다. 하지만 참조변수를 쓸 때는 call by reference라 하여 값을 복사하지 않는다.
// list1과 list2는 모두 같은 곳을 가리킨다
List<Integer> list1= new ArrayList();
list2 = list1;
참조변수는 포인터, 곧 주소를 담고 있는 변수이고, 그 주소는 실제 값이 저장되어 있는 메모리 공간을 의미한다.
그렇기에 포인터 = 가리킨다, 라는 말을 사용한다.
| 캡슐화와 응집도
- 캡슐화가 되려면 앞서서 "실질적인 정보 은닉"이 이루어져야한다.
- 위에서 배운 접근제어자 private과 게터/세터를 사용하면 아래와 같이 클래스를 만들 수 있다.
public class User{
private String name;
public String getName(){
return this.name;
}
public String setName(String name){
this.name = name;
}
}
- 응집도는 정보은닉에서 더 나아간 개념으로, 하나의 모듈은 하나의 기능을 수행하는 것을 의미한다.
- 응집도에 대한 자세한 내용 : https://computer-science-student.tistory.com/140
| 캡슐화의 장점
장점 | 불필요한 부분을 은닉하여, 사용자가 오용하지 않게 방지한다. |
객체의 내부가 변경되어도, 사용법이 바뀌거나 다른 객체에 영향을 주지 않는다. (낮은 결합도) | |
큰 시스템일지라도 컴포넌트별로 작게 분리하여 개발이 가능하다. | |
캡슐화를 하게 되면 개발 속도를 높이고 성능을 최적화할 수 있다. |
[참조]
스프링 입문을 위한 자바 객체 지향의 원리와 이해
https://mangkyu.tistory.com/195
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=knix008&logNo=220699796327
'Language > Java' 카테고리의 다른 글
JAVA 라이브러리 - 날짜, 시간 관련 클래스(java.util/java.time..) (0) | 2022.08.10 |
---|---|
JAVA 라이브러리 - Java.lang 패키지 (0) | 2022.08.08 |
객체지향 언어의 특징 3_다형성 (사용 편의성) (0) | 2022.07.22 |
객체지향 언어의 특징 2_상속 (재사용 + 확장) (0) | 2022.07.20 |
객체지향 언어의 특징 1_추상화 (모델링) (0) | 2022.07.20 |