[우아한테크코스] 2월 18일 TIL

2 minute read

오늘 배운 것

  1. 테코톡 강의 - JCF, 제네릭
  2. 로또 미션 진행

테코톡

  1. Java Collection Framework
    자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
    library / framework 의 차이 ??
    Map에 key와 value가 존재하므로 구조가 맞지 않아 iterable, collection 상속을 받지 않았다.
  • Collection interface
    iterator() 메서드가 존재함
    • List
      ArrayList: 크기가 가변적인 선형 리스트로 저장 용량이 존재한다.
      LinkedList: 데이터를 담은 노드들이 연결되어 있다.
      Vector: 호환성을 위한 레거시 코드, 동기 방식
      - 동기? 요청 보낸후 응답 받고 다음 진행
      - 비동기? 응답과 상관 없이 다음 진행
      - 스레드 안전? arrayList 사용
      Stack: LIFO
      Queue: FIFO
      Priority Queue
      Deque
      - ArrayDeque: 비동기 원형 큐, 빠르고 사이즈 제한 없음
    • Set equals()와 hashCode()
      HashSet: 해시 알고리즘
      LinkedHashset: 순서 존재
      TreeSet: 특정 기준에 따라 요소 정렬 가능
  • Map interface
    • Map
      key는 중복 x, value는 중복 o
      HashTable: 레거시 클래스
      HashMap: 비동기, 싱글 스레드 성능 굿 LinkedHashMap: 순서보장, LinkedList 구조 사용
      TreeMap: key를 기준으로 원하는 방식으로 정렬, 레드 블랙 트리로 구현
  1. 제네릭
    클래스가 메서드에서 사용할 내부 데이터 타입을 외부에서 지정하는 기법
    • 제네릭 클래스
      <T> 와 같이 타입 지정하는 것
  • 제네릭을 사용하는 이유?
    자료형에 대한 검증이 컴파일 시에 이루어지지 않는다.
    컴파일 에러가 런타임 에러보다 잡기 쉽다.
    제네릭은 (Integer) 와 같은 캐스팅이 필요 없다.
    타입 안정성이 보장된다.
    제네릭 메서드는 제네릭 클래스가 아니더라도 정의할 수 있다.
  • 타입 매개변수의 제한
    • 상한 경계: T extends Fruit
    • 하한 경계: T super Fruit
  • 와일드카드
    ? 형태로 사용한다.
    Object는 상속이 아니므로 ? 형태를 정의해주어야 한다.
    List<?>에서 get한 원소는 Object 타입이다.
    List<?>에는 null만 삽입할 수 있다.
    • 상한 경계 와일드카드: ? extends T로 선언한다.
      List에서 get한 원소의 타입은 T이다.
      List에 null만 삽입할 수 있다.
    • 하한 경계 와일드카드: ? super T로 선언한다.
      List에서 get한 원소는 Object이다.
      어떤 타입이 와도 읽을 수 있도록 Object로 받는다.
      List에 T 혹은 T의 하위 클래스만 삽입할 수 있다.

로또 미션 도중 궁금한 것

  1. 의존성이란?
    자동차 경주 리팩터링에서
    MVC 패턴 기반으로 리팩토링해 view 패키지의 객체가 domain 패키지 객체에 의존할 수 있지만, domain 패키지의 객체는 view 패키지 객체에 의존하지 않도록 구현한다. 라고 쓰여져 있는데 view 객체에서 domain 객체를 생성하면 domain 객체가 view에 의존하는 것이 아닌지??
    domain 객체에 view가 의존한다는 것이 domain 내부에서 view의 정보를 제공한다는 것인지?

  2. 생성자에서 값을 얻어내는 것에 대한 질문 계속해서 생성자에 객체를 넘겨주고, 생성하면서 메서드를 이용해 원하는 값을 얻게 되는데 생성자의 매개변수로는 int, String, List와 같은 값이 좋은걸까, 객체가 좋은 걸까?
    객체를 넣으면 프로덕션 코드는 간단해지는 것 같으면서도 테스트 코드는 많이 복잡해지고 이해가 어려워진다.
    원시값을 넘겨주면 테스트가 쉽고 생성자가 간단해지며 보다 직관적이다.

애초에 이름 같은 것도 유효성 검증을 마치고 온전한 값을 전달하기에 괜찮은가?

  1. 패키지 나누기 이렇게 작은 프로젝트에서 package-by-feature를 사용하는 것에 대한 생각?


로또 미션 도중 학습한 것

  1. 문자열 포맷팅
    String.format("%d", string);
    System.out.printf("%d", str);
    

    두 코드가 일치한다!! string이 필요하지 않고 출력만 한다면 아래, 필요하다면 위 코드 사용