java, c++ 캡슐화, encapsulation

     




캡슐화는 객체지향 언어에서 자주 등장하는 언어입니다. 저는 캡슐화라는 용어를 프로그래밍에서보다 컴퓨터 네트워크에서 먼저 접했습니다. 네트워크 계층에서 데이터를 보낼 때 계층마다 헤더파일이 붙게 되는데 이때 캡슐화가 적용됩니다. 예를 들어서 TCP계층 에서 헤더파일 20바이트와 40바이트에 데이터를 보냅니다. 이때 상위계층인 IP계층에서 IP 헤더를 다시 붙입니다. 그림으로 보면 다음과 같습니다. 






IP계층은 TCP계층에서 보낸 TCP 헤더와 데이터를 하나의 데이터그램(빨간색영역)으로 생각합니다. 즉 IP계층에서는 TCP의 헤더영역과 데이터영역이 어디인지는 관심 없고 그냥 하나에 데이터 덩어리로 생각하게 됩니다.

이처럼 상위 계층인 IP계층에서 TCP계층의 헤더와 데이터영역을 알지 못하고 하나의 데이터영역으로만 생각하게 하는 것이 캡슐화입니다. TCP계층에서는 TCP 헤더가 중요한 데이터이지만 IP계층에서는 단순히 데이터 중 일부일 뿐이죠. 

그럼 프로그래밍에서 캡슐화는 어떤 의미일까요? C언어에서는 사용되지 않지만, C++이나 JAVA에서는 객체를 사용하는 객체지향언어입니다. 프로그램에서 생성된 객체들은 상호 독립적인 개체이며 서로의 데이터를 모르는 것이 안전한 프로그램입니다. 예를 들어 학생의 이름과 학번을 저장하는 객체가 있다고 생각해봅니다.


class students{

 String sName;

 int sId;  }


students클래스는 학생 이름인 sName과 학번 sId값을 맴버변수로 가지고 있습니다. 이러면 학생의 학번과 맴버변수에 접근할 때 students.sName, students.sId를 사용하여 접근할 수 있습니다. 


하지만 이 방법은 좋지 못한 방법입니다. 왜냐하면, students 클래스에 sName과 sId라는 맴버변수를 사용한다고 공개하는 셈이기 때문입니다. 이렇게 되면 아무 데서나 students클래스의 맴버변수에 접근이 가능해져서 관리 및 보안에 문제가 생길 수 있습니다. 따라서 이런 맴버변수는 대부분 private로 선언합니다.


class students{

 private String sName;

 private int sId;  }


하지만 문제가 생깁니다. private로 선언하면 외부에서 접근 권한이 없으므로 sName과 sId값을 사용할 수가 없습니다. 따라서 내부에서 맴버변수에 접근하는 public 메소드를 사용하여 맴버변수를 읽거나 쓰게 됩니다. 보통 getter와  setter메소드를 이용하여 맴버변수에 접근하게 되는데 메소드 이름이 get맴버변수, set맴버변수 형태로 정의되어 getter, setter로 부르게 됩니다. 보통 get은 맴버변수를 읽는 메소드이고, set은 맴버변수를 수정하거나 쓰는 메소드입니다.


class students{

 private String sName;

 private int sId; 

public String getName(){

return sName; 

}

public setName(String inputName){

 sName = inputName;

}

public int getId(){

return sId;

}

public setId(int inputId){

sId = inputId;

}

 }


getter와 setter를 구현한 클래스입니다. 맴버변수는 private로 선언되었지만 메소드가 public으로 선언되었기 때문에 메소드를 이용해서 맴버변수에 접근할 수 있습니다. 

이처럼 외부에서 학생의 이름과 학번이 어떻게 저장되어있는지 모르지만, getter와 setter메소드를 이용해 이름과 학번을 사용할 수 있습니다.






학생 객체의 내용은 외부에서 알 수 없습니다. 마치 약국에서 주는 캡슐 안에 어떤 약이 들어있는지 알 수 없는 것처럼 private를 이용해 보호되고 있기 때문에 이를 캡슐화(encapsulation)라고 표현합니다. 









반응형

댓글

Designed by JB FACTORY