TIL

158일차(모험 67일차) - 회원 도메인 실행과 테스트

haedal-uni 2022. 2. 18. 23:39
728x90

[add] 회원 도메인 실행과 테스트 [#1]

강의를 들으면서 코드적고 올리기만 하는 것 같아서 오늘까지 작성한 코드들을 복습해봤다.

 

 

MemberServiceImpl

// MemberRepository 타입의 memberRepository 객체를 다른 객체로 바꾸지 않기 위해 final 키워드를 붙인다.
private final MemberRepository memberRepository = new MemoryMemberRepository();
// 추상화에도 의존하고 구체화에도 의존하고 있다. → DIP 위반

의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다.

* 추후 문제점과 해결 방안을 설명 예정

 

 

MemoryMemberRepository

구현체인 MemoryMemberRepository에서 동시성 문제 때문에

HashMap 대신 ConcurrentHashMap을 사용해야하지만 예시이므로 HashMap을 사용했다고 했다. 

157일차(모험 66일차)

 

 

그런데 왜 HashMap을 사용하는 걸까?

 

 

HashMap이란?

HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다.

Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있다.

Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조이다.

여기서 키와 값은 모두 객체이다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없다.

 

만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체된다.

HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서

뛰어난 성능을 보인다.

 

[Java] 자바 HashMap 사용법 & 예제 총정리, 코딩팩토리

 

HashMap은 내부에 '키'와 '값'을 저장하는 자료 구조를 가지고 있다.

 

 

 

코드로 보기

HashMap에 값을 추가하려면 put(key,value) 메소드를 사용하면 된다.

@Override
public void save(Member member){
    store.put(member.getId(), member);
}

 

+)

public class MemoryMemberRepository implements MemberRepository{

    // 원래는 동시성 문제 때문에 ConcurrentHashMap을 사용해야한다.
    private static Map<Long, Member> store = new HashMap<>();

    @Override
    public void save(Member member){
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }

}

store 변수는 타입이 Map<Long, Member>이다.

Map<Long, Member>는 Map의 Key로는 Long 타입의 객체를,

Value로는 Member 타입의 객체를 받아들이겠다는 말이다.

 

따라서 store.put(Long, Member) => store.put(member.getId(), member);가 되는 것이다.

만약 String 타입인 이름을 store에 id 값과 함께 넣고 싶으면 Map<Long, String>형태로 선언해줘야 한다.

[ https://www.inflearn.com/questions/302513 ]

 

 

 

HashMap을 사용하는 이유?

list 형태를 사용하지 않고 HashMap을 사용하는 이유는 성능 때문이다.

만약에 HashMap을 사용하지 않고 list를 사용했다면 원소를 검색하는데 시간복잡도는 O(n)일 것이다.

(정렬되어 있는 원소라면 Binary Search로 O(logN)가 된다.)

 

반면에 HashMap은 삽입, 검색에 시간복잡도 O(1)이라는 이점을 가지고 있다.

 

 

출처

[Java] 자바 HashMap 사용법 & 예제 총정리 ]

[ [Java] HashMap이란 무엇인가?

 

참고할 만한 자료

03-08 맵 (Map) ]

 

 

728x90