📑
Map 자료구조
Map은 인터페이스로 선언되어 있고 Map으로 구현한 여러 클래스들이 있다.
Map 인터페이스는 키와 값을 하나의 쌍으로 저장하는 Key-Value방식을 사용한다.
=> Key로 Value를 얻어냄.
*키(key): 실질적인 값(value)을 찾기 위한 이름의 역할.
특징
- 요소의 저장 순서를 유지하지 않음.
- Key는 중복을 허용X, Value는 중복 허용.
*이미 존재하는 Key 값을 다시 저장하면 기존 값이 사라지고 새로운 값으로 대체된다.
가장 많이 쓰이는 클래스는 HashMap, TreeMap, LinkedHashMap이다.
🖤 HashMap
HashMap<K,V> map = new HashMap<K,V>();
HashMap<String, Integer> hm = new HashMap<String, Integer>();
Hashmap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등객체가 될 조건을 정해야 한다. 동등객체, 즉 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야하고, equals()메소드가 true를 리턴해야 한다.
🖤 HashTable
Map <K, V> map = new Hashtable<K,V>();
Map <String, Integer> map = new Hashtable<String,Integer>();
HashMap과 HashTable의 차이는 뭘까?
우선 HashMap은 키나 값에 null을 저장할 수 있으며 멀티쓰레드에서 safe하지 않다.
반대로 HashTable은 키나 값에 null 저장이 불가하며 멀티쓰레드에서 safe하다.
이 차이점을 제외하고는 HashTable도 Map인터페이스를 상속받기 때문에 비슷하다.
HashMap을 Thread Safe하게 이용하려면 이렇게 선언하면 된다.
Map m = Collections.synchronizedMap(new HashMap(...));
🖤 TreeMap
TreeMap은 객체를 저장하게 되면 자동으로 정렬이 된다.
이진트리를 기반으로 했기 때문인데 기본적으로 부모 키 값과 비교해서 키 값이 낮은 것이 왼쪽 자식 노드에, 높은 것이 오른쪽 자식 노드에 Map.Entry객체를 저장한다.
TreeMap<String, Integer>treeMap = new TreeMap<String, Integer> ();
Map인터페이스 타입 변수에 대입해도 되지만 특정 객체를 찾거나 범위 검색과 관련된 메서드를 사용하기 위해 TreeMap 클래스 타입을 이용한다.
🖤 LinkedHashMap
HashMap 은 hashcode 를 사용하기 때문에 순서가 일정하지 않다.
LinkedHashMap 은 내부를 Double-Linked List 로 구성하여 HashMap의 순서를 유지한다.
HashMap 에서 상속받기 때문에 HashMap 의 모든 메소드를 사용할 수 있다.
Map<String, String> map = new LinkedHashMap<>();
Maven
Java 기반 프로젝트의 라이프 사이클 관리, 의존성 관리, 그리고 플러그인 지원과 중앙저장소를 제공해주는 빌드 도구이다.
라이브러리 사용 시 직접 라이브러리의 jar파일을 다운로드 해 프로젝트에 추가하거나
Maven Repository에서 라이브러리를 검색 후 추가해야하는데 이러한 번거로움을 해결해준다.
pom.xml에 사용하는 라이브러리 목록을 적어두기만 하면 쉽게 라이브러리 변경 관리가 가능해진다.
pom.xml의 기본구조
<project> --------- 루트태그. 프로젝트 정보를 정의함.
<modelVersion> --------- 메이븐 모델의 버전 지정.
<groupId> --------- 프로젝트의 그룹 아이디 지정.
<artifactId> --------- 아티팩트(빌드 결과물) 아이디 지정.
<packaging> --------- 프로젝트 아티팩트의 종류 지정.('war': 웹 어플리케이션, 'jar': 자바 라이브러리)
<name> --------- 프로젝트명 지정.
<version> --------- 프로젝트 버전 지정.
<description> --------- 프로젝트에 대한 간단한 설명
<url> --------- url 정보
그 외에도 licenses, properties, repositories 등의 태그들이 있다.
<dependencies> --------- 프로젝트가 의존하는 외부 라이브러리 또는 모듈들 정의.
<dependency> --------- 이 정보를 바탕으로 Maven이 자동으로 필요한 라이브러리들을 다운로드하고 관리함.
</dependency>
⁝
<dependency>
</dependency>
<build> --------- 프로젝트 빌드에 관한 설정 정의.(컴파일 옵션, 리소스 디렉토리, 플러그인 설정 등)
<defaultGoal> --------- 수행할 작업 정의.
<directory>
<finalName>
<pluginManagement>
메이븐 명령어로 프로젝트 빌드를 수행하게 되면
빌드 태그 내의 정의된 플러그인을 통해 빌드가 진행되고,
빌드된 결과물은 디렉토리 태그 내에 정의된 폴더 하위에 생성된다.
project, modelVersion, groupId, artifactId, version 이 5가지가 최소값이다.
- 메이븐 내장 Goal 명령어
mvn groupId:artifactId:version:goal
- 메이븐 컴파일러 플러그인
: Java 소스코드 컴파일에 사용. 해당 플러그인을 추가함으로써 자바 소스 코드를 빌드할 수 있는 다양한 Goal 명령어를 수행할 수 있음.