본문 바로가기
Archive/Java 풀스택 아카데미

[TIL] 5. 8월 JAVA(SET)

by Lseing 2025. 8. 9.
현대이지웰 자바 풀스택과정을 들으면서 배웠던 것들과 배우면서 들었던
나의 생각과 부족했던 점들을 돌아보면서
정리해보려고한다 이렇게 기록함으로써 좀 더 나은 개발자의 모습이 되었으면 희망한다.

 

🧐Set 이란??

Set은 최상위인 Collection 프레임워크에 속하는 인터페이스 중 하나다.

Set의 특징은 중복되는 값은 허용하지 않는 점이다, 그래서 동일한 요소를 추가하려고하면 무시되고 추가되지 않는다.

중요‼️
참고로 Set 자체는 인터페이스이기 때문에 직접 객체를 생성할 수 없으므로 반드시 구현 객체를 사용해야한다. 구현 객체에는 HashSet, LinkedHashSet, TreeSet이 존재한다.

🔍예시

코드를 통해 확인해보자

중복된 값을 포함한 4개의 값을 set에 넣어보았다.

결과를 출력해보았을 때 중복된 값은 무시가 된 결과를 확인해 볼 수 있다.

 

그리고 Set은 추가된 값의 순서를 보장하지 않는다는 특징이 있다.

마찬가지로 코드를 통해 확인해보자

보다시피 값을 넣은 순서대로 출력이 되지않는다

✅HashSet

위의 이미지에서 보았듯이 Set 인터페이스의 구현체 중 하나인 HashSet을 사용했는데 해시자료구조를 사용해서 요소를 저장한다는 특징있다, 이 때문에 넣은 순서와 관계없이 다른 순서로 출력이 되는것이다(순서를 보장하지 않기 때문).

HashSet은 순서가 중요하지 않고, 데이터의 존재만 중요한 경우에 적합하다.

➕더 알아보기

그렇다면 어떻게 HashSet은 값이 들어올 때 어떤 기준을 가지고 해당 값이 중복인지 판단할 수 있을까?

add를 할 때 단순히 값을 집어넣는게 아니라 안쪽에서는 복잡한 과정을 통해서 중복 여부를 판단한다

그 중에서 주목할 부분은 hashCode()equals() 이다, hashCode()로 해시값을 비교하고 만약 해시값이 같다면 equals()로 서로 같은 객체인지 확인하면서 중복여부를 판단한다

hashCode()와 equals()는 오버라이딩을 통해 본인이 판단 조건을 재정의 할 수 있다.

🔍예시

코드를 통해 알아보자

일단 hashCode()와 equals()를 오버라이딩 한 클래스와 그렇지 않은 클래스가 존재한다

오버라이드를 하지 않은 Member 클래스
오버라이딩 한 Member2 클래스(Member 클래스와 필드값이 동일하기 때문에 해당 부분만 게시)

 

두 클래스를 이용해 각각 객체를 생성하고 값을 삽입할 때 어떤 일이 일어나는지 확인해보자

Member와 Member2의 타입을 가지는 Set 인스턴스를 생성했다

📋결과

Member 클래스: 오버라이딩을 하지 않은 기본적인 hashCode()는 참조값을 기반으로 해시값을 만든다,

그래서 비교 시 필드 값은 동일 하지만 참조 값이 다르기 때문에 다르다고 판단하여 add가 정상적으로 동작한다.

반면 Member2 클래스는 오버라이딩을 했기 때문에 비교 기준이 다르다

위의 이미지를 보면 알 수 있듯이 hashCode()를 오버라이딩 하여 name과 age 값으로 해시값을 만들고

equals를 오버라이딩 하여 name과 age 값이 일치한다면 true 값을 리턴한다, 그래서 삽입 하려는 값이 일치하다고 판단하여(equals 기준이 다르기 때문) set1 객체에는 값이 하나만 들어간다.

😎참고

hashCode(), equals()를 오버라이딩 해서 사용하는 것은 객체의 메모리 주소가 아니라,

필드값으로 같은지 비교해야하는 상황에 사용하기 유용하다, 사용자 정보같이 고유한 값을 저장할 때는 userId 같은 고유값을 기준으로 값을 저장해야 하는데 userId가 같지만 참조값이 다르다는 이유로 중복저장이 되어버리면 문제가 발생할 수 있기 때문에 오버라이딩을 통해 기준을 조정하여서 이런 문제를 막을 수 있다.

 

 

그렇다면 순서가 보장된 Set이 필요하다면??
이때는 LinkedHashSet 구현체를 사용하면 된다.
LinkedHashSet은 HashSet에 연결 리스트를 추가해서 요소들의 순서를 유지한다.