Day 19(21.10.01) - Gomserker/Java-101 GitHub Wiki

26.Collection Framework

(1) Framework์™€ Library์˜ ์ฐจ์ด

  • Framework : ์†Œํ”„ํŠธ์›จ์–ด์˜ ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒํ˜ธ ํ˜‘๋ ฅํ•˜๋Š” ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ
  • Library : ๋‹จ์ˆœ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋“ค์˜ ์ง‘ํ•ฉ
    ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ๊ฒฐ๊ตญ ๋ˆ„๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. Framework๋Š” ์ž์ฒด์ ์œผ๋กœ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์•ˆ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ๋ฐ˜๋ฉด, Library๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋ฉฐ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด

์šฐ๋ฆฌ๋Š” Library์—๊ฒŒ ๋ฌด์—‡์„ ํ•ด์•ผํ• ์ง€ ์•Œ๋ ค์ฃผ๊ณ , Framework๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ํ•ด์•ผํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

(2) Collection Interface - List

List๋Š” ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๋Š” ์›์†Œ๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ์ค‘๋ณต๋œ ์›์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋ฐฐ์—ด๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ„์น˜(์ธ๋ฑ์Šค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›์†Œ์— ์ ‘๊ทผํ•œ๋‹ค.
๋ณธ ๋ฌธ์„œ์—์„œ๋Š” ArrayList ํ•˜๋‚˜๋งŒ์„ ๋‹ค๋ฃฌ๋‹ค. LinkedList์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ถ”ํ›„ ๊ธฐ์žฌํ•  ์˜ˆ์ •์ด๋‹ค.

ArrayList

ArrayList๋Š” ์›์†Œ๋“ค์„ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋ถ€๋ถ„์—์„œ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์™œ ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ๊ทธ๊ฒƒ์€, ๋ฐฐ์—ด์˜ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ์ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐฐ์—ด์€ ์ƒ์„ฑํ• ๋•Œ ๊ทธ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ถ”๊ฐ€๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ์กด์˜ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ดˆ๊ณผ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ์ฒ˜์Œ์— ๋ฐฐ์—ด์„ ์ƒ์„ฑํ• ๋•Œ ๊ทธ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ์ƒ๋‹นํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ArrayList๋Š” ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐฏ์ˆ˜์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

ArrayList์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ

ArrayList๋Š” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋กœ ์ œ๊ณต๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ArrayList๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €์žฅํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์ด ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑํ•œ๋‹ค.

ArrayList<String> list = new ArrayList<String>();

์ƒ์„ฑ๋œ ArrayList ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด 'add()' ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์„œ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

list.add("Milk");
list.add("Bread");
list.add("Butter");
list.add(0, "Heavy Cream"); -> ๋ณ„๋„์˜ ๋ช…๋ น์–ด๊ฐ€ ์—†์ด๋„ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ž๋ฃŒ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ •ํ•œ ์œ„์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด 'set()' ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

list.set(3, "Ginger"); -> 3๋ฒˆ ์ธ๋ฑ์Šค์— Ginger ์ถ”๊ฐ€, ArrayList์˜ ํฌ๊ธฐ๋Š” ๊ฐ€๋ณ€์ ์ด๋ฏ€๋กœ ์ถ”๊ฐ€ํ•ด์„œ ๊ณ„์† ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด 'remove()' ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

list.remove(1);
import java.util.ArrayList;

public class ArrayListTest {

    public static void main(String args[]) {
        ArrayList<String> list = new ArrayList<String>();
        
        list.add("Milk");
        list.add("Bread");
        list.add("Butter");
        list.add(3, "Ginger"); //3๋ฒˆ ์ธ๋ฑ์Šค์— Ginger ์ถ”๊ฐ€, ArrayList์˜ ํฌ๊ธฐ๋Š” ๊ฐ€๋ณ€์ ์ด๋ฏ€๋กœ ์ถ”๊ฐ€ํ•ด์„œ ๊ณ„์† ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
        list.set(0, "Heavy Cream"); //๋ณ„๋„์˜ ๋ช…๋ น์–ด๊ฐ€ ์—†์ด๋„ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ž๋ฃŒ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
        list.remove(1);// 1๋ฒˆ ์ธ๋ฑ์Šค์˜ ์ž๋ฃŒ ์‚ญ์ œ. ์‚ญ์ œ๋œ ์ž๋ฃŒ๋Š” ๊ณต๋ž€์œผ๋กœ ๋‚จ์ง€์•Š๊ณ  ๋’ค์— ์žˆ๋˜ ์ž๋ฃŒ๋“ค์ด ํ•œ ์นธ์”ฉ ๋‹น๊ฒจ์ง€๋Š” ๊ตฌ์กฐ๋‹ค. LinkedList์™€์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ .
        
        for(int i=0; i<list.size();i++) {
            System.out.println(list.get(i));
        }
        
        //for-each ๊ตฌ๋ฌธ์„ ํ™œ์šฉํ•ด list ๊ฐ์ฒด์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
        System.out.println("--------------");
        for(String s : list) {
            System.out.println(s);
        }
    }
}

Result

Heavy Cream
Butter
Ginger
--------------
Heavy Cream
Butter
Ginger

ArrayList์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด for-each ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

(3) Collection Interface - Set

List๋Š” ์›์†Œ ๊ฐ„์˜ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ Set(์ง‘ํ•ฉ)์ด๋‹ค. ๋•Œ๋ฌธ์— ์ง‘ํ•ฉ์˜ ํŠน์„ฑ์ƒ Set์€ ์ค‘๋ณต๋œ ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์ž๋ฐ”์—์„œ๋Š” Set Interface์— ๋Œ€ํ•ด HashSet, TreeSet, LinkedHashSet. ์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ์ด ์ค‘์—์„œ๋„ HashSet์€ Hash Table์— ์ž๋ฃŒ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋›ฐ์–ด๋‚˜๋‹ค. ํ•˜์ง€๋งŒ, ์›์†Œ๋“ค์˜ ์ˆœ์„œ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ณธ ๋ฌธ์„œ์—์„œ๋Š” ๋จผ์ € ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด HashSet์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

import java.util.HashSet;

public class HashSetTest {

    public static void main(String[] args) {
        
        HashSet<String> set = new HashSet<String>();
        
        set.add("Milk");
        set.add("Butter");
        set.add("Cheese");
        set.add("Butter");
        set.add("Ham");
        set.add("Ham");
        
        for (String s:set) {
            System.out.println(s);
        }
    }
}

Result

Ham
Butter
Cheese
Milk

๋ฉ”์†Œ๋“œ๋Š” Collection ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๊ฐ–๊ณ  ์žˆ๊ธฐ์— ๋™์ผํ•˜๋‹ค. ๋‹ค๋งŒ, Set์˜ ํŠน์ง•์ƒ ์ค‘๋ณต๋œ ์ž๋ฃŒ๋Š” ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ์— "Ham"๊ณผ "Butter"๊ฐ€ ์ค‘๋ณต์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