목차
캡슐화 / Encapsulation
캡슐화는 데이터와 행위를 묶어 객체라는 형태로 만드는 것을 말한다. 앞서 말했던, 객체의 정의와 같다고 생각할 수 있다.
하지만, 캡슐화는 묶는 과정에서 속성(attribute), 메서드(method)를 외부로부터 감출 것인지, 공개할 것인지 설정할 수 있다는 것이 핵심이다.
바로 '데이터 은닉'기법이다.
데이터 은닉을 통해 감춰진 속성, 메서드는 외부에서는 접근할 수 없으며, 객체내부에서만 수정, 사용할 수 있다.
곡개하는 속성, 메서드는 'public' 접두어를, 비공개하는 속성 메서드는 'private' 접두어를 붙인다.
객체는 책임으로 이루어져있다.
우리는 어떤 객체에게 특정 행동을 기대하고, 객체를 만든다. 이때, 이 객체를 '1번객체'라고 하고, '2번객체'가 있다고 하자. 근데 이 '2번객체'가 '1번객체'와 같은 행동을 한다면, 우리는 '1번객체'와 '2번객체'를 같다고 볼 수 있지 않을까?
그럼 우리가 2번객체의 행동하는 구체적인 방안을 그대로 옮겨와 1번객체에 넣는다고 해도, 아무런 문제가 없다. 결국 같은 행동을 할테니 말이다. 이렇게 구상적인 행동방안과, 추상적으로 행동을 설명하는 부분을 분리해서 언제든지 대체할 수 있게한다. 이때 구상적인 행동방안은 '구현부', 추상적으로 설명하는 부분은 '인터페이스'라고 한다.
우리는 여기서 구현부, 구상적인 행동들을 숨긴다. 객체의 사용자는 만들때 책임을 지겠다고 한 행동만 사용한다. 따라서 문제가 발생하면 그 객체에게, 그 행동에게 책임을 물어 문제를 찾아내기 위하여, 구현부를 숨기는 것이다.
여기서 '음식을 주문하면' 이 부분, 프로그래밍에서는 어떻게 음식을 주문하게 될까?
바로, 인터페이스(interface), 통로를 이용하여 음식을 주문하고, 음식을 내어주고, 직원에게 팁을 주는 등의 일을 할 수 있다. 그렇다, 인터페이스는 외부에서 객체와 소통하는 통로인 것이다. 이 통로의 생김새를 한번 보도록 하자.
Java에는 따로 interface 키워드를 이용해 생성하는 클래스가 존재한다. 그것과 혼동하지 않도록 주의하자.
public void getOrder(String order){
/*
대충 음식을 만들고 내어주는 코드
*/
}
그렇다, 사용자는 내부를 전혀 볼 수 없기 때문에, 인터페이스의 이름을 기능과 관련있게 짓는것. 사용자가 이름만 보고도 '아, 이 인터페이스를 이용하면 어떤어떤 일을 할 수 있구나.' 라고 생각하게 만드는 것이 중요하다.
예시는 정말 대충 적어두었지만, '대충 음식을 만들고 내어주는 코드' 저 부분은 당연히 '구현부'이다. '구현부' 즉, 인터페이스를 제외한, 사용자는 볼 수 없는 부분이 모두 구현부이다. 식당에서 주방, 조리과정(보여주는 곳도 있겠지만 여기서는 안보인다고 가정하자), 식당의 주머니 사정등 손님으로서는 볼 수 없는 부분들이 구현부에 해당한다.
구현부를 설계할때 가장 중점적으로 두어야 할 것은, 구현부를 바꿔도 사용자의 코드가 변겨오딜 일이 없도록 해야한다. 자 다시 식당에 가보자, 식당에서 조리를 하는 주방을 리모델링 해서 주방의 구조가 전부 바뀌었고, 조리 방법도 바뀌었다. 그렇다고 해서, 같은 메뉴를 주문했는데, 다른 음식이 나온다면 당연히 식당에 항의 할 것이다.
그렇듯이, 인터페이스를 잘 설계하고, 그에 맞는 구현부를 만들어서 같은 인터페이스를 사용하는 사용자에게 혼란을 줘서는 안된다.
'Computer-이론 > OOP' 카테고리의 다른 글
추상클래스와 인터페이스 (2021.01.03) (0) | 2022.08.04 |
---|---|
생성자 (2020.11.12) (0) | 2022.08.04 |
오버로딩, 오버라이딩 (2020.10.23) (0) | 2022.08.04 |
상속 (2020.10.17) (0) | 2022.08.04 |
객체지향이 무엇일까? (2020.09.09) (0) | 2022.08.04 |