점프 투 자바

SUADI·2022년 4월 11일

오늘 학습한 부분은 Map, Set, Enum, Casting, final이다. 이 부분은 파이썬을 배우면서도 완벽하게 내 것으로 만들지 못했던 부분이였어서 좀 더 집중해서 공부를 했다. 파이썬 공부할 때보다 조금이나마 더 지식이 쌓인 듯 해서 뿌듯하다. 이런 식으로 하나하나 쌓아나갔으면 좋겠다. 어쨋든 TIL.

4. 자료형

(11) Map

map은 대응관계(key, value)를 표현할 수 있게 해주는 자료형이다. 자바의 map은 파이썬에서의 dictionary와 유사한 자료형이다. map을 Associative array, Hash라고도 한다.

배열, 리스트와의 차이는 여러가지가 있다.

  • list는 순차적(sequantial)으로 값에 접근하는 반면, map은 순서와 상관없이 key를 통해 value에 접근한다. 즉, 사전에서 어떤 단어를 찾기 위해 처음부터 끝까지 검색하는 것이 아니라, 그 단어의 뜻이 있는 곳만 검색한다.
  • array는 크기가 정해져 있는 반면, map은 크기가 정해져 있지 않아 확장성에 용이하다.
  • array는 순서가 정해져 있는 반면, map은 순서가 없어서 뒤죽박죽 출력이 된다.

Map 자료형에는 item(key, value)를 불러오는 순서에 따라 HashMap, LinkedMap, TreeMap 등이 있다. Map도 List와 같이 인터페이스이다.(인터페이스는 객체지향 파트에서 공부할 것이다.)

ㄱ) put

import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {

        HashMap<String, String> dic = new HashMap<>();
        dic.put("parse", "분석하다.");
        dic.put("retain", "유지하다");
        dic.put("associative", "연합의");
        dic.put("abstract", "추상적인");
        System.out.println(dic);   
        // {retain=유지하다, associative=연합의, parse=분석하다., abstract=추상적인}
    }
}

우선 HashMap을 import한다.

HashMap 역시 List에서와 마찬가지로 제네릭스를 사용해서 자료형 타입을 명시해주어야 에러가 날 확률을 줄일 수 있다.

put은 HashMap에 item(key, value)를 추가해주는 메소드이다.

예시로 사전을 만들었다. 출력을 하면 역시 순서가 뒤죽박죽인걸 확인할 수 있다.

ㄴ) get

		System.out.println(dic.get("retain")); // 유지하다 출력
		System.out.println(dic.get("apple")); // null 출력

key에 해당하는 value를 출력할 수 있다. key가 존재하지 않는다면 null(아무것도 없음)이 출력된다.

ㄷ) getOrDefault

		System.out.println(dic.getOrDefault("retain","유지하다.") // 유지하다 출력

get에서는 keyr가 없으면 null이 출력되었었는데 getOrDefault를 사용하면 지정한 default값이 출력되게 된다.

ㄹ) containsKey

		System.out.println(dic.containsKey("parse")); // true 출력

containsKey는 해당 Key가 존재하는지 판별해주는 메소드이다.

ㅁ) remove

		System.out.println(dic.remove("associative")); // 연합의 출력
		System.out.println(dic.remove("associative", "연합의")); // true 출력
		System.out.println(dic.remove("apple")); // null 출력
		System.out.println(dic.remove("apple","사과")); // false 출력
        

Map에 포함되어있는 item을 제거해주는 메소드이다.

ㅂ) size;

		System.out.println(dic.size()); // 4 출력

Map의 크기를 출력한다.

ㅅ) keySet

		System.out.println(dic.keySet()); // [retain, associative, parse, abstract] 출력

key들만 뽑아서 set 자료형으로 retrun한다. set 자료형은 List 자료형으로도 바꾸어 사용할 수 있다.

		List<String> keyList = new List<>(dic.keySet());

(12) Set(집합)

set은 집합 형태의 data를 처리할 수 있게 해주는 자료형이다.

  • 중복x -set의 특징은 값에 중복이 없다는 것이다. 예를 들어 set에 문자열 "H", "e", "l", "l", "o"를 저장했다면 "e","H","l","o" 이렇게 중복없이 출력된다. 중복이 되지 않는 특징 때문에 어떠한 자료의 중복을 제거하기 위한 용도로도 사용된다.

  • 또한 set 역시 Map과 마찬가지로 값에 순서가 정해져 있지 않은데 순서를 어떤 기준에 따라 정할 수 있게 해주는 것이 TreeSet, LinkedHashSet 등이다.

ㄱ) 교집합(intersection)

import java.util.Arrays;
import java.util.HashSet;

