21년 1월 24일

한 일

  • 자바의 정석 Chapter 12 지네릭스, 열거형, 애너테이션 중 지네릭스를 모두 읽었다.

    • 지네릭스는 클래스 또는 메소드에 타입을 파라미터처럼 전달하여(타입 변수) 타입을 보다 자유롭게 쓸 수 있게 해준다.

    • 지네릭스의 장점은 다음과 같다.

      1. 타입 안정성을 제공한다.
      2. 타입체크와 형변환을 생략할 수 있어 코드를 간소화해준다.
    • 지네릭 메소드에 선언된 타입 변수와 지네릭 클래스에 선언된 타입 변수는 다르다.

    • 지네릭 메소드에 선언된 타입 변수는 해당 메소드의 지역 변수와 같은 우선순위를 갖는다.

      1. 즉, 지네릭 클레스에 T라는 타입변수가 선언되어 있고, 지네릭 메소드에 T라는 타입변수가 있으면,

        해당 메소드 내의 T는 지역변수나 마찬가지인 지네릭 메소드의 T를 의미한다.

    • 와일드 카드에 대해 배웠다.

      1. 와일드 카드는 ?로 정의되며 <?> 라는 건 <? extends Object>를 생략한 것이다.

      2. 와일드 카드는 참조변수 타입에 선언되는데,

        <? extends Fruit>라면 해당 참조변수의 인스턴스에는 타입 변수로 Fruit와 Fruit를 상속한 클래스 타입이 들어갈 수 있고,

        <? super Fruit>일 경우에는 타입 변수로 Fruit와 Fruit가 상속한 부모 클래스 타입이 들어갈 수 있다.

      3. 와일드 카드로 선언된 참조변수 간에는 컴파일러가 판단하여 형변환을 할 수 있게 해준다.

        • Fruit와 Fruit를 상속 받은 Apple, Grape가 있다고 하자.

          ArrayList<Fruit> fruitList = new ArrayList<>();
          ArrayList<Apple> appleList = new ArrayList<>();
                   
          appleList = (ArrayList<Apple>)fruitList; // 에러;
          fruitList = (ArrayList<Fruit>)appleList; // 에러; 
                   
          /////////////////////////////////////////////////////////////////////////
          ArrayList<? extends Fruit> fruitList = new ArrayList<>();
          ArrayList<? extends Apple> appleList = new ArrayList<>();
                   
          appleList = (ArrayList<? extends Apple>)fruitList; 
          //경고; fruitList는 Apple로 형변환할 수 있는 타입이 들어갈수도 있으므로 에러로 막지는 않음
          fruitList = (ArrayList<? extends Fruit)appleList;
          //성공; appleList는 Fruit로 형변환할 수 있는 타입이 들어가있으므로 경고하지 않음
                   
          /////////////////////////////////////////////////////////////////////////
          ArrayList<? extends Grape> grapeList = new ArrayList<>();
          ArrayList<? extends Apple> appleList = new ArrayList<>();
                   
          appleList = (ArrayList<? extends Apple>)grapeList; 
          //에러; grapeList는 Apple로 형변환할 수 있는 타입이 들어갈 수 없으므로 에러
          grapeList = (ArrayList<? extends Grape)appleList;
          //에러; appleList는 grape로 형변환할 수 있는 타입이 들어갈 수 없으므로 에러
          


  • 프로그래머스 문제 타겟넘버, 네트워크 문제를 풀었다.

    1. 타겟넘버:

      1. 간단한 DFS/BFS문제이다.
      2. 주어진 숫자들을 +또는 -로 연산해가면서 마지막에 target과 같을 경우 경우의 수를 늘려준다.
    2. 네트워크:

      1. DFS/BFS로 풀수도 있고, union-find알고리즘으로 풀 수도 있다.

      2. 두 가지 방법으로 모두 풀어봤다.

      3. union-find의 경우는 computers매개변수를 순회하며 1인경우 두 노드를 하나의 집합으로 만들어준다.

        1. 마지막에 parent 배열을 순회하며 각 parent배열 값을 다시 getParent(parent[n])로 확인하여 HashSet(집합 명 Set)에 넣어준다.

        2. HashSet의 size가 네트워크 개수가 된다.

      4. DFS/BFS로 푸는 방법은 그냥 areaNum을 늘려주며 area가 정해지지 않은 node의 area를 DFS/BFS로 areaNum으로 정해준다.

잘못한 것

  • TCP/IP 쉽게 더쉽게 읽기라는 목표를 점점 뒤로 미루고 있다.

잘한 것

  • 주말이라 쉬엄쉬엄했지만 꾸준함의 중요성을 인지하며 공부하고 있다.

느낌

  • 제너릭스는 생각보다 어렵지 않았다.
  • 자바 API를 읽을때마다 헷갈렸던 ?라는 와일드카드를 알게되어서 기분이 좋았다.

할 일

  • 코드스쿼드 미션 하기
  • 프로그래머스 문제 풀기
  • 자바의 정석 열거형 읽기
  • TCP/IP 쉽게 더 쉽게는 자바의 정석 1회독 한 후 읽어야 할 것 같다.