๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Back-end ๋ฐ๋ธŒ์ฝ”์Šค/week 01 - 02 TIL (java, DB)

[TIL] 221020 - Java์˜ Collection

by young-ji 2022. 10. 21.

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ JAVA - Java์˜ Collection ์ด์•ผ๊ธฐ

 

1. Collection

์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ์˜ ๋ฌถ์Œ์„ ์ปฌ๋ ‰์…˜์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปฌ๋ ‰์…˜์€ ์ถ”์ƒ์ฒด ์ž…๋‹ˆ๋‹ค.
  • Collection
    • List
      • LinkedList
      • ArrayList
      • Vector
      • Stack
    • Set
      • HashSet

 

๋ฒ”์šฉ์ ์ธ ํ˜•ํƒœ์˜ Collection..

// MyCollection.java
package com.programmers.java.collection;

import com.programmers.java.iter.MyInterator;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

public class MyCollection<T> {
    private List<T> list;

    public MyCollection(List<T> list){
        this.list = list;
    }

    public MyCollection<T> filter(Predicate<T> predicate){
        List<T> newList = new ArrayList<>();
        foreach(d -> {
            if (predicate.test(d)) { //test ๊ฐ’ -> ํ•„ํ„ฐ๊ฐ€ ์ฐธ์ด๋ฉด
                newList.add(d);
            }
        });
        return new MyCollection<>(newList);
    }

    // ์ด ๋ฉ”์„œ๋“œ์—์„œ <U>๋ฅผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํ™œ์šฉํ•ด๋ผ
    public <U> MyCollection<U> map(Function<T,U> function){
        List<U> newList = new ArrayList<>();
        foreach(d -> newList.add(function.apply(d)));
        return new MyCollection<>(newList);
    }

    public void foreach(Consumer<T> consumer){
        for (int i = 0; i < list.size(); i++){
            T data = list.get(i);
            consumer.accept(data);
        }
    }

    int size(){
        return list.size();
    }
    // ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฉ”๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด๋„๋˜๋Š”๊ฒƒ์ด๊ตฐ,,,,,,

    public MyInterator<T> iterator(){
        return new MyInterator<T>() {
            private int idx = 0;
            @Override
            public boolean hasNext() {
                return idx < list.size();
            }
            @Override
            public T next() {
                return list.get(idx++);
            }
        };
    }
}
// Main.java
package com.programmers.java.collection;

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
//        MyCollection<String> c1 = new MyCollection<>(Arrays.asList("11","2222","3","444","5"));
//        c1.foreach(str -> System.out.println(str));
//
//        MyCollection<Integer> c2 = c1.map(str ->str.length());
//        c2.foreach(str -> System.out.println(str));

        /////////////////////////////////////////
        // ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹ ๋ฐฉ์‹
        int s = new MyCollection<>(Arrays.asList("11","2222","3","444","5"))
                .map(str ->str.length())
                .filter(i ->i%2 == 1)
                .size();
        System.out.println(s);
                //.foreach(str -> System.out.println(str));
    }
}

⇒ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋”๋ผ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก.

⇒ Mycollection class์˜ ๋‚ด์šฉ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์žฌํ™œ์šฉ ๊ฐ€๋Šฅ!!

 

 


Collection์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• ๐Ÿ‘‡

 

2. Iterator

์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ์˜ ๋ฌถ์Œ์„ ํ’€์–ด์„œ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ๊ณต

  • next()๋ฅผ ํ†ตํ•ด์„œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์—†๋‹ค.)
public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A","CC","BF","DFD");
        Iterator<String> iter = list.iterator();

        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }
}

๋ฐ์ดํ„ฐ ํ•œ๊ฑดํ•œ๊ฑด์— ๋Œ€ํ•œ ๋”๋ฏธ ์ฒ˜๋ฆฌ๋Š” ํ•  ์ˆ˜ ์—†๋‹ค.

 

3. Stream

๋ฐ์ดํ„ฐ์˜ ์—ฐ์†์ด๋‹ค. ๋Š์–ด์ง€์ง€์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„

  • System.in / System.out
  • Collections.stream() ์ œ๊ณต (java 8 ์ด์ƒ)
  • filter, map, forEach ๊ฐ™์€ ๊ณ ์ฐจํ•จ์ˆ˜(ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜)๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
