[우아한테크코스] 8일차 TIL
오늘 배운 것
- 자동차 경주 리팩토링
TIL
- 객체에 메시지를 보낸다.
cars에게 너희들 중에서 winner를 줄래? - getter
.getName().getName() 을 방지하기 위해public String getName() { return carName.getName(); }
위와 같이 구현해보았다. 괜찮은지 모르겠다.
- 불변의 객체
객체가 가진 변수가 불변하도록 final로 설정해주고 싶었다. 따라서, lap과 관련해 lap을 건드리지 않고 돌 수 있는 방법에 대해서 생각해보았다. - equals()와 hashcode()의 사용
같은 객체 비교 시 사용 - car 내에서 position이라는 객체가 가변인 부분에 대해서
어쩔 수 없이 position은 가변이 될 수밖에 없다고 생각한다.
어차피 position이 가변이라면, car 내에서 position이라는 객체 자체가 가변이어서 position 자체는 불변인 것으로 포장하는게 옳은걸까?? - 방어적 복사
내가 평소 하던대로 코드를 작성하면 List<> 와 같은 경우 getter를 이용해 값을 조작할 수 있어 안전하지 않다.
이를 방어하기 위해 생성자에서 받은 매개변수 각각을 방어적 복사한다.public Cars (List<Car> cars){ this.cars = new ArrayList<>(); }
그리고 복사본을 사용하도록 한다. 이를 검사시점(Time-Of-Check)/사용시점 공격(Time-of-Use)라 한다.
클라이언트가 제공한 객체의 참조를 내부의 자료구조에 보관할 때 그 객체가 잠재적으로 변경될 수 있는지 항상 고려해야 한다.
getter를 방어하려면public List<String> getNames(){ return new ArrayList<>(names); }
- 예외처리
예상치 못하거나 상황에따라 발생할 수 있는 IOException은 CheckedException으로 처리하고, 사용법이 틀리는 문제는 UncheckedException으로 처리한다.