본문 바로가기

디자인패턴/내 코드가 그렇게 이상한가요?

클래스 설계 원칙 - 내 코드가 그렇게 이상한가요? 3장 요약

클래스 설계 시 지켜야할 법칙

1. 클래스 하나로도 잘 동작할 수 있게 설계해야 한다.

2. 세팅 없이 바로 사용할 수 있어야 한다. 

 

 

잘 만든 클래스의 구성요소

1. 지역변수

2. 지역변수에 잘못된 값이 할당되지 않게 막는 메서드

 

 

잘 만든 클래스의 특징

1. 지역변수가 불변(immutable)이다.

2. 생성자가 완전생성자면서 생성자에서 유효성 검사를 한다.

3. 자기 자신에 대한 계산은 클래스가 스스로 한다.

4. 매개변수도 불변(immutable)이다.

5. 매개변수로 원시형보다는 값 객체를 사용한다.

 

 

잘 만든 클래스 특징 상세 설명 1 - 지역 변수가 불변(immutable)이다.

public class Money {
    final int amount;
    final Currency currency;
}

 

 

잘 만든 클래스 특징 상세 설명 2 - 생성자가 완전생성자면서 생성자에서 유효성 검사를 한다.

즉, 생성자를 작성할 때 Default 생성자를 쓰지 말고 모든 지역변수를 적절한 값으로 초기화해주어야 한다. 혹시나 잘못된 값이 할당되지 않도록 유효성 검사도 해야한다. 만약 디폴트 생성자를 사용해서 객체를 생성하고 지역변수의 값을 변경하게 되면 그 과정에서 잘못된 값이 할당될 수 있기 때문이다. 

public class Money {

    final int amount;
    final Currency currency;

    Money(int amount, Currency currency) {
        if (amount < 0) throw new IllegalArgumentException("금액은 0 이상");
        if (currency == null) throw new IllegalArgumentException("통화 단위 지정 필요");
        this.amount = amount;
        this.currency = currency;
    }
}

 

 

잘 만든 클래스 특징 상세 설명 4 - 자기 자신에 대한 계산은 클래스가 스스로 한다.

값을 더하는 메서드가 Money 클래스 외부에 있는 것이 아니라, 클래스 내부에 있어야 한다. 이때 지역변수가 불변(immutable)이라 재할당이 불가능하므로, 계산 결과는 새로운 인스턴스를 생성하여 반환한다.

public class Money {

    final int amount;
    final Currency currency;

    (...생략...)
    
    Money add(int amountToAdd) {
        int sum = amount + amountToAdd;
        return new Money(sum, currency);
    }
}

 

 

잘 만든 클래스 특징 상세 설명 5 - 매개변수도 불변(immutable)이다.

메서드 안에서 매개변수를 변경하지 못하도록 하기 위함이다.

public class Money {

    final int amount;
    final Currency currency;

    (...생략...)
    
    Money add(final int amountToAdd) {
        int sum = amount + amountToAdd;
        return new Money(sum, currency);
    }
}

 

 

잘 만든 클래스 특징 상세 설명 6 - 지역변수로 원시형보다는 값객체를 사용한다.

원시형을 쓰면 자료형만 같은 엉뚱한 값(eg. 금액이 아닌 엉뚱한 정수)이 들어올 수도 있기 때문이다.

public class Money {

    final int amount;
    final Currency currency;

    (...생략...)
    
    Money add(final Money other) {
        if (!currency.equals(other.currency)) throw new IllegalArgument("통화 단위 다름");
        final int sum = amount + other.amount;
        return new Money(sum, currency);
    }
}

 

 


 

 

참고자료