public class Sample {
    public static void main(String[] args) {
 		HashMap<Integer> s1 = new HashMap<>(Arrays.asList(1,2,3,4,5,6));
        HashMap<Integer> s2 = new HashMap<>(Arrays.asList(4,5,6,7,8,9));
        
        // intersection
        HashSet<Interger> intersection = new HashSet(s1);
        intersection.retainAll(s2);
        System.out.println(intersection);
        /// [1,2,3] 출력
    }
}    
  • 먼저 Arrays와 HashSet import를 해준다.
  • HashMap에서도 제네릭스를 적용하여 자료형 타입을 명시해 준다. 이 예시에서는 숫자만으로 이루어진 HashMap을 만들 예정이므로 int를 사용해야 하는데 int는 원시(primitive) 자료형이라 리터럴 표기밖에 안된다. int의 Wrapper 클래스인 Integer를 적어준다.
  • intersection이라는 HashMap을 따로 만들어준다. 왜냐하면 s1에 교집합을 하여 그 값을 덮어쓰면 s1 데이터가 변경되기 때문이다.
  • retainall은 교집합을 해주는 메소드이다.

ㄴ) 합집합(union)

 		HashMap<Integer> s1 = new HashMap<>(Arrays.asList(1,2,3,4,5,6));
        HashMap<Integer> s2 = new HashMap<>(Arrays.asList(4,5,6,7,8,9));
        
        // union
        HashSet<Interger> union = new HashSet(s1);
        union.addAll(s2);
        System.out.println(union);
        /// [1,2,3,4,5,6,7,8,9] 출력
    }
}    
  • addAll은 합집합을 해주는 메소드이다.

ㄷ) 차집합(substract)

 		HashMap<Integer> s1 = new HashMap<>(Arrays.asList(1,2,3,4,5,6));
        HashMap<Integer> s2 = new HashMap<>(Arrays.asList(4,5,6,7,8,9));
        
        // union
        HashSet<Interger> substract = new HashSet(s1);
        substract.removeAll(s2);
        System.out.println(union);
        /// [1,2,3] 출력
    }
}    
  • removeAll은 차집합을 수행하는 메소드이다.

(13) Enum(상수집합)

Enum은 Enumeration의 약자로 열거라는 의미이다. Enum은 서로 관련이 있는 여러개의 상수 집합을 정의할 때 사용하는 자료형이다. 자바에서는 final로 String과 같은 기본 자료형을 고정시킬 수가 있다. 한번 선언을 하면 다시 값을 변경할 수가 없다. 이렇게 고정된 값들을 상수라고 한다. 어떤 클래스가 상수만으로 작성되어 있으면 굳이 class로 선언할 필요없이 enum이라고 선언하면 이 객체는 상수의 집합이라는 것을 명시적으로 나타낼 수 있다. (아직 100% 이해가 어려워서 나중에 더 깊이 공부해 보려고 한다.)

(14) Casting

casting은 자료형 간 타입을 변환하는 것이다. 프로젝트를 하다보면 자료형을 변경해야 하는 경우가 있다고 한다.

ㄱ) 문자열 -> 정수

public class {
	public static void main(String[] args) {
    	String s1 = "123";
        
        int n1 = Integer.parseInt(s1);
        System.out.println(n1); // 123 출력
    }
}

Integer.parseInt() : 문자열 -> 정수

ㄴ) 정수 -> 문자열

		int n2 = 123;
        
        // sol 1)
        String s2 = "" + n2;
        System.out.println(s2.getClass().getName());
        // java.lang.String 출력
        
        // sol 2)
        String s3 = Integer.toString(n2);
        System.out.println(s2.getClass().getName());
        // java.lang.String 출력
        
        // sol 3)
        String s4 = String.valueOf(n2);
        System.out.println(s2.getClass().getName());
        // java.lang.String 출력        
  • getClass().getName() - 자료형 타입 출력해주는 메소드.

ㄷ) 문자열 -> 실수

		String s5 = "123.456";
        
        Double d1 = Double.parseDouble(s5);
        System.out.println(d1.getClass().getName());
        // java.lang.Double 출력
        
        Float f1 = Float.parseFloat(s5);
        System.out.println(f1.getClass().getName());
		// java.lang.Float 출력

ㄹ) 정수 <-> 실수

		int n3 = 123;
        double d2 = n3; // 정수 -> 실수는 캐스팅 필요 x
        System.out.println(d2); // 123.0 출력
        
        double d3 = 123.456;
        int n4 = (int) d3;
        System.out.println(n4); // 123 출력(내림)

(15) final

마침내(finally)!! 자료형의 마지막인 final이다. final은 enum에서 설명했듯이 데이터를 고정시키는 역할을 해서 중요한 데이터가 변경되지 않도록 하는 역할을 한다.

		final int n = 123;
        n = 456; // 컴파일 에러 발생
      
      	// cannot assign a value to final variable number     

리스트의 경우에도 final을 선언하면 재할당이 불가능하다.

		final ArrayList<String> list = new ArrayList<>(Arrays.asList("hello","World"));
        list = new ArrayList<>(Arrays.asList("hi","java")); // 컴파일 에러
        
        // cannot assign a value to final variable list     

하지만 리스트에서 추가(add), 제거(remove)는 가능하다.

0개의 댓글