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

자바독학) 무제한 배열 ArrayList (Collection FrameWork)

by 세세tv 2019. 10. 30.

 

프로젝트명 : H1_ArrayList

패키지명 : arraylist

클래스명 : B1_ArrayList

 

ArrayList : 배열과 같지만, 크기가 정해져 있지 않은 리스트 구조

이전에 배운 Set, Map 모두 크기가 정해져 있지 않았으며

 

Set의 경우 .add()를 통해,

Map의 경우 .put()을 통해

인덱스를 추가했습니다.

 

ArrayList의 경우 배열을 사용할 때,

즉, 방이 몇 개가 필요할지 모를 경우 사용하겠습니다.

 

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

arraylist 생성해 보겠습니다

 

제너릭 타입을 받아야 하네요!

 

 

빠르게 설명드리겠습니다

 

ArrayList의 경우

방의 크키는 .size()를 통해 확인합니다.

 

아무것도 없는 상태는 0이겠죠?

 

.add()를 통해 방을 추가합니다.

 

0~4번 방에 인덱스와 값을 동일하게 넣어주었습니다.

 

list 자체를 출력하면

[0, 1, 2, 3, 4]

 

위처럼 출력이 한 번에 가능합니다.

for문을 사용하여 전체 출력해보겠습니다.

ArrayList에서 인덱스를 출력하는 방법은

.get(); 으로 소괄호 내부에 인덱스를 입력합니다.

 

인덱스도 사용 가능하며, 전체 출력도 가능한 아주

써먹을 곳이 많은 녀석입니다.

 

 

 

삭제해보겠습니다

 

.remove(index)를 통해 해당 인덱스를 삭제할 수 있습니다.

 

list[1]을 삭제해보겠습니다.

 

list[1]의 값은 삭제되고

앞으로 한 칸씩 당겨지게 됩니다

 

for문을 통해 출력해보면

list[4]가 사라지고 값은 한 칸씩 앞으로 당겨졌습니다.

 

remove로 삭제를 하면 index가 줄어들고

값은 한 칸씩 이동하게 됩니다.

 

 

수정 방법입니다

 

.set(index, 값)을 통해 수정이 가능합니다.

list.set(1, 1);

list.set(2, 2);

list.set(3, 3);

 

수정을 이용하여 인덱스와 값을 다시 맞춰주겠습니다.

 

 

추가 방법입니다.

.add(index, 값)을 통해 해당 인덱스에 추가가 가능합니다.

 

list.add(1 ,8) : 1번 인덱스에 8을 추가

출력해보면

 

값은 한 칸씩 뒤로 이동하고,

list[4]가 생성되었습니다.

 

list[1]에는 8의 값이 잘 들어갔죠?

 

 

전체 삭제 방법입니다

 

.clear()을 통해 전체 삭제가 가능합니다.

 

list.clear();

출력해보면 값이 존재하지 않습니다.

 

방 개수가 확실하게 정해지지 않은 경우 사용합니다.

방 개수가 정해진 경우에는 굳이 사용하실 필요가 없습니다.

 

단점이라고는 크게 없습니다.

중복 값을 체크하지는 않는데...

뭐 중복체크 코드를 만들면 문제없겠죠?

 

size()

add(value)

get(index)

remove(index)

set(index, value)

add(index. value)

clear()

 

7가지 기억하시면 되겠습니다.

 

 

 

contains 보겠습니다.

 

ArrayList를 생성하여 Character타입을 넣어주겠습니다.

 

aList.add('S')

S를 추가하여 넣어주겠습니다.

 

if문 보겠습니다

if(aList.contains('S')){"S는 존재한다"}

S는 존재한다고 출력이 잘 됩니다!

 

반면에! F는 존재한다는 말은 출력이 안 되네요!

 

contains를 통해 ArrayList배열에 존재하는 값을

찾을 수 있습니다.

 

 

기본적인 회원가입 만들어볼까요?

단순하게 추가, 삭제 만들어보겠습니다.

 

추가, 삭제가 잘 되고 있나

ID를 확인하는 코드도 생성하겠습니다.

 

클래스명 : B2_ArrayList

 

스캐너를 생성하겠습니다.

while문은 무한 반복하겠습니다.

1번 = ID 추가

2번 = ID 확인

3번 = ID 삭제

이외의 숫자는 종료하겠습니다.

 

