본문 바로가기
IT /1) 자바

자바독학) Collection FrameWork-Set,Get

by 세세tv 2019. 10. 28.

프로젝트명 : G9_Set

패키지명 : set

클래스명 : B1_Set

 

Set 배워보겠습니다. 

 

 

Collection FrameWork라는 리스트 형식의 데이터들을

보관하는 장소가 있습니다.

 

리스트 형식은.... 가볍게 배열?이라고 생각하시면 되겠는데

추후에 배울 예정이니 일단은 배열 같은 거!

 

배열과 같지는 않은데... 유사하다고 해야 하나..?

 

Set은 Java.Util패키지에 존재하는 인터페이스입니다.

특정 코드에서 중복된 값을 허용하지 않을 때 사용합니다.

 

Set에는 대표적으로 HashSet, TreeSet이 있습니다. 

 

 

HashSet을 자동완성을 사용하여 만들어보면

 

HashSet<E> hs = new HashSet<E>();

이러한 모양이 나옵니다.

물론 hs는 제가 지은 이름입니다!

 

여기서 <E>는 제너릭 타입이라고 합니다.

E가 아닌 G나 다른 알파벳이 들어갈 수도 있으며

꼭 E가 나오는 것은 아닙니다

 

 

제너릭 타입은 하나의 클래스가 여러 가지 타입에

대응 가능하도록 하는 객체화 기법입니다.

제너릭 타입은 반드시 클래스 형태로 기입합니다.

 

저는 int타입을 사용할 거니 Integer을 사용하겠습니다

new Hashset<>에서는 꼭 작성하지 않으셔도 됩니다.

 

 

저희 저번에 만들어봤던 로또 한번 Set으로 만들어보겠습니다.

while문에서 int r을 생성하고 1~45의 랜덤 숫자를 넣어주겠습니다.

 

hs.add(r);

HashSet의 경우.add()를 통해 값을 추가합니다.

 

if(hs.size() >= 6){ break; }

HashSet의 경우. size()를 통해 방의 크기를 측정합니다.

.length();가 아닌 .size();입니다.

 

방이 6개가 되면 종료하겠습니다.

hs를 출력해보겠습니다

 

[2, 3, 7, 8, 41, 26]

이렇게 겹치지 않는 수가 자동으로 들어가며

arr[]과 같은 배열의 경우

 

