Post

[Day13] Collections

[Day13] Collections

html과 spring을 어떻게 연결하는 과제인지 잘 이해가 안가서 일단 부족한 부분을 수정했다. 로그인, 회원가입 모달창을 넣었고, 반응형으로 수정했다.

https://raccoon-shop.netlify.app/


Collections

예시를 먼저 보고 정리를 해보려 한다.

ArrayList & HashSet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Test {
    public static void main(String[] args) {
        // ArrayList 예시
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");
        list.add("Apple"); // ❗️ 중복 허용
        System.out.println(list.size());  // 4
        System.out.println(list);         // [Apple, Banana, Orange, Apple]

        // HashSet 예시 (중복 제거)
        HashSet<Object> set = new HashSet<>();
        String s1 = new String("Apple");
        set.add(s1);
        set.add("Banana");
        set.add("Orange");
        String s2 = new String("Apple");
        set.add(s2); // ❗️ "Apple"은 중복이라 추가되지 않음
        set.add(new Object());
        set.add(new Object()); // ⭐️ Object는 항상 새로운 주소값을 가지므로 중복 X

        // 사용자 정의 객체 `Member`
        Member m1 = new Member("이예은", 26);
        Member m2 = new Member("이예은", 26); // member에서 재정의 해둠

        set.add(m1);
        set.add(m2); // ❗️ 중복으로 추가되지 않음.

        System.out.println(set.size()); //  6 (중복된 "Apple" 제거, Object 2개, Member 1개)
        System.out.println(set);

        System.out.println(m1.hashCode());
        System.out.println(m2.hashCode()); // 같은 값
    }
}

❓❓ 사용자 객체랑 new Object는 중복이 추가 되고, new string은 안되는 이유
new Object()는 중복 추가 가능 -> Object는 기본적으로 hashCode()가 다름
new String(“Apple”)은 중복 추가 안됨 -> String의 equals()와 hashCode()가 문자열 값으로 비교되기 때문

POINT

  • ArrayList는 순서를 유지하며 중복을 허용한다.
  • HashSet은 중복을 허용하지 않고, 순서를 보장하지 않음.
  • new Object()는 항상 새로운 주소값을 가지므로 중복 제거되지 않음.
  • Member 객체가 중복으로 인식되지 않으려면 hashCode()와 equals()를 재정의해야 함.

Member 클래스 (Comparable 구현 & hashCode(), equals() 재정의)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Member implements Comparable<Member> {
    private String name;
    private int age;    

    public Member(String name, int age) {
        setName(name);
        setAge(age);
    }

    public String getName() { return name; }
    public void setName(String name) {
        if (name != null) {
            this.name = name;
        } else {
            System.out.println("null은 불가");
        }
    }

    public int getAge() { return age; }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member [name=" + name + ", age=" + age + "]";
    }

    // ✅ 정렬 기준 정의 (나이 오름차순 → 이름 오름차순)
    @Override
    public int compareTo(Member o) {
        if (this.age != o.getAge()) {
            return this.age - o.getAge(); 
        }
        return this.name.compareTo(o.getName());
    }

    // ✅ HashSet에서 중복 제거를 위해 `hashCode()`와 `equals()` 재정의
    @Override
    public int hashCode() {
        return name.hashCode() + age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Member)) return false;
        Member other = (Member) obj;
        return this.name.equals(other.name) && this.age == other.age;
    }
}

POINT

  • compareTo()를 구현하여 나이 오름차순 → 이름 오름차순으로 정렬.
  • hashCode()와 equals()를 재정의하여 중복 제거 가능하게 함.

compareTo() 메서드란?

compareTo()는 두 객체를 비교하는 메서드로, 비교 결과에 따라 다음 값을 반환

  • 0: 두 객체가 같다고 판단.
  • 양수: 현재 객체가 o 객체보다 크다고 판단.
  • 음수: 현재 객체가 o 객체보다 작다고 판단.
1
2
3
4
5
6
// compareTo() 메서드 정의
@Override
public int compareTo(Member o) {
    // 나이가 적은 사람을 먼저 오게 정렬
    return Integer.compare(this.age, o.age);
}

ArrayList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<Member> list = new ArrayList<>();

        Member m1 = new Member("이예은", 26);
        Member m2 = new Member("홍길동", 20);
        Member m3 = new Member("이영애", 45);

        list.add(m1);
        list.add(m2);
        list.add(m3);

        System.out.println(list.size()); // 3
        System.out.println(list);        
// [Member [name=이예은, age=26], Member [name=홍길동, age=20], Member [name=이영애, age=45]]
        Collections.sort(list); // 정렬 (compareTo() 기준)
        System.out.println(list);        