int sel을 통해 스캐너 값을 받겠습니다/.

 

 

if문으로 만들어볼까요?

 

우선 ArrayList 생성하겠습니다

변수명으로 arr을 받아주고, String타입으로 설정하겠습니다

 

sel==1 (ID 추가)

id를 입력받고

arr.add(id);

 

sel==2 (ID 확인)

id를 입력받고

arr.contains(id)를 통해 존재 여부 출력

 

while 하단에 arr을 출력하여 배열에 있는지 확인하겠습니다.

 

1~2번 먼저 실행해보겠습니다.

 

1번(ID 추가)을 통해

park, lee, kim, sese 추가했습니다,

 

2번(ID 확인)을 입력하여

lee를 검색해보니 존재한다고 나옵니다!

 

 

sel==3(ID 삭제)입니다.

id를 입력받고

if문에서 contains를 사용하여

id 존재 여부를 확인합니다.

 

존재하지 않는다면 존재하지 않다고 출력하며

존재한다면!

 

for문에서

arr.get(i).equals(id)

id의 인덱스를 찾아주겠습니다.

 

arr.remove(i);를 통해

해당 인덱스를 삭제하겠습니다.

break;를 통해 for문을 종료해주겠습니다.

 

콘솔을 확인해 보시면 lee가 삭제된 것을

확인할 수 있습니다.

 

 

이왕 할 거 중복체크도 해봅시다!

sel==1으로 이동하겠습니다

 

for문을 생성하여

id.equals(arr.get(i))

 

확인하겠습니다.

중복 값이 없다면 arr.add(id)를 통해 생성되며

 

중복 값이 있다면!

안내문구와 함께

continue out;

레이블을 통해 while시작 지점으로 돌아가겠습니다.

 

 

거의 끝입니다!

 

클래스명 : B3_UserClass

 

private을 사용하여 id와 pw를 생성하겠습니다

 

getters, setters 생성하겠습니다.

 

 

클래스명 : B3_UserMain

 

메인을 생성하여 스캐너와 ArrayList를 생성합니다.

제너릭 타입에는 클래스만 가능하다고 말씀드렸습니다.

 

그래서 wrapper클래스 써서

Integer, Character를 사용했었습니다.

 

제너릭 타입으로

B3_UserClass를 생성할 수 있습니다.

 

회원가입 만들어 볼까요?

 

 

우선 setters, getters를 사용하기 위해

B3_UserClass를 uc로 호출하겠습니다

 

회원가입, 탈퇴, 회원 리스트 확인해보겠습니다

 

이번에는 switch로 만들어 볼까요?

 

 

분홍색 체크 부분입니다

간단하게 id와 pw를 입력하는 구간입니다.

 

uc.setId, uc.setPw를 통해 정보를 저장합니다.

 

빨간 부분입니다. (회원가입)

 

if(arr.size()==0)인 경우!

배열에 아무것도 없으니 그냥 바로 생성합니다.

첫 번째 회원이니 중복체크가 의미가 없죠??

 

else입니다. 파란 체크 부분이 중복체크 구문입니다.

for문을 생성하여 arr.size까지 반복합니다.

 

arr.get(i).getId().contains(id)

arr(index)의 아이디가! 입력한 id와 같은가?

같다면 존재하는 아이디이며!

 

다르다면!

arr.add(uc);를 통해 추가합니다.

 

 

여기서 uc가 이해가 가시나요?

 

ArrayList<B3_UserClass> arr처럼 제너릭 타입으로 uc를 받았습니다.

 

arr의 배열에

ID = 김개똥

PW = 1234

이렇게 하나가 있다고 치면!

 

arr.get(0).getId();

arr.get(0).getPw();

 

위와 같이 사용이 가능합니다.

 

B3_USerClass가 가진 변수, 메서드를 사용할 수 있습니다.

누가? arr의 각 방마다 사용이 가능합니다.

 

문제 풀이하면서 더 보겠습니다.

 

 

case 2번입니다 회원 탈퇴!

 

빨간 부분입니다

단순히 입력을 받습니다.

while초기에 받은 uc에 id와 pw를 저장합니다.

 

파란 부분입니다

for문을 생성하여 arr.size()까지 반복합니다.

 

분홍 부분입니다

if문을 사용하여 id를 확인합니다.

 

초록 부분입니다

pw를 확인합니다.

arr.get(i)의 id와 pw가 일치해야 합니다

