Computer Science/OOP

캡슐화는 정보 은닉이 아니다(번역) encapsulation, cohesion, coupling

TLdkt 2022. 7. 11. 21:09
728x90
반응형

원문 링크 클릭

🚩들어가며

캡슐화에 대해 학습하면서 접근제어자를 배우고, 정보 보호와 은닉이 주 목적이라고 학습하면서, 동시에 getter, setter 메서드를 배우니 의아함을 지울 수 없었다.

어차피 수정하게 할 거면...이게 어떻게 보호죠?( 이 부분에 대한 답변은 참고자료 1번에 있다)

아무튼, 시작해보자!

 

🌱데이터 은닉이라는 설명이 부족한 이유

객체지향의 목적에 반한다?

값을 private으로 숨기게 되면, 임의로 값을 저장하는 걸 막을 수 있고, DI 자동화를 위한 필드를 선언할 수 있는 등 여러 장점이 생기지만, 현실적으로는 이러한 은닉이 코드 전반의 결합성을 올려 불필요하다는 의견도 있다.(링크 참고) 또한 객체지향 방법론의 기둥으로 캡슐화를 설명하면서, 캡슐화를 단순히 데이터 은닉과 보호용으로만 보기엔 부족한 내용이라는 의견도 있었는데, 이유가 뭘까?

 

 

🌱응집성은 높이고, 결합성은 낮춰라=캡슐화

출처 위키백과 cohesion

객체지향의 근본적인 목표는 하나하나의 부품을 통해 유지보수가 쉽고, 독립적으로 작동하도록 하는 것이다.

여름맞이로 선풍기를 조립할 때, 선풍기 날개는 이게 날개인지 모터인지 알 수가 없게 생겼고, 나사와 기둥면은 녹아 엉겨붙어있으면 제대로 된 선풍기를 만들 수 있을까?

 

날개인지 모터인지 알 수 없게 되는 상황응집성이 낮은 것,

나사와 기둥이 들러붙어 있는 것결합성이 높은 것이다.

 

즉, 응집성이란 날개와 모터를 보자마자 각각 아 날개네! 아 모터네! 여기 붙이면 되겠네! 할 수 있을 만큼 명확해야(높아야) 하는 것이다. 반면, 부품끼리 생판 뜬금없이 결합되어 있으면 안 되듯이 결합성은 낮을수록 좋다.

 

기억하자 모터는 모터다워야 하고(높은 응집성), 날개와 모터는 붙어있으면 안 되는 거다(낮은 결합성).

이를 가능케 하는 개념이 객체지향이며, 특히 응집성에 관련된 개념이 캡슐화라고 이해할 수 있다.

캡슐 속의 속성과 기능은 명확하게 한 가지 기능이나 특성을 위해 모여야 하고, 캡슐끼리의 결합은 낮을수록 좋다. 캡슐의 결합이 높아지면, 하나를 사용하기 위해 이해해야 할 주변 내용들이 지나치게 많아지기 때문이다.

🌱응집도를 높이는 방법

응집도가 높으려면

  1. 캡슐 속 요소가 공통된 특징이 많아야 한다
  2. 한 캡슐이 적은 기능을 수행하고, 속에 상관없는 데이터들을 넣지 않아야 한다
  3. 관련된 메서드들이 한 소스파일에 있거나 같은 폴더에 있어야 한다

앞서도 비유를 들었지만, 응집도가 낮으면 아래와 같은 참사가 벌어진다.

  1. 대체 이게 무엇을 위한 캡슐인가..를 이해하기 위해 온갖 연결된 클래스를 뒤져가며 이해해야 하며
  2. 보수 좀 하려는데 이 캡슐이 도대체 상관도 없어보이는 곳에 다 쓰여서 하나하나 다 수정해야 하니 굉장히 빡치는 일이고
  3. 아 저번에 만들어서 어디 처박아놨는데 어디더라….? 를 반복하게 되어 재사용을 할 수가 없다.

🌱응집의 유형

Coincidental cohesion (worst)🚨

거의 무작위로 묶인 상태

공통점이 ‘같은 캡슐에 있는 것’밖에 없는 최악의 상황

 

Logical cohesion

같은 일을 하기 때문에 모여있는 상태를 말한다.

예를 들어 마우스와 키보드를 입력장치로 묶는 것이나 MVC 패턴에서 model, view, controller가 같은 기능이라 묶어놓는 것을 의미한다. 

 

Temporal cohesion

'프로세스 단계'에서 일시적으로 함께 쓰여서 묶어놓은 경우를 말한다. , 에러 로그를 만드는 경우를 생각하면 쉽다.

 

Procedural cohesion

언제나 특정한 절차에 따라 실행하기 때문에 묶여있는 것을 말한다.

.

Communicational/informational cohesion

같은 데이터에 적용되는 모듈이라 그룹핑되는 경우!

즉 기능과 속성이 끈끈하게 매치되는 경우라고 할 수 있다.

 

Sequential cohesion

조립라인처럼 어떤 부분의 아웃풋이 다른 것에 들어가서 처리가 되는 경우 이들이 묶이면 응집도가 올라간다.

 

Functional cohesion (best)⭐

아주 잘 정의된 하나의 태스크로 작동하기 위해 모였을 때를 말한다.

사실 이런 cohesion 판단은 상당히 주관적이므로 functional cohesion 을 목표로 삼아야 하지만, 완벽한 응집은 당연히 이루기 어려운 것이라고 생각하면 된다.

 

이상의 내용은 위키백과 원문에서 확인할 수 있다.

 

🦾마치며

 

객체지향언어의 정수로 불리는 java인 만큼 어떻게 해야 더욱 더 객체지향적으로 사고할 수 있는지를 고민하며 글을 작성했다.  객체지향방법론을 통해 유지보수하기 쉬운 프로그램을 작성하고 싶다면, 캡슐 안에 관련된 내용만 잘 들어가고 있는지, 캡슐 사이에 불필요한 결합은 없는지 꼼꼼히 체크하도록 해야겠다. 

 

 

 

 

💻참고하면 좋을 자료

왜 private을 쓰는 걸까?

스택오버플로우 자료이고, getter와 setter에 어떻게 validate기능을 넣는지 예제를 통해 보여준다

private과 private static의 차이

private static이 constant로 쓰이는 예시를 보여준다. 

결합도

캡슐화와 정보숨김

728x90
반응형