// [Member [name=홍길동, age=20], Member [name=이예은, age=26], Member [name=이영애, age=45]]
    }
}

POINT

  • Collections.sort(list);를 사용하여 compareTo() 기준으로 정렬 가능.

LinkedList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList<Member> list = new LinkedList<>();

        list.add(new Member("이예은", 26));
        list.add(new Member("홍길동", 20));
        list.add(new Member("이영애", 45));

        System.out.println(list.size()); // 3
        System.out.println(list);
// [Member [name=이예은, age=26], Member [name=홍길동, age=20], Member [name=이영애, age=45]]

        Collections.sort(list); 
        System.out.println(list);
// [Member [name=홍길동, age=20], Member [name=이예은, age=26], Member [name=이영애, age=45]]
    }
}

POINT

  • LinkedList도 ArrayList와 동일하게 정렬

HashSet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package collections;
import java.util.*;

public class HashSetTest {
    public static void main(String[] args) {
        HashSet<Member> set = new HashSet<>();

        set.add(new Member("전은수", 38));
        set.add(new Member("이예은", 26));
        set.add(new Member("홍길동", 30));
        set.add(new Member("이예은", 26)); // ❌ 중복 제거됨

        System.out.println(set.size());
        System.out.println(set); 
// [Member [name=이예은, age=26], Member [name=전은수, age=38], Member [name=홍길동, age=30]]

        // `HashSet`을 정렬하려면 `ArrayList`로 변환 후 정렬
        List<Member> list = new ArrayList<>(set);
        Collections.sort(list);
        System.out.println(list);
// [Member [name=이예은, age=26], Member [name=홍길동, age=30], Member [name=전은수, age=38]]
    }
}

POINT

  • HashSet은 정렬되지 않음 → ArrayList로 변환 후 정렬해야 함.

TreeSet (자동 정렬)

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<Member> set = new TreeSet<>();

        set.add(new Member("이예은", 26));
        set.add(new Member("홍길동", 20));
        set.add(new Member("이영애", 45));
        set.add(new Member("이예은", 26)); // ❌ 중복 제거됨

        System.out.println(set.size());
        System.out.println(set); // 자동 정렬됨
    }
}

POINT

  • TreeSet은 추가될 때 자동 정렬됨 (compareTo() 기준).

HashMap (Key-Value 저장)

1
2
3
4
5
6
7
8
9
10
11
12
13
public class HashMapTest {
    public static void main(String[] args) {
        Map<String, Member> map = new HashMap<>();

        map.put("이예은", new Member("이예은", 38));
        map.put("홍길동", new Member("홍길동", 20));
        map.put("이영애", new Member("이영애", 45));
        map.put("이예은", new Member("이예은", 28)); // 기존 값 덮어쓰기

        System.out.println(map.size()); // 3
        System.out.println(map);
    }
}

point

  • HashMap은 Key 중복 불가 → 기존 값 덮어쓰기.

✅ 실무에서는 set보단 list를 많이씀 -> 정렬도 되기 때문

SUMMARY

collection특징중복 허용정렬 지원
ArrayList순서 유지, 빠른 조회✅ O❌ (정렬 필요)
LinkedList빠른 삽입/삭제✅ O❌ (정렬 필요)
HashSet중복 제거, 빠른 검색❌ X
TreeSet중복 제거, 자동 정렬❌ X✅ (자동 정렬)
HashMapKey-Value 저장, 빠른 검색Key ❌, Value ✅
TreeMapKey-Value 저장, 자동 정렬Key ❌, Value ✅✅ (Key 기준 자동 정렬)
  • List는 순서가 있고 중복을 허용하지만, Set은 중복을 허용하지 않음.
  • HashSet은 중복 제거, TreeSet은 자동 정렬.
  • HashMap은 Key-Value 저장, TreeMap은 Key 기준 자동 정렬.
  • Comparable을 구현하면 정렬 가능, hashCode()와 equals()를 올바르게 구현하면 HashSet에서 중복 제거 가능.

Study

💡 회원가입 클릭 시, 배열에 모든 고객정보 확인가능하게 하기

payload에 찍힌 id, pw 값 (제대로 서버와 통신한 것)

아이디값 중복 허용하지 않는 배열로 찍힌다. -> HashMap 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package come.lye.shop.controller;

import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import come.lye.shop.dto.Member;

@RestController
public class MemberController {
	// ArrayList<Member> list = new ArrayList<>();
	HashMap<String, Member> map = new HashMap<>(); // email 중복 안됨
	
	@PostMapping("insertMember")
	public void insertMember(@RequestBody Member member) {
		System.out.println(member);
		// list.add(member);
		map.put(member.getEmail(),member);
		System.out.println(map);
	}
}

END

This post is licensed under CC BY 4.0 by the author.