[우아한테크코스] 8일차 TIL

less than 1 minute read

오늘 배운 것

  1. 자동차 경주 리팩토링

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으로 처리한다.