[우아한테크코스] 3월 5일 TIL

1 minute read

오늘 배운 것

  1. 제이슨 강의

오늘 봐야할 것

  1. 좋은 객체의 7가지 덕목
  2. 데코레이터패턴
  3. 덱 터지면 처리, 8명 이상 입력 처리

클래스와 인스턴스

  1. 좋은 객체의 7가지 덕목
  2. 클래스
    • 클래스는 객체의 팩토리이며 객체를 만들고 추적하고 적절한 시점에 파괴한다.
  3. 생성자
    • 객체가 자신의 의무를 할 수 있도록 준비시킨다.
    • 생성자는 제공된 인자를 이용해 캠슐화된 프로퍼티를 초기화한다.
    • 초기화를 하나에만 위치하고, 이게 주 생성자이다.
    • 부 생성자들이 주 생성자들을 호출하도록 한다.
    • 생성자가 많아질수록 클라이언트의 사용이 쉽다. 유지 보수성이 향상된다.
  4. 상속과 조합
    • 상속은 코드를 재사용할 수 있지만 최선이 아니다.
    • 관계가 복잡해지지만 상속이 원인은 아니다.
    • 상속을 올바르게 사용하자.
    • final로 선언하면 상속이 불가능해지고, abstract라면 메서드 구현이 불가능해져 혼란없이 메서드를 이해할 수 있다.
    • 상위 클래스의 내부 구현이 달라지면 코드 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다.
      ```java public class LottoNumbers extends HashSet { private int addCount = 0;

    @Override public boolean add(final LottoNumber lottoNumber) { addCount++; return super.add(lottoNumber); }

    @Override public boolean addAll(final Collection<? extends LottoNumber> c) { addCount += c.size(); return super.addAll(c); }

    public int getAddCount() { return addCount; } } //HashSet의 addAll메서드 public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) //add modified = true; return modified; } ```
    이때 add하면 LottoNumbers의 add가 호출된다.
    이 부분에서 문제를 수정하기 위해 부모 클래스의 내부 구현을 명확하게 알고 addAll()을 재정의하지 않으면 된다.
    하지만 내부 구현을 명확하게 알아야 한다는 점에서 캡슐화가 깨졌다고 볼 수 있다.
    상속은 클래스 B가 클래스 A와 is-a 관계일 때만 A를 상속해야 한다.
    상속은 부분적으로 불완전한 행동을 완전하게 만들 때 사용해야한다.

  5. 가변 객체와 불변 객체
    모든 클래스를 상태를 변경할 수 없는 불변 클래스로 만들면 유지 보수성이 크게 향상된다.
    상태가 불변이므로 스레드 안정성, 시간적 결합, 실패 원자성, 식별자 변경 문제가 보장된다.

스터디

  • reduce(0, ~~)에서 0이 없으면 무조건 Optional이어야 함
  • findAny는 정말 아무거나 인가? 병렬이 아닌 작업에서는 Stream 의 첫 번째 요소를 반환 할 가능성이 높지만 이에 대한 보장은 없다
  • range는 처음 끝 제외, rangeClosed는 처음 끝 포함
  • 파일 스트림 만들기 File.line(Paths.get("data.txt"), Charset.forName("utf-8"))
  • iterate는 언바운드로 무한 순회라서 병렬이 더 손해이다.