본문 바로가기

우아한테크코스

[1주차] 객체지향 생활체조 9가지 원칙

 

 

이번 우아한테크코스 프리코스 1주차를 진행하며 이전 기수의 프리코스 피드백내용을 보고 객체지향 생활체조 9가지 원칙에 대해 알게 되었습니다. 이는 소트웍스 앤솔러지라는 책에 등장한 원칙이었고 직관적인 9가지 원칙에 매료되어 책을 읽게 되었습니다.

 

 

소트웍스 앤솔러지

 

 

 

해당 포스트는 '소트웍스 앤솔러지'를 읽고 일부를 정리한 내용입니다.

 

 

 

 

 

 

객체지향 생활체조 9가지 원칙

 

 

 

 

1.  한 메서드에 오직 한 단계의 들여쓰기만 한다.

2.  else 예약어는 쓰지 않는다.

3.  모든 원시값과 문자열을 포장한다.

4. 일급 컬렉션을 쓴다. 

5.  한 줄에 점을 하나만 찍는다.

6. 줄여쓰지 않는다.

7.  모든 엔티티를 작게 유지한다. 

8.  3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

9. getter / setter / property를 쓰지 않는다.

 

 

 

 

 

 

1. 한 메서드에 오직 한 단계의 indent만 한다.

 

 

 

 

큰 메서드는 응집력을 떨어뜨리고 객체지향의 5대원칙 중 단일 책임 원칙을 해친다. 한 메서드는 정확히 한가지의 일만 담당하는 것이 좋다. 이렇게 코드를 기능별로 모듈화하게 되면 자연스레 한 메서드에 오직 한 단계의 indent만 남게 된다. 모듈화를 위해 메서드의 indent를 한 단계만 남을 때 까지 쪼개는 것이다.

 

 

 

 

 

2.  else 예약어는 쓰지 않는다.



처음 이 원칙을 접했을 때 가장 눈에 띄는 원칙이었다. 자주 쓰던 else 예약어를 쓰지 말라니 당황스러웠다. 그렇다면 어떻게 분기를 나누라는 건지 이해되지 않았다. else 예약어를 제거하는 방법을 책에서는 early return을 사용하라 한다.  하나의 if 분기 안에서 return 하여 메서드를 종료시키는 것이다.

이럴 경우 장점이 있다.

 

1. 조건은 optimistic 하거나 defensive 하다.

    - optimistic : 오류를 걸러내는 if 조건이 있으면 나머지 로직은 if 조건 이후의 기본 로직을 따른다.

    - defensive : 기본 로직을 if 조건에 지정한 후 조건이 충족되지 않으면 오류를 리턴한다.

 

이렇게 분기를 처리할 경우 개발자는 생각지도 못한 에러를 예방할 수 있다.

 

 

 

 

 

3.  모든 원시값과 문자열을 포장한다.



Java에서는 모든 primitive type의 Wrapper 클래스를 제공한다. 객체가 기본이 되는 객체지향언어에서 모든 것을 객체로 만들기 위한 노력이다. 또한 Generic을 사용할 때도 Wrapper 클래스는 필수이다.

 

 

 

 

 

 

4. 일급 컬렉션을 쓴다. 



일급 컬렉션은 컬렉션을 가진 클래스는 컬렉션 이외에는 다른 멤버 변수를 가지지 않는 클래스이다.

아직 이해가 정확히 되지는 않지만 3번 규칙과 비슷한 메커니즘으로 컬렉션을 클래스로 감싼다고 한다. 이렇게 하면 컬렉션과 관련된 코드의 중복을 없앨 수 있고 데이터를 캡슐화 한다는 점에서 더욱 객체지향적인 코드를 작성할 수 있다고 한다. 추후에 수정하겠다.

 

 

 

 

 

5.  한 줄에 점을 하나만 찍는다.



점은 참조(.)를 뜻한다.

 

책에서는

자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장남감하고만 놀 수 있다. 하지만 절대 장난감의 장난감과 놀면 안된다.

라고 한다. 한 마디로 너무 먼 객체를 불러와서 사용하지 말라는 원칙이다.

 

참조의 참조를 한 객체를 사용하면 코드가 복잡해지고 객체지향적 코드를 해친다.

최대한 한 줄에 점을 하나만 찍는 연습을 해보자.

 

 

 

 

 

 

6. 줄여쓰지 않는다.



 

클래스, 메서드, 변수명을 줄여쓰지말라는 원칙이다. 축약을 하게 되면 정확한 역할을 구분할 수 없게 되어 결국 객체지향적 코드를 더럽힌다. 이름이 길어도 좋다. 줄여쓰지말자. 만약 적당한 이름을 찾지 못한다면 SRP를 위해하고 있을 가능성이 매우 높다. 적당한 이름을 지어주면서 자연스레 코드를 분리하는 연습을 해야겠다.

 

 

 

 

 

 

 

7.  모든 엔티티를 작게 유지한다. 



 

이 원칙도 객체지향적 모듈화를 실현하기 위한 일부이다. 패키지든 클래스든 메서드든 최대한 작게 유지해야한다. 이는 유지보수와 연관되며 코드의 재사용성을 극대화 할 수 있다. 짧은 파일은 긴 파일에 비해 읽기 쉽고 이해하기도 쉽다. 패키지 또한 클래스처럼 응집력 있고 단일 목표를 가져야한다.

 

 

 

 

 

 

 

8.  3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.



가장 적용하기 어려운 원칙이라 생각합니다. 추후 공부하여 수정할 예정입니다.

 

 

 

 

 

 

9. getter / setter / property를 쓰지 않는다.



 

객체에게 묻지말고 시켜라라는 원칙이다.

객체의 상태를 가져오는 접근자는 괜찮지만 객체 밖에서 그 결과값을 이용해 객체에 대한 결정을 내리는 것은 안된다.

getter / setter는 존재 자체만으로 OCP를 어긴다.

getter/ setter 로 값을 가져와 수정하는 것 보다 다른 메서드를 만들어서 객체의 값을 바꾸는 것이 훨씬 바람직하다.

 

 

 

 

 

후기



이번 우아한테크코스 프리코스 1주차 미션을 진행하며 비록 별개의 7문제가 출제되었지만 그 안에서 최대한 객체지향적인 코드를 구현하려 노력하였습니다. 아직 많이 부족하지만 피드백을 통해 남은 3주간 성장하고 싶습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Recent Posts
Popular Posts
Recent Comments