arr을 출력하면 [I@..와같은 주소가 나왔지만

Set의 경우 배열 전체가 출력됩니다.

 

랜덤 숫자를 (6)으로 넣으셔서 확인해보시면

겹치지 않는 숫자를 자동으로 인식하여 저장합니다.

 

 

 

아래쪽에

 

TreeSet 보겠습니다

HashSet의 코드를 그대로 복사하여

 

TreeSet<Integer> ts = new TreeSet<Integer>();

이번에는 뒤쪽 꺽쇠 괄호 <>에도 제너릭 타입을 넣어봤습니다.

 

ts.add(i);

 

이것만 변경하고 그대로 출력해 봤습니다.

HashSet과 TreeSet의 차이가 보이시나요?

 

[2, 37, 24, 8, 9, 28]

[4, 8, 21, 23, 31, 41]

 

오름차순 정렬이 되어있는 것이 TreeSet입니다.

 

 

HashSet에도 일부분 업데이트가 가능하여 가능하긴 합니다.

1~6까지 출력하게 바꿔보면 순서대로 출력이 됩니다.

 

숫자의 크기와 방의 개수에 따라 오름차순이 되는 것 같은데

그 기준을 정확히는 모르겠으나

 

오름차순을 사용하기 위해서는 TreeSet을 쓰는 것이 좋습니다.

 

Set의 단점은 인덱스를 출력할 수 없고,

배열 전체를 출력하셔야 합니다.

 

 

클래스명 : B2_Set

 

클래스 하나 더 생성하여 로또는 짧게 만들어보겠습니다.

추가로 특정 인덱스만 추출해보기도 하죠!

 

HashSet을 사용하겠습니다.

제너릭 타입은 Integer 넣어주었습니다.

 

while문 생성하여 hs.size() < 6

hs.add(new Random().nextInt(45)+1)

랜덤 숫자 넣어서

출력하겠습니다.

 

저번에 만들었던 로또 코드 정말 길고 복잡했는데

Set을 이용하여 만드니 간단하게 4줄이면 충분합니다.

 

 

Set은 인덱스를 사용할 수 없다고 말씀드렸습니다.

하지만! 다른 기능을 추가하여 만들어볼까요?

 

int[] arr = new int[hs.size()];

int형 배열을 hs의 크기만큼 만들겠습니다.

0~5까지 6개의 방이 만들어지겠죠?

 

 

Iterator<Integer> it = hs.iterator();

 

Iterator은 반복자입니다.

생성하여 hs를 iterarot(); 시켜주었습니다.

 

아래에서 확인해보겠습니다.

 

 

for문을 생성하여 arr.length까지 반복하며

arr[i]에 it.next()값을 넣어보겠습니다.

 

출력해보니

좌측에서 순서대로 배열에 값이 저장되었습니다.

 

직접적으로 뽑아서 사용은 불가능하지만!

이렇게 이동하여 추출하는 방법은 있습니다.

 

 

프로젝트명을 변경했습니다..

프로젝트명 : G9_Set → G9_Set_Map

패키지명 : map

클래스명 : Map

 

생성해주겠습니다.

 

 

Map은 키(Key)와 값(Value)을 묶어서 저장합니다. 

키를 통해서 값을 검색하는 게 포인트입니다!

 

많은 양의 데이터를 검색할 때!

switch처럼 한 번에 딱 찾아서 들어갑니다.

 

여러 번 시행착오 없이 키값만 확인하여 들어가기에

속도가 빠릅니다.

 

특징은 세 가지입니다.

1. 키 값은 중복될 수 없다. (중복되면 갱신된다!)

2. index가 없다!

3. 컬렉션 객체 중(set, map, list) 유일하게 put();으로 값을 추가한다.

 

 

HashMap보겠습니다

제너릭 타입은 key와 value로 나누어집니다.

 

어떻게 넣어야 할까요?

 

 

Key값을 Character으로 넣어주었습니다

Value값을 String형태로 넣어주었습니다.

 

제너릭 타입은 꼭 클래스형으로 주겠습니다.

 

map은 put로 추가한다고 말씀드렸습니다

 

map.put(key, value);

위와 같은 형식입니다.

 

map.put('B', "Blog");

map.put('J, "Java");

map.put('K', "Value");

위와 같이 넣어주었습니다.

 

키는 Character, 값은 String 맞춰서 넣어주셔야 합니다.

siz를 출력해보니 3개입니다.

 

잘 나오죠?

 

 

String str = map.get('K')

 

str에 map의 'K'를 저장한 후!

str을 출력하면 K의 값인 Value가 출력됩니다.

 

map.get('B')에서 map의 키(B)를 가져오면

값(Blog)을 출력하는 형태입니다.

 

 

put()을 사용하여 더 추가해보겠습니다.

 

map.put('L', "Love");

map.put('K', "Kpop");

 

K는 이미 Value라는 값을 가지고 있죠?

한번 사이즈와 K의 값을 출력해보겠습니다

 

사이즈는 3에서 4로 Love만 추가된 상태입니다.

K, Value는 Kpop로 갱신되었습니다.

 

K를 출력하면 Kpop가 출력됩니다.

 

 

추가 내용입니다.

 

containsKey를 사용하여 해당 키의

존재 여부를 확인할 수 있습니다.

 

containsValue를 사용하여 해당 값의

존재 여부를 확인할 수 있습니다.

 

사용법은 간단합니다.

map.containsKey('L') = L이라는 키가 존재하는지 확인

map.containsValue("Blog") = Blog라는 값이 존재하는지 확인

 

if문으로 확인하였습니다!

 

 

삭제입니다.

 

삭제는 remove입니다.

map.remove('J');

map에서 키가 J인 키와 값을 삭제합니다.

if문과 cotainsKey로 확인해보니 삭제되었습니다!

 

크기도 4에서 3으로 줄어들었습니다.

 

 

클래스명 : Map2

 

문제 풀어보겠습니다.

 

위와 같이 HashMap 생성해주겠습니다.

키는 String으로, 값은 Integer로 받아 id, pw를 만들겠습니다.

 

map.put("sese", 1111);

map.put("seju", 2222);

map.put("sehyang", 3333);

 

로그인 성공 시 반복문을 탈출하며

아이디 존재 여부, 비밀번호 일치 여부를

확인해주는 코드를 만들어주시면 됩니다.

 

 

우선 무한반복 while문 생성했습니다.

아이디와 비밀번호를 스캐너를 통해 입력받겠습니다.

 

if문 생성하여 map.cotainsKey(id)를 통해 id존재 여부 확인합니다.

else에는 id가 존재하지 않다는 내용이 있습니다.

 

if문에서 id가 존재한다면

내부 if문 생성하겠습니다 map.get(id) == pw

일치하면 로그인이 되며 break;를 통해 반복문을 탈출합니다.

 

일치하지 않다면 비밀번호가 틀린 거겠죠?

 

이렇게 Set, Get 보셨으며 다음 포스팅은

무제한 배열인 ArrayList를 보겠습니다.

댓글