일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 블랙잭 회고
- ServiceTest
- 객체지향적인 설계
- 윤년계산하기
- JDK
- java 1000번 A+B
- 자바 버전 다운 그레이드
- Oracle JDK와 OpenJDK의 차이
- 자바 4334
- 자판기미션
- 프로젝트 패키지 구조
- 제임스고슬링
- 상근날드
- Getter Setter
- 백준
- There isn't anything to compare.
- 상수와 Enum
- 우테코
- 자바의 종류
- 우아한테크코스
- 테스트 성능 개선
- 자바로 만들수 있는 것
- ControllerTest
- throw 와 throws 차이
- 리스코프치환원칙
- JXM
- 인수테스트
- PR 오류
- 방어적 복사
- 우테코4기
- Today
- Total
개발새발
객체지향 한걸음 본문
구현 순서도 코딩 컨벤션이다
상수, 클래스 변수, 인스턴스 변수, 생성자, 메서드 순으로 작성한다.
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 |