클래스(1)

클래스 처리 방법

책너두 5기 19일차

로버트 C. 마틴의 클린코드 p.170 ~ p.179

내용 정리

10. 클래스

코드의 표현력과 그 코드로 이루어진 함수에 아무리 신경 쓸지라도 좀 더 차원 높은 단계까지 신경 쓰지 않으면 깨끗한 코드를 얻기는 어렵다.

클래스 체계

자바에선 일반적으로 추상화 단계가 순차적으로 내려간다.

캡슐화

변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만 반드시 숨겨야 한다는 법칙도 없다. 하지만 캡슐화를 풀어주는 결정은 언제나 최후의 수단이다.

클래스는 작아야 한다!

클래스는 우선적으로 작아야 한다. 함수는 물리적인 행 수로 크기를 측정했지만, 클래스는 맡은 책임(RDD)을 기준으로 한다. 메서드 수가 작더라도 책임이 많읗 수 있다. 클래스 이름이 해당 클래스 책임을 기술해야 하는데, 작명이 간결하지 않다는 것은 보통 크기가 너무 크기 때문이다.

단일 책임 원칙

Single Responsibility Pinciple은 클래스나 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙이다. 매우 중요한 원칙이지만 많이 무시되는 규칙이기도 하다. 이유는, 깨끗하고 체계적인 소프트웨어보다 돌아가는 소프트웨어에 초점을 맞추다 보니, 프로그램이 돌아가면 일이 끝났다고 여기기 때문이다. 다시 되돌아가 클래스를 분리하는 작업이 필요하다. 큰 클래스 몇 개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다. 작은 클래스는 각자 맡은 책임이 하나며, 변경할 이유가 하나며, 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다.

응집도(Cohension)

클래스는 인스턴스 변수 수가 작아야 한다. 각 클래스 메서드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다. 메서드가 변수를 더 많이 사용할수록 메서드와 클래스는 응집도가 더 높다. 모든 인스턴스 변수를 메서드마다 사용하는 클래스는 응집도가 가장 높을 것이다. 하지만 응집도가 가장 높은 클래스는 가능하지도,바람직하지 않지만 우리는 응집도가 높은 클래스를 선호한다.응집도가 높다는 말은 클래스에 속한 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미기 때문이다. 몇몇 메서드만이 사용하는 인스턴스 변수가 아주 많아진다면, 새로운 클래스로 쪼개야 한다는 신호다. 응집도가 높아지도록 변수와 메서드를 적절히 분리해 새로운 클래스 두세 개로 쪼개준다.

응집도를 유지하면 작은 클래스 여럿이 나온다.

큰 함수를 작은 함수 여럿으로 나누기만 해도 클래스 수가 많아진다. 큰 함수에서 작은 함수 하나를 뺄 때, 큰 함수에 정의된 변수 네개를 사용한다면 인수로 넘겨야 할까?

아니다. 네 변수를 클래스 인스턴스 변수로 승격한다면 필요 없다. 쪼개기도 쉬워진다. 하지만 몇몇 함수만 사용하는 인스턴스 변수가 점점 늘어나기 때문에 클래스가 응집력을 잃게된다. 그럴 땐 독자적인 클래스로 분리해버리면 된다. 이 과정을 통해 프로그램의 체계가 잡히고 구조가 투명해진다.

읽고 나서

코드잇 프로젝트에서 클래스를 처음 공부하게 되었고 어떻게 관리해야 할지 난감했다. 묶여있는 것 때문에 곤란하기도 했고 괜히 따로 만들어서 고생하기도 했는데, 중요한 부분이었기 때문인 듯 하다… 조금 더 공부해서 현명하게 짜봐야겠다.