배경
새로운 언어를 공부하면서 느끼고 있는 점인데, 프로그래밍 언어는 하나만 잘 파놓으면 다른 언어를 배우는 진입장벽이 확 낮아진다는 사실이다. 그러나, 하나를 잘 파놓기가 쉽지 않은 것도 사실이다.
어쨌든 컬렉션 프레임워크는 전혀 모르는 개념을 공부하는 건 아니지만, 그나마 알고 있는 파이썬과 비교해서 정리해보기로 했다.
컬렉션 프레임워크(collection framework)
자바의 컬렉션 프레임워크란 데이터를 저장, 관리 및 처리 하기 위한 고수준의 자료구조와 알고리즘을 제공하는 라이브러리다.
java.util 패키지에 포함되어 있으며, 다음과 같은 인터페이스와 클래스가 있다.
1. List 컬렉션 - ArrayList, Vector, LinkedList
데이터를 순서대로 저장, 중복 허용 가능
2. Set 컬렉션 - HashSet, TreeSet
데이터를 순서없이 저장, 중복 허용 불가능
3. Map 컬렉션 - HashMap, Hashtable, TreeMap, Properties
키와 값의 쌍으로 데이터를 순서없이 저장, 키는 중복되지 않음(값은 중복 가능)
이외에도 Queue, Deque 등 다양한 인터페이스와 클래스가 있다.
여기까지보면 각각 파이썬의 list, set, dictionary 자료형과 대응할 수 있다.
자바의 컬렉션 프레임워크과 파이썬의 list, set, dictionary의 차이점
일단 파이썬은 중괄호 혹은 대괄호 안에 배열을 넣어주면 끝난다.
그에 반면, 자바는 java.util 패키지를 불러와야 하고, 클래스를 생성하고 배열에 들어갈 타입도 미리 지정해야 한다.
벌써부터 진입장벽이 마구 높아지는 기분이다.
List / ArrayList vs. list
자바의 List와 파이썬의 list 모두 순서 있는 데이터를 저장하는데 사용된다. 하지만 구체적인 사용법과 특징은 다르다.
자바의 List / ArrayList
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> javaList = new ArrayList<>();
javaList.add("apple");
javaList.add("banana");
javaList.add("cherry");
System.out.println(javaList.get(1)); // 출력: banana
}
}
자바의 List는 제네릭 타입을 사용하여 타입 안정성을 강화할 수 있다.
여기서 제네릭(Generic)이란 데이터 타입을 일반화하여 코드의 재사용성를 높이는 것을 말한다. 달리 말하면 자료구조의 타입을 설정해두고 객체를 생성할 수 있다는 소리다.
아래와 같이 타입을 미리 정하고 리스트를 생성할 수 있다.
List<String> List1 = new ArrayList<>();
List<Integer> List2 = new ArrayList<>();
List<Double> List3 = new ArrayList<>();
"안그래도 클래스까지 만들어서 리스트를 만드는 것도 번거로운데 타입까지 정해놔야 하다니 너무 짜증나는 걸!"
이라고 생각이 들다가도 그래도 타입이 다른 자료구조를 만들 때마다 클래스를 만들어주지 않아도 되니 병주고 약주고 같은 개념이라고 볼 수 있다.
어쨌든 더 큰 장점은 미연에 코드 오류를 방지할 수 있고 가독성 역시 높일 수 있어 안정성이 높아지는 효과가 있다.
혹시라도 잘못된 타입을 넣으면 다음과 같은 오류메시지를 출력한다.
파이썬의 list
python_list = ["apple", "banana", "cherry"]
print(python_list[1]) # 출력: banana
파이썬의 list는 다양한 데이터 타입을 동적(Dynamic)으로 저장할 수 있다.
한마디로 어떤 타입이든 넣을 수 있고 출력할 수 있다는 소리다.
이는 파이썬이라는 언어 자체를 설명하는 개념이기도 하다.
이것저것 따질 것이 없으니 초보자 입장에서는 참 편리한 방식이다.
python_list = ["apple", 3, 4.2323]
print(python_list[2]) # 출력: 4.2323
Set / HashSet vs. set
자바의 Set과 파이썬의 set 모두 중복 없이 고유한 값을 저장하는데 사용된다.
List의 차이점은 그대로 Set에도 적용이 된다.
자바의 Set / HashSet
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> javaSet = new HashSet<>();
javaSet.add("apple");
javaSet.add("banana");
javaSet.add("apple"); // 중복된 값을 허용하지 않음
System.out.println(javaSet.size()); // 출력: 2
}
}
자바의 Set은 중복 값을 허용하지 않는다.
add 메서드를 통해 값을 넣을 수 있는데, 중복값일 경우 허용하지 않아 저장되지 않는다.
파이썬의 set
python_set = {"apple", "banana", "apple"} # 중복된 값은 자동으로 제거됨
print(len(python_set)) # 출력: 2
파이썬의 set도 중복 값을 허용하지 않지만, 같은 배열에 입력하더라도 자동으로 중복 값을 제거한다.
Map / HashMap vs. dictionary
자바의 Map과 파이썬의 dictionary는 키와 값의 쌍으로 데이터를 저장한다는 점이 공통점이다.
자바의 Map / HashMap
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> javaMap = new HashMap<>();
javaMap.put("apple", 3);
javaMap.put("banana", 5);
System.out.println(javaMap.get("apple")); // 출력: 3
}
}
자바의 Map은 키와 값의 타입을 지정하며, 제네릭 타입을 사용하여 타입 안정성을 강화한다.
앞에 설명한 List와 동일하게 키와 값 모두 타입을 지정해주어야 한다.
파이썬의 dictionary
python_dict = {"apple": 3, "banana": 5}
print(python_dict["apple"]) # 출력: 3
파이썬의 dictionary는 동적 타입 언어의 특성을 따른다.
마찬가지로 어떤 타입이든 넣을 수 있는 장점이 있지만, 제네릭타입의 타입 안정성을 챙길 수 없다는 단점이 있다.
마치며
자바와 파이썬을 비교해보면서 파이썬은 초심자 친화적인 언어라는 생각이 들면서도, 코드가 복잡해지면 유지보수가 오히려 힘들겠다는 생각이 들었다.
마찬가지로 자바는 처음에는 배우기 어려운 언어이지만, 오류가 날 수 있는 부분들을 방지할 수 있어 안정성을 높일 수 있다는 점에서 명확한 장점도 느낄 수 있었다.
References
https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html
https://st-lab.tistory.com/153
** 사실과 다른 내용이 있을 수 있습니다. 언제든지 피드백 부탁드립니다!
'스터디 > 혼공학습단 10기 - 자바 & 머신러닝' 카테고리의 다른 글
[혼공학습단] k-평균 알고리즘의 작동방식 (0) | 2023.08.12 |
---|---|
[혼공학습단 ] HashMap으로 Map컬렉션을 이해하기 (0) | 2023.08.12 |
[혼공학습단] 자바의 컬렉션 프레임워크 들어가기 앞서... (0) | 2023.08.06 |
[혼공학습단] Java - 작업 스레드(Thread) 생성의 2가지 방법 (0) | 2023.07.30 |
[혼공학습단] 혼공자바 4주차 - 자바의 스레드(Thread) 맛보기 (0) | 2023.07.30 |
댓글