해결된 질문
작성
·
3K
35
안녕하세요. 존경하는 개발자님
질문 내용은 다음과 같습니다.
private static Map<Long, Member> store = new HashMap<>();
일반적으로 인스턴스를 생성할때에 다음과 같이 생성합니다.
상위객체 = new 하위객체();
아무런 생각없이 막연하게 그냥 일종의 암묵적인 룰이라고만 생각하면서 사용해왔으나 왜 이렇게 사용을 하는지 정확한 이유를 인지하고 코딩하고자 질문드리옵니다.
제 개인적인 생각으로 이렇게 구현하는 이유는 다양한 HashMap의 구현체 중에 Map에 대한 구현된 기능들만이 필요한 경우가 이유라고 생각합니다.
즉 자원을 아끼기 위한 것이라 생각하여 다음과 같이 코딩하여 테스트 해보았습니다.
하지만 결과적으로 동일한 size라는 결과가 나왔습니다.
만약 HashMap hashMap = new HashMap<>(); 이라면 더 다양한 method 사용이 가능한며, 동일한 size인데, 왜 이렇게 선언하여 사용하는 것인가요??
답변 5
64
안녕하세요. junmo sung님 좋은 질문입니다^^
자바는 객체 지향 언어이고, 객체 지향 언어의 꽃은 바로 다형성(Polymorphism)에 있습니다.
여기서는 단순하게 Map store = new HashMap() 이렇게 선언했는데요.
이 부분만 보면 HashMap store = new HashMap()와 비교해서, 이점은 다음과 같습니다.
1. Map 인터페이스의 제약을 따르겠다는 의도를 명확하게 드러냅니다.
2. 사용하는 코드가 Map 인터페이스 제약을 따르기 때문에 향후 변경시에 사용코드를 변경하지 않아도 됩니다.
3. HashMap을 다른 클래스로 변경이 필요하면 선언하는 코드만 변경하면 됩니다. 사용하는 코드를 고민하지 않아도 됩니다.
4. 다른 개발자들이 이 코드를 나중에 더 성능이 좋거나 동시성 처리가 가능한 종류의 구체적인 Map으로 변경해야 할 때 HashMap store = new HashMap()이라고 되어 있다면, 변경 시점에 상당히 많은 고민을 해야 하지만 Map store = new HashMap()으로 선언이 되어 있다면 편안하게 선언부를 변경할 수 있습니다.
5. 개발은 무의미한 자유도를 제공하는 것 보다, 제약을 부여하는 것이 혼란을 줄이고, 유지보수하기 쉽습니다.
6. 만약 정말 HashMap의 구체적인 기능을 사용해야 한다면 HashMap store = new HashMap() 이라고 선언하는 것이 맞습니다.
여기까지는 클래스 내부에서 사용하는 것에 대한 부분입니다.
여기서 한발 더 나가면 다음과 같은 설계도 가능합니다.
class MemberRepository {
private Map store;
public MemberRepository(Map store) {
this.store =store
}
}
외부에서 선언하는 코드
new MemberRepository(new HashMap());
new MemberRepository(new ConcurrentHashMap());
이렇게 해서 MemberRepository를 전혀 변경하지 않고, 외부에서 구현 객체를 생성해서 파라미터로 넘길 수 있습니다. 이런 것을 의존관계 주입( DI )이라고 하는데요. 이런 방법도 다형성 덕분에 사용할 수 있습니다.
다형성과 DI같은 객체지향 설계에 대한 부분은 다음에 준비하는 스프링 핵심 원리 강의에서 더 자세히 설명드릴께요.
도움이 되셨길 바래요^^
5
질문 감사드립니다.
저도 아무 생각없이
Map store = new HashMap()으로 선언해 사용했고,
이유에 대해서 생각해보지 않았는데
좋은 질문 주셔서 김영한 개발자님의 좋은 답변도 같이 보고, 객체지향의 다형성에 대해서 생각해 봤네요
감사합니당
정말 좋은 내용 ㄷㅅㅂㄱ
2
0
0