>

TIL

JAVA - Map, Maven

ekdud 2024. 12. 16. 18:02

📑

     

    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인터페이스를 상속받기 때문에 비슷하다.

    HashMapThread 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 명령어를 수행할 수 있음.