LUMI_dev

객체지향 생활 체조 원칙 9가지 (타 기술 블로그 내용 공부) 본문

기술 블로그 글 정리

객체지향 생활 체조 원칙 9가지 (타 기술 블로그 내용 공부)

luminous_dev 2025. 4. 2. 19:43

 

아래 참조 블로그에서 공부하기 위해서 정리한 내용입니다.

(https://jamie95.tistory.com/99)

 

 

 

 

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

메서드는 맡은 일이 적을수록(잘게 쪼갤수록), 재사용성이 높고 디버깅도 용이

 

 

2. else 키워드를 쓰지 않는다.

조건문은 복제의 원인이 되기도 함 / 가독성도 좋지 않음

 

디자인 패턴의 Strategy 패턴

- 상태에 대한 분기가 몇 군데 걸쳐 중복돼 있을 때 Strategy 패턴 유용 

 

- 간단한 경우엔 guard clause(보호 구문) 사용

: if에 return을 쓸 것(다만, 많이 쓰면 간결함 해침) 

 

수정 전

public class JamieObject {

    String JamieStatus(int hour, boolean isStudy) {
        String status = "";
        if (hour > 4 && hour <= 12) {
            status = "취침";
        } else {
            if (isStudy) {
                status = "공부";
            } else {
                status = "여가";
            }
        }
        return status;
    }

 

 

수정 후 

public class JamieObject {

    String JamieStatus(int hour, boolean isStudy) {
        if (hour > 4 && hour <= 12) {
            return "취침";
        }
        return isStudy ? "공부" : "여가";
    }
}

 

 

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

원시형 변수(ex. int, double, boolean) 로는 컴파일러가 의미적으로 맞는 프로그램 작성을 안내할 수 없음

원시 타입들은 값 자체만 저장하고 있어서, 값에 대한 추가적인 정보(메타데이터)를 제공할 수 없음 

 

int num = 10;              // 원시 타입
Integer wrappedNum = 10;   // 포장된 객체

 

포장한 객체로라면 아주 사소하더라도 컴파일러와 개발자에게

해당 값이 어떤 값이며 왜 쓰는지에 대해 정보 전달할 수 있음 

 

 

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

어느 코드 한 곳에서 점이 둘 이상 있다면, 해당 부분을 다시 리팩토링

다른 두 개의 객체를 동시 조작하고 있는 것일 수도 있음

자신 소유의 객체, 자신이 생성한 객체, 그리고 누군가 준(파라미터로) 객체에만 메시지를 보낼 것

 

그렇지 않을 경우, 다른 객체에 너무 깊숙이 관여하게 됨 : 캡슐화를 어기는 것

 메시지를 받는 객체는 자신의 속을 오픈하기보다는, 작업을 해주도록 해야 함

 

 

수정 전 

public class JamieObject {

    void getMoney() {
        jamieWallet.getTotalMoney().getMoney(); //. 두번 실행 다른 객체에 너무 깊이 관여
    }
}

class JamieWallet {
    private final JamieMoney totalMoney;
    
    JamieMoney getTotalMoney() {
        return totalMoney;
    }
}

class JamieMoney {
    
    private final int money;

    int getMoney() {
        return getMoney();
    }
}

 

수정 후 

public class JamieObject {

    void getMoney() {
        jamieWallet.getTotalMoney();
    }
}

class JamieWallet {

    private final JamieMoney totalMoney;

    int getTotalMoney() {
        return totalMoney.getMoney();
    }
}

class JamieMoney {

    private final int money;

    int getMoney() {
        return getMoney();
    }
}

 

 

 

5. 줄여쓰지 않는다

 과도한 축약은 코드 가독성을 저해

 메서드의 이름이 긴 이유는 

1) 책임을 너무 많이 갖고 있거나,

2) 적절한 클래스의 아래에 위치하지 않아서 일 수 있음

 

 

다음과 같은 규칙으로 작성

 

1) 한 두 단어정도로 되어있는 경우엔, 축약을 하지 말 것

ex.  englishName이 길다고 굳이 EName으로 변경하지 말 것

 

2)  또한 문맥상 중복되는 단어는 자제할 것

ex.  Jamie의 printJamieName의 경우 문맥상 중복이므로 printName으로!

 

 

수정 전

public class Jamie {

    void printJamieName() {
        String EName = "Jamie";
        String KName = "제이미";
    }
}

 

 

 

6. 모든 Entity는 작게 유지하기

50줄 이상되는 클래스 혹은 10개 파일 이상의 패키지는 없어야 함

- 50줄 이상인 경우 보통 클래스는 한 가지 일만 하지 않음 

- 스크롤을 내리지 않아도 한 눈에 들어옴

 

패키지

 - 하나의 목적을 달생하기 위한 연관된 클래스들의 모임

 - 작게 유지하면 패키지가 진정한 정체성을 가지게 된다.

 

 

 

7. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 말기

새로운 인스턴스 변수를 가진 클래스는 응집도가 떨어짐

* 인스턴스 변수는 기본형 또는 자료구조형 객체들인 것으로, 일급 컬렉션이나 wrapper객체는 해당되지 않음

 

인스턴스 변수의 분해는 여러 개의 관련 인스턴스 변수의 공통성을 이해하게 하여

자료구조형으로 묶어 일급 컬렉션으로 생성할 수 있게 해주기 

 

 

인스턴스 변수들의 집합을 갖고 있는 것에서, 협

력 객체(일급 컬렉션/Wrapper 객체)의 계층 구조로 분해하면 더 효율적인 객체 모델

 

1) 객체를 상관 관계가 있는 반(half)씩 나누거나

2) 인스턴스 변수를 둘 골라서 그로부터 하나의 객체를 만드는 등을 하는 것

 

 

수정 전

public class Jamie {
    
    private final String name;
    private final String job;
    private final int age;

    public Jamie(String name, String job, int age) {
        this.name = name;
        this.job = job;
        this.age = age;
    }
}

 

 

수정 후 

public class Jamie {

    private final Name name;
    private final Job job;
    private final Age age;

    public Jamie(Name name, Job job, Age age) {
        this.name = name;
        this.job = job;
        this.age = age;
    }
}

 

 

8. 일급 컬렉션을 쓰기 

컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 함

 

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

도메인 객체끼리의 사용을 하지 않는 것이 중요하다!

DTO / Controller 등엔 해당되지 않음 

 

 

객체에 메시지를 던져서 작업을 해야지, 값을 가져와서 다른 곳에서 작업을 하지 말자

메서드(기능들)가 객체 내부 한 곳에서 관리되므로 변경을 한 곳에서 하면 됨

 

 

 

참고 블로그

https://jamie95.tistory.com/99 

 

[Java] 객체지향 생활 체조 원칙 9가지 (from 소트웍스 앤솔러지)

1. 한 메서드에 오직 한 단계의 들여쓰기만 한다. 한 메서드에 들여쓰기가 여러 개 존재한다면, 해당 메서드는 여러가지 일을 하고 있다고 봐도 무관하다. 메서드는 맡은 일이 적을수록(잘게 쪼

jamie95.tistory.com