Language/Java

객체지향 언어의 특징 4_캡슐화 (정보 은닉)

simDev1234 2022. 7. 22. 22:54

|  캡슐화 (정보 은닉)

앞에서 상속과 다형성을 이야기할 때, 캡슐화의 원칙에 대해 언급했었다.

- 상속의 단점으로 상위 객체의 정보가 하위 객체에서 노출될 수 있고, 그것은 곧 캡슐화의 원칙을 깨는 것이라고 했다.

- 다형성 또한 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 

https://siyoon210.tistory.com/33

https://bperhaps.tistory.com/entry/%EC%BA%A1%EC%8A%90%ED%99%94%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EC%96%B4%EB%96%A4-%EC%9D%B4%EC%A0%90%EC%9D%B4-%EC%9E%88%EB%8A%94%EA%B0%80