일치하다면 remove를 통해 삭제

 

이외의 경우 안내문을 출력합니다.

 

 

 

case : 3입니다.

 

회원수는 arr.size();며

 

for문을 통해 출력해보겠습니다.

 

arr.get(i).getId() + "/" + arr.get(i).getPw()

 

이름 / 비밀번호가 출력됩니다.

 

ArrayList의 인덱스를 출력하는 get과

B3_UserClass에서 가져온 getters를 잘 구분하셔야 합니다.

 

 

클래스를 나눠볼까요??

 

클래스명 : B3_Add_ID

 

public void add라는 메서드를 생성하여

파라미터로 (B3_UserClass uc, Scanner sc, ArrayList<B3_UserClass> arr)

세 개 받아주겠습니다.

 

기존에 만든 add를 복사하여 옮긴 후!

파라미터로 받은 값으로 잘 수정하시면 됩니다.

 

위와 같이 말이죠!

 

 

B3_Add_ID ai = new B3_Add_ID();를 통해 호출합니다

 

case 1 : ai.add(uc, sc, arr) break;

 

간단하게 메서드를 호출하여 기능에 문제없이 만들었습니다.

 

클래스를 나누는 가장 큰 이유는

 

오류를 빨리 잡을 수 있어서입니다.

 

분업의 목적도 있으며 가장 큰 문제로는

오류, 버그 해결이겠죠?

 

 

응용문제 풀고 마무리하겠습니다

 

타자게임입니다.

 

단어를 배열에 저장해두겠습니다.

저는 blog, game, internet, shift로 했습니다.

 

랜덤으로 위의 네 개의 단어 중 한 개가 출력됩니다.

3초마다 랜덤으로 단어가 1개씩 추가됩니다.

 

단어가 쌓이지 않고 모든 단어를 작성하면 게임이 종료됩니다.

 

단순히 3초마다 랜덤으로 단어가 추가되고

모든 단어를 없애면 종료하는 게임입니다.

 

 

private을 사용하여

 

ArrayList<String> arr

String[] data

boolean isPlaying = true

 

세개 만들었습니다.

 

WordGame(ArrayList<String> arr, String[] data)

this.arr = arr;

this.data = data;

생성자를 만들어 파라미터를 옮겨주겠습니다.

 

isPlaying는 setters 생성하겠습니다.

is의 경우 대부분 boolean에 사용되어

setters에는 is는 제외되고 나옵니다

(자동완성의 경우 제외됨. 직접 적어도 문제는 없음)

 

thread를 상속받아

run메서드에서 3초마다 단어를

arr배열에 넣는 코드를 만들겠습니다.

 

랜덤의 크기는 data의 길이만큼 입니다.

data에는 문제가 들어있으며 arr.add(data[ran])을 통해

랜덤으로 단어를 arr배열에 추가하겠습니다.

 

 

 

메인클래스 생성하겠습니다

 

클래스명 : WordMain

 

ArrayList<String> arr을 생성하고

Stirng배열 data에 단어를 넣어주겠습니다.

 

WordGame클래스를 호출하고

파라미터로 생성한 arr과 data를 넘겨주겠습니다.

 

while문을 생성하여

arr.size==0인경우 정답처리를 하겠습니다.

wg.setPlaying를 false로 바꾸어

Thread의 run메서드를 종료하고

break를 통해 while문을 종료합니다.

 

arr을 출력합니다 : 문제를 출력합니다.

스캐너를 통해 답을 입력받습니다.

 

만약! 입력한 값(input)과 문제(arr.get(0))가 같다면!

문제를 삭제(arr.remove(0))

 

자! 만들고 왔는데

실행해보니 바로 클리어예요!

 

당연하겠죠?

시작은 arr.size()=0 무조건입니다.

 

메인이 작동하고

run이 작동하여 그런 문제가 발생한 것입니다.

 

 

메인 메서드에서

Thread.sleep(10)을 통해

메인에서 대기를 걸어주면 run이 먼저 실행하고,

메인이 실행하는 구조가 됩니다.

 

예외처리는 throws를 사용했습니다.

오류 부분에 마우스 올려주시면 있습니다!

 

혹은 try/catch로 묶겠습니다.

 

콘솔을 보면 게임을 확인할 수 있습니다.

 

입력하는 동안 막 단어가 추가됩니다.

댓글