[TIL] 2024-07-24

성장일기·2024년 7월 24일

회고

목록 보기
12/37

중요 학습 내용 [JAVA]

Collection

  • 주로 ArrayListHashMap를 사용
  • 일반적으로 다형성을 적용시켜 부모인터페이스로 선언하곤 한다.

Iterator

  • .iterator()는 기본적으로 Collection에 있다.
  • iterable의 구현체에서 iterator가 사용할 수 있는 반복문은 while문 밖에 없음.
// 설명. 다루는 Iterator와 관련된 컬렉션의 제네릭 타입과 일치하는 제네릭을 반드시 명시(다운캐스팅 고민 없도록)
Iterator<String> iter = ((LinkedList<String>) stringList).descendingIterator();
while (iter.hasNext()) {
       System.out.print(iter.next() + ", ");
   }

List

  • 중복허용, 동등(e,h) 허용

  • 일반적으로 다형성을 적용한 부모 인터페이스인 List로 선언을 많이 함.

    • Collections.sort(LIST)로 정렬 가능
    • .sort(new Comparator)로 정렬 가능 -> Comparator 선언 필요
      // Wrapper 클래스에는 이미 compareTo라는 메서드가 오버라이딩 되어있다.
      Collections.sort(LIST);                                 // Comparable 방식
      Collections.sort(LIST, new AscendingPrice());           // Comparator 방식
      
  • 주요 메서드

    List
    BASIC.add().get()
    .size()
    .set().remove()
    .clear()
    .isEmpty()

ArrayList

LinkedList

  • 요소 중간에 값을 편집할 때, 고려할만 하다.(성능이 우수하기에)
  • 주요메서드(queue(deque)의 구현체)
LinkedList
.offer().peak().poll()

Queue

  • linkedList는 Queue의 구현체(정확히는 Queue 인터페이스를 상속받은 Deque의 구현체)
  • 시간과 상관없이 데이터가 들어온 순서를 지켜 정확하게 처리
  • 속도보다는 순서를 신경써야하는 경우 주로 사용(ex. 배민)
  • 빠짐없이 처리되어야하기에 실패하면 다시 넣는다.
  • deque는 양방향으로 데이터 입출력 가능

Stack

  • Vector를 상속받음
  • List 계열로 ArrayList보다 느리지만 동기화처리가 가능하다.
  • 주요메서드
Stack
push()peak()search()pop()

Set

  • 기본적으로 대입하는 순서를 보장하지 않는다.
  • 중복값 대입 시, 들어가지 않음(덮어쓰이지 않는다.).
  • 동등 비교에 대한 재정의가 필요하다.(equals(), hashCode())
  • 인덱스 개념이 없기에 iterator를 사용해야 함.
  • 배열로 변경할 수는 있다.(toArray() 사용)
  • 주요 메서드
Set
.add().size()
.clear(), .isEmpty()

hashSet

  • 주로 중복조회를 위해 사용되며, 거의 사용되지 않는다.

linkedHashSet

  • 저장 당시의 순서(대입 순서)를 유지하는 특성을 가지고 있다.(순서 유지)

TreeSet

  • 중복값제거 + 정렬
  • 구조화(정렬시켜 저장)되어 저장되기에, 정렬(ascending, descending)개념과 같다.

Map

  • 거의 HashMap으로 쓴다.
  • entry = key + value
  • 주요메서드
Map
.put(entry)
.put(key, value)
.get(), .size().remove(key)

HashMap

  • hashMap은 중복을 덮어씌움

  • 쿼리 말고 HashMap을 쓰기도 한다.

  • 주요 메서드

  • map의 출력

    • keyset()으로 key(Set type)를 iterator로 반복하기

    • 동일한 방법을 entryset()을 이용

      Set<Map.Entry<String, String>> set = hashmap.entrySet();
      Iterator<Map.Entry<String, String>> iterEntry = set.iterator();
      while (iterEntry.hasNext()) {
         Map.Entry<String, String> entry = iterEntry.next();
             System.out.println("key: " + entry.getKey() + ", " + "value: " + entry.getValue());
         }

hashtable

  • key, value가 모두 String → 제네릭 사용 X
  • hashmap의 동기화처리가 가능하다.
  • 속도가 느리다.
  • REMIND: 동기화 가능 타입
    StringBuilder → StringBuffer
    ArrayList → Vector
    HashMap → Hashtable

Properties

  • Map의 properties 중, 제네릭을 사용하지 않고 Key와 Value를 모두 String으로 사용하는 컬렉션(HashMap과 거의 유사)

  • 기본 설정값을 properties로 관리한다.

  • (db 연결과 같은) 여러 연결 설정을 보통 properties로 관리한다.

    .prop, .dat => .xml => Annotation 방식(ex. @Value("driver"))

  • 주요 메서드

Properties
.store(기반 스트림, ""),
.storeToXML(기반 스트림, ""),
.getProperty("key"),
.load(기반 스트림),
.loadFromXML(기반 스트림)
.setProperty("key", "value")

Enum

  • Enum을 사용하는 이유(interface의 private static final 선언과의 차이점)

    • runtime 시점에서는 상수이기에, static final의 명시적 선언이 human error를 발생시킬 여지가 있다.
    • 동일 이름 선언 시, 별도의 처리(prefix 등)가 필요하여 번거롭다.
    • switch문 사용 시, 별도의 문자열 출력 처리가 필요하다.
    • 필드의 갯수와 종류를 파악하기 어려워 순회할 수 없다.
    • 타입 안정성을 보장할 수 없다.
  • 특징

    • Lazy 로딩 방식(one of 싱글톤)

      • 호출될 때, enum의 객체(마치 필드와 같은) 수 만큼의 생성자가 호출
    • values()로 배열을 반환받아 순회처리가 용이

    • 타입 안정성을 보장

    • EnumSet.allOf(enumtype.class)로 set으로 바꿔 반복자 사용 가능

    • 마치 클래스와 같이 활용 가능

      public enum UserRole {
         GUEST("게스트"),
         CONSUMER("구매자"),
         PRODUCER("판매자"),
         ADMIN("관리자");
        
         private final String DESCRIPTION;
      
         UserRole(String description) {
             this.DESCRIPTION = description;
         }
      
         public String getDescription() {
             return this.DESCRIPTION;
         }
      }
  • 주요 메서드:

Enum
.name().ordinal()

놓쳤던 점

  • 네트워크 공부
profile
엔지니어로의 성장일지

0개의 댓글