개발새발

객체지향 한걸음 본문

우아한테크코스/level1

객체지향 한걸음

무비인 2022. 3. 21. 16:26

구현 순서도 코딩 컨벤션이다

상수, 클래스 변수, 인스턴스 변수, 생성자, 메서드 순으로 작성한다.

public class Car {
    private static final int INIT_POSITION = 0;
    private static int autoIncrease = 0; //상수
    
    private int moveIndex;
    private int carNumber;
    private String carName; // 클래스 변수
    
    private Lotto lotto; // 인스턴스 변수
    
   	public Car(int index, ...) { // 생성자
    	this.moveIndex = index;
    
    }
    
    public void move() { // 메서드
    	moveIndex++;
	}

    ...

}

 

IDE의 코드 자동 정렬 기능을 활용해라

IDE의 코드 자동 정렬 기능을 사용하면 더 깔끔한 코드를 볼 수 있다.

  • IntelliJ IDEA: ⌥⌘L, Ctrl+Alt+L
  • Eclipse: ⇧⌘F, Ctrl+Shift+F

 

변수 이름에 자료형은 사용하지 않는다.

변수 이름에 자료형, 자료 구조 등을 사용하지 마라.. 자료형이 변하면 전부 리네임 해야한다.

String carNameList = scanner.nextLine();
String[] arrayString = carNameList.split(",");

 

final 키워드를 사용해 값의 변경을 막아라

최근에 등장하는 프로그래밍 언어들은 기본이 불변 값이다. 자바는 final 키워드를 활용해 값의 변경을 막을 수 있다.
final 로 지정해두면 참조 값이 변하는 것을 막아준다. 리스트에 값을 추가하는 등의 행위는 가능하다. (참조 값이 변하는게 아니기 때문)

public class Car {
    private final String name;
    private int position;

    public Car(final String name) {
        this.name = name;
    }

    ...

}

 

 

객체를 객체스럽게 사용해라

Car 클래스를 추가한 후 name과 position을 상태 값으로 가지는 객체를 추가했다. 그런데 이 객체는 로직에 대한 구현은 하나도 없고, name과 position에 대한 getter 메서드와 setter 메서드만을 가진다.

public class Car {
    private String name;
    private int position = 1;
    
    public Car(String name) {
        this.name = name;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public String getName() {
        return name;
    }
}

Car에 메시지를 던지도록 구조를 바꿔 데이터를 가지는 객체가 일하도록 한다.

public class Racing {

    ...

    public int run(Car car) {
        int num = random.nextInt(11);
        int position = car.getPosition();
    
        if (num >= 4) {
            position++;
        }
    
        car.setPosition(position);
        return position;
    }
}

 

객체의 상태 접근을 제한한다

인스턴스 변수의 접근 제한자는 private으로 구현한다. 클래스 외부에서 값에 대해 숨기는 것이다. 

public class Car {
    private String carName;
    private int move;

    public Car(String carName, int move) {
        this.carName = carName;
        this.move = move;
    }
}

 

setter 메서드 사용을 자제하라

인스턴스를 초기화한 후에 값을 변경할 수 있는 setter 메서드를 생성하지 않는다. 가능하면 생성자를 사용해 초기화한다.

public class Car {
    private int carPosition;
    private String carName;

    public Car(String carName) {
        this.carName = carName;
    }
		
    public void movePosition(int ranNum) {
        if (ranNum>=4) {
            carPosition++;
        }
    }
}

 

비즈니스 로직과 UI 로직의 분리

비즈니스 로직과 UI 로직을 한 클래스가 담당하지 않도록 한다. 단일 책임의 원칙에도 위배된다.

도메인에는 뷰에 관련된 내용이 없어야한다. 

(뷰는 변경 가능성이 크기 때문에 뷰와 의존성을 맺고 있으면 도메인도 변경 가능성이 커진다.)

public class Car {
    private int position;

    ...

    private void print(int position) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < position; i++) {
              sb.append("-");
        }
        System.out.println(sb.toString());
    }
}

 

getter 메서드 없이 구현 가능한가?

setter/getter 메서드를 사용하지 말라는 것은 핵심 비지니스 로직을 구현하는 도메인 객체를 의미한다. 도메인 Layer -> View Layer, View Layer -> 도메인 Layer로 데이터를 전달할 때 사용하는 DTO(data transfer object)의 경우 setter/getter를 허용한다.

 

테스트를 위한 코드는 구현 코드에서 분리되어야 한다

테스트를 위한 편의 메서드를 구현 코드에 구현하지 마라.

'우아한테크코스 > level1' 카테고리의 다른 글

방어적 복사란?  (0) 2022.03.21
[레벨1] 블랙잭 회고  (2) 2022.03.21
형변환(Casting) 과 오버 플로우(Overflow)  (0) 2022.03.20
리스코프 치환원칙  (0) 2022.03.19
[레벨1] 자동차 경주 후기  (6) 2022.02.21