☕ Java

Java 배열, List, Map, Set의 선언 방법과 차이

loose 2022. 5. 9. 17:59
반응형

배열

String[] test = {"a", "b", "c"};
int[] num = new int[3];

크기 고정

삽입/삭제 시 오래걸린다는 단점이 있다.

List

ArrayList<String> pitches = new ArrayList<String>();
ArrayList<String> pitches = new ArrayList<>(); //선호되는 방식 
//우측 제네릭 타입은 안써줘도 왼쪽 제네릭에 의해서 알 수 있으므로 더 선호되는 방식

List<Object> arrList = new ArrayList<>(); 
//객체지향적 설계를 위해 List 인터페이스를 통해 선언하는게 좋다고 함.

List는 기본적으로 데이터들이 순서대로 저장되며 중복을 허용한다.

보통 List는 ArrayList만 쓰이며 일반적인 배열 방식보다 더 권장된다. 

Map

Map<String, String> map = new HashMap<>();

Map은 순서가 보장되지 않고 Key값의 중복은 허용하지 않지만 Value값의 중복은 허용된다.

보통 Map은 HashMap으로 선언되어 사용된다. LinkedHashMap을 쓰면 순서가 보장된다.

 

Map형으로 사용할 때의 장점이 있다.

["a","a","b","b","c"]

위와 같은 배열 데이터가 주어질 때 배열 데이터의 개수를 셀 때이다.

String[] names = {"a","a","b","b","c"};

String[] tempNames = {"a", "b", "c"};
int count = 0;
int[] nameCount = new int[3];
for(int i=0; i<tempNames.length; i++){
	for(int j=0; j<names.length; j++){
    	if(tempNames[i].equals(names[j])){
    		count++;
        }
    }
    nameCount[i] = count;
    count = 0;
}

라는 코드를 짜고 frodo는 2개, neo는 2개, muzi는 1개로 숫자를 셀 수가 있다.

다만 이렇게 짜게되면 frodo를 찾을 때도 names 전부를 뒤져야하고 neo와 muzi도 마찬가지다. 

이럴 때 효율적으로 짤 수 있는 방법이 Map형을 이용하는 것이다.

 

String[] names = {"frodo","frodo","neo","neo","muzi"};

Map<String, Integer> map = new HashMap();
for(String name : names) {
	map.put(name, map.getOrDefault(name, 0) + 1);
}
System.out.println(map);
//{muzi=1, neo=2, frodo=2}

for문을 이용할 때 처럼 names를 전부 돌지 않고 5회만 돌고 끝나도록 getOrDefault를 사용해서 효율적 처리가 가능해진다.

Set

Set<String> set = new HashSet<String>(); 
set.add("a");
set.add("b");
set.add("b"); //데이터 안 들어감
set.add("c");

Set은 순서가 보장되지 않고 데이터들의 중복을 허용하지 않는다.

List와 비슷한 느낌이지만 데이터를 추가할 때 중복을 제거해주는 자료구조이다.

 

728x90