캡슐화(Encapsulation)이란

2020. 3. 30. 18:28Computer Science/CS

반응형

캡슐화는 두 가지의 정의가 있습니다.

 

첫째로, 클래스(class)와 구조(structure)와 같이 객체의 속성(atrribute)과 행위(Method)에 따라

운영하여 편리성을 늘리는 것입니다(facilitates the bundling of data with the methods).

 

예를 들어, ‘영화‘라 이름 붙여진 클래스에 영화를 실행하는 행위와 영화의 평점,

그리고 영화의 장르, 제목이 들어가게 된다고 해봅시다.

만약 실행자(혹은 개발자)가 영화와 관련된 행위 혹은 속성(영화의 제목, 장르 등등)을 확인하고 싶을 때는

다른 클래스를 들여다 볼 필요 없이 영화 클래스를 확인하면 될 것입니다.

이처럼 속성과 행위에 따라 묶어 사용자로 하여금 편리성을 제공한다는 데서 장점을 가지고 있습니다.

 

두 번째로, 캡슐화는 단순히 그 속성과 행위에 따라 하나로 묶을 뿐만 아니라

각 객체의 속성과 행위에 대한 직접적인 접근(인증되지 않은 조직의 직접적 접근)을 통제할 수 있습니다.

(restricting access to some of the object's component.)

이러한 접근 통제는 단순한 통제로써 그 역할을 끝내는 것이 아니라

나아가 변수 값 혹은 코드를 함부로 수정하여 생기는 부작용을 막아준다는 장점이 있습니다.

 

좀 전에 들었던 예시로 다시 돌아와 봅시다.

영화라는 이름의 클래스에는 영화의 평점이라는 속성이 있었습니다.

만약 이 속성을 int형(정수)이었다고 생각해봅시다.

어느 날, 어떤 개발자가 실수로 영화 클래스의 정의를 잘 읽어보지 않은 상태로

마음대로 int형이었던 영화의 평점을 string형으로 바꾸어 버렸습니다.

하지만 이미 영화 클래스를 사용했던 기존의 고객들이 몇 천명이 있었고 영화 클래스를 운영하는 개발자는

몇 천개의 코드를 수정해야하는 대참사가 발생하고 말았습니다.

이러한 오류의 발생을 막아주는 것이 바로 캡슐화입니다.

영화의 평점(속성)을 private로 사용하였다면 아무나 와서 수정하는 것이 불가능 했을 테니까요.

(Typically, only the object's own methods can directly inspect or manipulate its fields.)

혹은 setter 메소드에서 String형으로 유입되는 값에 한하여

같은 평점 속성이라도 다른 형태로 받을 수 도 있을 것입니다.

(overriding/Almost always, there is a way to override such protection – usually via reflection API )

그리고 이러한 기능을 지난 시간에도 배운 정보 은닉(information hiding)이라 부르며 캡슐화의 장점으로 불리고 있습니다.

그러나 이는 자바 프로그래밍만의 특징은 아니며 객체 지향적 프로그래밍 언어가 아닌

다양한 언어(C++,C#,Delphi 등등)들 사이에서도 정보은닉이 가능합니다.

 

파이썬의 경우, 변수 접근에 대한 통제를 직접적으로 막을 수 는 없지만 미리 정의된 값은 private로 간주됩니다.

 

<파이썬 예시-wikipedia>

def __init__(self) -> None:

self._maxspeed = 200 #미리 정의된 variable.



def drive(self) -> None:

print(f'Maximum speed is {self._maxspeed}.')



redcar = Car()

redcar.drive() # This will print 'Maximum speed is 200.'

# maxspeed가 private로 간주



redcar._maxspeed = 10 #재정의

redcar.drive() # This will print 'Maximum speed is 10.'

 

 

반응형