1. HashMap
   - Thread-Safe하지 못한 클래스
   - Multi-Thread 환경에서 안전하게 사용하기 위해 Collections.synchronizedMap(hashMap) 등으로 동기화 처리 필요
   - key, value에 null 허용

2. HashTable
   - 데이터 관련 메소드에 synchronized 처리가 되어있어 멀티 스레드 환경에서 안전하게 사용 가능
   - 동기화 Lock 때문에 속도가 느리다
   - key, value에 null을 허용하지 않음

3. ConcurrentHashMap
   
- HashTable처럼 항상 동기화 Lock을 걸지는 않고,
       . 빈 해시 버킷에 데이터를 삽입하는 경우, CAS(Compared And Swap)를 이용하여 원자성을 보장한다
       . 이미 데이터가 존재하는 해시 버킷 서로 다른 스레드가 접근 할 때만 동기화 Lock이 걸리게 된다
       . HashTable보다 성능면에서 우수
   - key, value에 null을 허용하지 않음

'~2022 > Java' 카테고리의 다른 글

[Java] HashMap, TreeMap, LinkedHashMap  (0) 2021.10.25
[Java] Atomic Class  (0) 2021.10.12
[Java] DTO와 VO의 차이  (0) 2021.08.22

1. HashMap
- 내부적으로 Entry 배열을 만들어 관리 (key-value 쌍의 개수에 따라 동적으로 크기가 증가하는 associate array)

- 객체의 hashCode() 메소드의 리턴 값을 기반으로 동작하되, 해시 충돌(Hash Collision)을 대비해 equals() 메소드까지 사용해서 key값이 정말 같은 경우에만 value를 리턴

- 키 값으로 사용할 클래스의 특성에 따라 필요한 경우 hashCode()메소드와 equals()메소드를 오버라이드

- 입력 순서나 key값의 정렬 순서는 지켜지지 않음
- 해시 함수를 사용하기 때문에 데이터 탐색에 O(1)의 시간복잡도를 갖는다
- Java HashMap의 동작 방식(Seperate Chaning): https://d2.naver.com/helloworld/831311 

  . 해시 충돌을 방지하기 위하여 Separate Chaining과 보조 해시 함수를 사용
  . 데이터가 많아지면, 충돌 시 성능 상 이점을 위해 데이터를 트리에 저장하여 관리
    ~Java 8에서는 Separate Chaning에서 하나의 해시 버킷에 8개 이상 키-값 쌍이 모이면 링크드 리스트를 트리로 변경
    ~버킷에 있는 데이터를 삭제하여 다시 개수가 6개에 이르면 다시 트리를 링크드 리스트로 변경 

 

 

2. TreeMap
- 내부적으로 RedBlack Tree로 저장하여 관리
- key로 사용할 클래스에 Comparator 인터페이스를 구현하면 key값을 기준으로 정렬된 상태를 유지할 수 있다

- 데이터 탐색에 O(logN)의 시간복잡도를 갖는다

 

3. LinkedHashMap
- Map.Entry 클래스를 구현한 Node 클래스로 내부에 before, after 멤버를 갖는 각 항목을 연결리스트 구조로 가지고 있음
- 데이터가 입력된 순서를 유지

'~2022 > Java' 카테고리의 다른 글

[Java] HashMap, HashTable, ConcurrentHashMap  (0) 2021.10.25
[Java] Atomic Class  (0) 2021.10.12
[Java] DTO와 VO의 차이  (0) 2021.08.22

DTO와 VO는 둘 다 RDBMS의 record에 대응되지만

DTO는 데이터 전송용 mutable 객체이고 비즈니스 로직을 포함하지 않는다
VO는 값 그 자체로 의미를 지니는 immutable 객체이며 로직을 포함할 수 있다

 

주소, 이름, 돈도 단순히 문자열이 아닌 비즈니스 로직에 대한 책임이 있는 VO가 될 수 있으며

주소는 나라, 시, 도, 구, 상세 주소가 포함된 캡슐화된 로직과 객체

돈은 통화, 수치 로직이 포함된 객체가 될 수 있다.

 

그리고 이러한 VO 자체가 DTO가 될 수도 있다.

다만 DTO는 데이터 전송용 객체로 비즈니스 로직에 대한 책임이 없으므로, DTO가 VO라고 보기는 힘들다

 

DTO(Data Type Object): 계층간 데이터 교환을 위한 객체(Java Beans)

 

여기서 계층은 Controller, View, Business Layer, Persistent Layer 등을 의미

 

DTO는 로직을 가지지 않는 순수한 데이터 객체로 getter, setter 메소드만 가진 클래스를 의미한다.

public class PersonDTO {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

** DTO와 데이터 자동화처리

 

자바는 다양한 프레임워크에서 데이터 자동화처리를 위해 리플렉션 기법을 사용한다.

예를 들어, View에 있는 form에서 name 필드 값을 프로퍼티에 맞춰 넘기면, name속성의 이름이랑 매칭되는 프로퍼티에 자동으로 DTO가 인스턴스화 되어(프레임워크 내부에서 setter가 실행됨) PersonDTO를 자료형으로 값을 받을 수 있다.

 

참고로 자바의 프로퍼티(데이터)는 멤버변수 name, age로 결정되는 것이 아니라 getter/setter로 표현된다.

 

 

VO(Value Object): 특정 비즈니스 데이터를 담는 Immutable한 객체 

 

DTO와 비교했을 때 VO는 Immutable한 특성이 있으며 주로 같은 시스템 내에서 사용된다.

 

** DB Entity vs VO

 

DB entity는 식별자를 가지고 있고 식별자로서 동등성을 비교하지만

VO는 객체주소가아닌 값으로 동등성을 구별한다.

 

즉, VO 내부에 선언된 속성(필드)의 모든 값들이 같아야 똑같은 객체라고 할 수 있다.

따라서 Object 클래스의 equals()와 hashCode()를 오버라이딩 하여

서로 다른 이름을 갖는 VO 인스턴스라도 같은 객체라고 할 수 있다.

 

 

[참고 사이트]

https://lemontia.tistory.com/591

https://okky.kr/article/588264

'~2022 > Java' 카테고리의 다른 글

[Java] HashMap, HashTable, ConcurrentHashMap  (0) 2021.10.25
[Java] HashMap, TreeMap, LinkedHashMap  (0) 2021.10.25
[Java] Atomic Class  (0) 2021.10.12

+ Recent posts