Collection
Collectionμ λ°μ΄ν° κ·Έλ£Ήμ μ²λ¦¬νλ λ° μ¬μ©λλ μΈν°νμ΄μ€λ€μ λͺ¨μμΌλ‘, λ°μ΄ν°λ₯Ό μ μ₯, κ΄λ¦¬ λ° μ‘°μνλ λ° μ¬μ©λλ λ©μλλ₯Ό μ μνλ€.
ππ»List,set,Queue,Map
Set
Setμ μ€λ³΅λ μμλ₯Ό νμ©νμ§ μλ μ§ν©μ λνλ΄λ μΈν°νμ΄μ€μ λλ€. μ£Όλ‘ λ°μ΄ν°μ μ μΌμ±μ 보μ₯νκ³ μ ν λ μ¬μ©
- HashSet: μμ μμ΄ μμλ₯Ό μ μ₯νλ©°, κ°μ₯ λΉ λ₯Έ κ²μ μλλ₯Ό μ 곡ν©λλ€.
- TreeSet: μμλ₯Ό μ λ ¬λ μμλ‘ μ μ₯νλ©°, μ λ ¬λ μμλ‘ μμμ μ κ·Όν μ μμ΅λλ€.
- LinkedHashSet: μμλ₯Ό μ λ ₯λ μμλλ‘ μ μ§νλ©΄μ μ μ₯ν©λλ€.
Subset
Set<String> originalSet = new HashSet<>();
// Setμμ λΆλΆ Set(subset) λ§λ€κΈ° (Java 8+)
Set<String> subset = originalSet.stream().limit(3).collect(Collectors.toSet());
Hash
- HashMap: κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ λ§΅ ꡬν체λ‘, μμλ₯Ό 보μ₯νμ§ μμ΅λλ€. (μ λ ¬,μ½μ μμκ° μλλ€)
- TreeMap: ν€λ₯Ό κΈ°μ€μΌλ‘ μ λ ¬λ μμλ‘ ν€-κ° μμ μ μ₯ν©λλ€.
- LinkedHashMap: μ λ ₯λ μμλ₯Ό μ μ§νλ©΄μ ν€-κ° μμ μ μ₯ν©λλ€
hashCode
λͺ¨λ μλ° κ°μ²΄λ Object ν΄λμ€λ₯Ό μμλ°κΈ° λλ¬Έμ hashCode λ©μλλ₯Ό κ°μ§κ³ μμ΅λλ€.
hashCode λ©μλλ κ°μ²΄μ ν΄μ μ½λλ₯Ό λ°ννλλ°, κΈ°λ³Έ ꡬνμ κ°μ²΄μ λ΄μ©μ κΈ°λ°νμ¬ ν΄μ μ½λλ₯Ό μμ±
Queue
Queueλ ν(Queue) μλ£ κ΅¬μ‘°λ₯Ό λνλ΄λ μΈν°νμ΄μ€λ‘, μ μ μ μΆ(FIFO) μμΉμ λ°λΌ μμλ₯Ό κ΄λ¦¬ν©λλ€.
- LinkedList: μΌλ°μ μΈ ν ꡬνμ μ¬μ©λ©λλ€.
- PriorityQueue: μ°μ μμ νλ₯Ό ꡬννλ©°, μμμ μ°μ μμμ λ°λΌ μ λ ¬λ©λλ€.
import java.util.Queue;
import java.util.LinkedList;
Queue<μλ£ν> λ³μλͺ
= new LinkedList<>();
γ΄ μ κ°μ κ²½μ°λ μλ£νμ λ£μ μλ£νλ§ μ½μ
, μμ κ°λ₯
Queue λ³μλͺ
= new LinkedList();
β q.offer(μ½μ ν value);
γ΄ λ°ν κ°(boolean): μ½μ μ±κ³΅ μ true / μ€ν¨ μ false λ°ν
β q.poll();
γ΄ λ°ν κ°(μμ λ valueμ μλ£ν): μμ λ value / 곡백 νμ΄λ©΄ null λ°ν
β q.element();
γ΄ λ°ν κ°(ν headμ μμΉν valueμ μλ£ν): ν headμ μμΉν value / 곡백 νμ΄λ©΄ Exception("NoSuchElementException") λ°μ
β q.peek();
γ΄ λ°ν κ°(ν headμ μμΉν valueμ μλ£ν): ν headμ μμΉν value / 곡백 νμ΄λ©΄ null λ°ν
β q.clear();
γ΄ λ°ν κ°(void): X
β q.size();
γ΄ λ°ν κ°(int): ν μ¬μ΄μ¦ λ°ν
β q.contains(μ°Ύμ value);
γ΄ λ°ν κ°(boolean): ν΄λΉ κ°μ΄ μ‘΄μ¬ν λ true / ν΄λΉ κ°μ΄ μμ λ false λ°ν
Map
ν€-κ° μμΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νλ©°, ν€λ μ€λ³΅λμ§ μμ΅λλ€.
:
HashMap, TreeMap, LinkedHashMap
hashmapμ μ λ ¬λ μμλ, μ½μ λ μμλ μλλ€ (μμμκ΄x)
treemapμ higherKey(),lowerKey(),floorKey(), firstEntry()
π³Tree
treeλ μμμ μμλ₯Ό μ ν΄ μ μ₯νλλ° μ μ©νλ€, μμ μ κΈ°μ€μΌλ‘ μΌμͺ½μ μμμλ₯Ό μ€λ₯Έμͺ½μ ν°μλ₯Ό λ°°μΉνλ€.
βοΈ treeset,treemapμ νμ setμ μ½λ μ μ’ λ₯μ λ°λΌ keyλ₯Ό μ΄μ©ν΄ νμsetμ λ§λ€μμλ€.
TreeSet
Generic
μ¬μ¬μ©μ±μ λμ΄κ³ νμ μμ μ±(type safety)μ κ°ννκΈ° μν κΈ°λ₯μΌλ‘, ν΄λμ€, μΈν°νμ΄μ€, λ©μλμμ μ¬μ©λ μ μμ΅λλ€. μ λ€λ¦μ μ¬μ©νλ©΄ ν΄λμ€λ λ©μλλ₯Ό μ μν λ μΌλ°μ μΈ νμ μ΄ μλλΌ κ΅¬μ²΄μ μΈ νμ μ μ§μ νμ§ μκ³ , μ€μ μ¬μ©λ λ νμ μ κ²°μ ν μ μμ΅λλ€.
class
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Method
public <T> T findMax(T[] array) {
T max = array[0];
for (T element : array) {
if (element.compareTo(max) > 0) {
max = element;
}
}
return max;
}
ν¨μν νλ‘κ·Έλλ°
ν¨μν νλ‘κ·Έλλ°μ ν¨μλ₯Ό μΌκΈ κ°μ²΄λ‘ μ·¨κΈνκ³ ν¨μ μ‘°ν©, κ³ μ°¨ ν¨μ, λΆλ³μ±(Immutability) λ±μ ν΅ν΄ νλ‘κ·Έλλ°μ μννλ μ€νμΌ
μλ°μμλ λλ€ ννμκ³Ό μ€νΈλ¦Ό APIλ₯Ό λμ νμ¬ ν¨μν νλ‘κ·Έλλ°μ μΌλΆ νΉμ±μ μ§μν©λλ€.
Stream
βοΈμλ° 8 μ΄μ μλ λ°°μ΄ λλ 컬λ μ μΈμ€ν΄μ€λ₯Ό λ€λ£¨λ λ°©λ²μ for λλ foreach λ¬Έμ λλ©΄μ μμ νλμ©μ κΊΌλ΄μ λ€λ£¨λ λ°©λ²μ΄μμ΅λλ€. κ°λ¨ν κ²½μ°λΌλ©΄ μκ΄μμ§λ§ λ‘μ§μ΄ 볡μ‘ν΄μ§μλ‘ μ½λμ μμ΄ λ§μμ Έ μ¬λ¬ λ‘μ§μ΄ μμ΄κ² λκ³ , λ©μλλ₯Ό λλ κ²½μ° λ£¨νλ₯Ό μ¬λ¬ λ² λλ κ²½μ°κ° λ°μν©λλ€.
: μ€νΈλ¦Όμ 'λ°μ΄ν°μ νλ¦’μ λλ€. λ°°μ΄ λλ 컬λ μ μΈμ€ν΄μ€μ ν¨μ μ¬λ¬ κ°λ₯Ό μ‘°ν©ν΄μ μνλ κ²°κ³Όλ₯Ό νν°λ§νκ³ κ°κ³΅λ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. λν λλ€λ₯Ό μ΄μ©ν΄μ μ½λμ μμ μ€μ΄κ³ κ°κ²°νκ² ννν μ μμ΅λλ€. μ¦, λ°°μ΄κ³Ό 컬λ μ μ ν¨μνμΌλ‘ μ²λ¦¬ν μ μλ€.
β μ€κ°μ°μ° : filter
β μ’ λ¨ μ°μ° : reduce
- μμ±νκΈ° : μ€νΈλ¦Ό μΈμ€ν΄μ€ μμ±.
- κ°κ³΅νκΈ° : νν°λ§(filtering) λ° λ§΅ν(mapping) λ± μνλ κ²°κ³Όλ₯Ό λ§λ€μ΄κ°λ μ€κ° μμ (intermediate operations).
- κ²°κ³Ό λ§λ€κΈ° : μ΅μ’ μ μΌλ‘ κ²°κ³Όλ₯Ό λ§λ€μ΄λ΄λ μμ (terminal operations).
μ 체 -> λ§΅ν -> νν°λ§ 1 -> νν°λ§ 2 -> κ²°κ³Ό λ§λ€κΈ° -> κ²°κ³Όλ¬Ό
Lambda
μ΅λͺ ν¨μλ₯Ό κ°κ²°νκ² ννν μ μλ λ°©λ²μ λλ€. λλ€ ννμμ μ¬μ©νλ©΄ ν¨μν μΈν°νμ΄μ€λ₯Ό ꡬνν λ λΆνμν μ½λλ₯Ό μ€μΌ μ μμ΅λλ€.
// κΈ°μ‘΄μ μ΅λͺ
ν΄λμ€λ₯Ό μ¬μ©ν λ°©μ
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// λλ€ ννμμ μ¬μ©ν λ°©μ
Runnable lambdaRunnable = () -> System.out.println("Hello, World!");
forEach
fruits.forEach(fruit -> System.out.println(fruit));
νλ¦μ κ° μμλ§λ€ μ€νλ ν¨μλ₯Ό 보λΈλ€.
κ³ μ°¨ ν¨μ (map, filter, reduce)
List<String> stringList = Arrays.asList("apple", "banana", "orange", "grape", "melon");
// 1. Filter: 쑰건μ λ§λ μμλ§ μ ν
List<String> filteredList = stringList.stream()
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
System.out.println("Filtered List: " + filteredList);
// 2. Map: κ° μμμ λν λ³ν
List<Integer> lengths = stringList.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println("Lengths of Strings: " + lengths);
// 3. Reduce: λͺ¨λ μμλ₯Ό νλλ‘ κ²°ν©
String concatenatedString = stringList.stream()
.reduce("", (s1, s2) -> s1 + s2);
- map:
- ν¨μν νλ‘κ·Έλλ°μμμ mapμ λ°μ΄ν° ꡬ쑰(μ: 리μ€νΈ)μ κ° μμμ ν¨μλ₯Ό μ μ©νμ¬ μλ‘μ΄ λ°μ΄ν° ꡬ쑰λ₯Ό μμ±ν©λλ€.
- λ°μ΄ν°λ₯Ό λ³ννκ±°λ νΉμ κ·μΉμ λ°λΌ λ§€νν λ μ¬μ©λ©λλ€.
- filter:
- filterλ λ°μ΄ν° ꡬ쑰μμ νΉμ 쑰건μ λ§μ‘±νλ μμλ§μ μ ννμ¬ μλ‘μ΄ λ°μ΄ν° ꡬ쑰λ₯Ό μμ±νλ κ³ μ°¨ ν¨μμ λλ€.
- νΉμ 쑰건μ λ§μ‘±νλ μμλ₯Ό κ±Έλ¬λ΄λλ° μ¬μ©λ©λλ€.
- reduce:
- reduceλ λ°μ΄ν° ꡬ쑰μ μμλ€μ κ²°ν©νμ¬ λ¨μΌ κ°μ μμ±νλ ν¨μμ λλ€.
- λ°μ΄ν°λ₯Ό μ§κ³νκ±°λ ν©μΉλ μ©λλ‘ μ¬μ©λλ©°, μ¬λ¬ κ°μ λ¨μΌ κ°μΌλ‘ μ€μ΄λ μ°μ°μ μνν©λλ€.
ν¨μν vs μ μ°¨ν
μ μ°¨ν
private static int normalSum(List<Integer> numbers){
int sum=0;
for(int number:numbers){
sum+=number;
}
return sum;
}
ν¨μν
private static int fpSum(List<Integer> numbers){
return numbers
.stream()
.reduce(0,(number1,number2)->number1+number2);
}
κ°μ΄ λ³νλ λ³μλ₯Ό κ΅³μ΄ λ£μ§ μκ³ , 무μμ νλμ§ μ€μ μ λλ€!