public class Main {
    public static void main(String[] args) {
        Arrays.asList("SD","AA","GFE","WQW","q")
                .stream()
                .map(s -> s.length())
                .filter(i -> i % 2 == 1)
                .forEach(i -> System.out.println(i));
    }
}

 

  •  list์˜ Stream (ํ˜•๋ณ€ํ™˜)
Arrays.asList(1,2,3).stream();

// IntStream : primitive ํƒ€์ž…์„ ์œ„ํ•œ stream ํƒ€์ž…
IntStream s = Arrays.stream( new int [] {1,2,3});

Stream<Integer> ss = Arrays.stream( new int [] {1,2,3}).boxed();
// List<Integer> l = ss.collect(Collectors.toList());
ss.toArray(Integer[] :: new); // type์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด Object

 

๋”๋ณด๊ธฐ

Array(๋ฐฐ์—ด)์™€ List(๋ฆฌ์ŠคํŠธ์˜ ์ฐจ์ด)

๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ(String[] str)์ด๊ณ , ๋ฆฌ์ŠคํŠธ๋Š” ์ธ๋ฑ์Šค ์—†์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ(ArrayList<> str)๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ ํฌ๊ธฐ๋ฅผ ๊ผญ ํ• ๋‹นํ•ด์ค˜์•ผํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์— ์—ฐ์†์ ์œผ๋กœ ํ• ๋‹น๋œ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ Linked List์ด๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถ„์‚ฐ ๋˜์–ด ์ €์žฅ๋œ๋‹ค. 

 

  • Stream์€ Stream.generate ์™€ Stream.iterate๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
Stream.generate(()-> 1)
                .limit(10)
                .forEach(System.out::println);

Stream.iterate(0,(i) -> i+1)
                .limit(10)
                .forEach(System.out::println); //seed ๊ฐ’๋ถ€ํ„ฐ

 

  • ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ํ’๋ถ€ํ•œ ๊ณ ์ฐจํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Collection.forEach์™€ Stream.forEach์˜ ์ฐจ์ด.....์ถ”๊ฐ€์˜ˆ์ •

 https://dundung.tistory.com/247


4. Optioal

  • NPE : Null Pointer Exception → ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜๋Š” ์—๋Ÿฌ์ค‘ ํ•˜๋‚˜
    • ์ž๋ฐ”์—์„œ๋Š” (๊ฑฐ์˜) ๋ชจ๋“  ๊ฒƒ์ด ๋ ˆํผ๋Ÿฐ์Šค ⇒ (๊ฑฐ์˜) ๋ชจ๋“ ๊ฒƒ์ด null์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
    ⇒ ํ•ญ์ƒ null์„ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ด์ œ๋ถ€ํ„ฐ null์„ ์“ฐ์ง€๋ง์ž → ์•ฝ์† : ๊ณ„์•ฝ์„ ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค.
  1. EMPTY ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ž.
// User.java
public class User {
    public static User EMPTY = new User(0,"");
    private int age;
    private String name;
}

// Main.java
public class Main {
    public static void main(String[] args) {
        User user = User.EMPTY;
				if (user != User.EMPTY){ ...
				}
    }
}

 

 2. Optional์„ ์‚ฌ์šฉํ•œ๋‹ค.

public static void main(String[] args) {
        // ๊ฐ’์ด ์—†์„๋•Œ
        Optional<User> optionalUser = Optional.empty();

        // ๊ฐ’์ด ์žˆ์„๋•Œ
        optionalUser = Optional.of(new User(5,"kim"));

        optionalUser.isEmpty(); // ๊ฐ’์ด ์—†์œผ๋ฉด(==null) ture
        optionalUser.isPresent(); // ๊ฐ’์ด ์žˆ์œผ๋ฉด ture

				optionalUser.ifPresent(user -> {});
        optionalUser.ifPresentOrElse(user -> {}, () ->{});
    }

 

๋Œ“๊ธ€