Wanna be Brilliant Full-Stack Developer

자바 컬렉션이란 무엇인가요?! 본문

Some Memos/Java

자바 컬렉션이란 무엇인가요?!

Flashpacker 2023. 3. 18. 00:49


컬렉션은 배열과 굉장히 비슷하다.

컬렉션은 특징이 있다.

컬렉션은 빈공간이 있는데 하나 하나가 4바이트 라고 해보자! 

내가 만약 컬렉션으로 숫자 4개를 담아내고 싶으면 1,2,3,4

배열로 숫자 4개를 넣고 싶다고 하면 두개의 큰특징의 차이가 무엇인가하면?

만약에 기존의 데이터가 들어가 있다고 보자!

 

위에는 컬렉션 밑에는 배열을 넣어보자!

컬렉션을 넣을떄는 빈공간에 편안하게 집어넣어버린다.

근데 배열은 연속된 4가지 공간이 필요하기 떄문에 연속된 4가지 공간이 지금 없다.

 

배열을 넣을떄는 내가 연속된 4가지 공간이 있으면 넣을 수 있다.

그러면 차이점은 무엇인가?

컬렉션같은 경우에는 데이터 추가가 가능하다.

근데 배열은 불가능하다. 왜 안되는가? 배열은 연속된 공간이 필요하기 떄문이다.

 

컬렉션은 6을 추가할 수 있지만 배열은 6을 못만든다. 

그 뒤에 공간이 없기 때문이다. 애초에 배열은 추가 자체를 금지를 해놓았다.

컬렉션은 추가가 가능하다. 그래서 데이터를 추가할 수 있다는 장점이 있다.

동적으로 데이터가 나중에 추가 될수 있다.

근데 배열은 한번 정하면 더이상 데이터가 추가 되거나 할 수 없어서 정적이다.

 

이해를 이렇게 하면 된다.

1학년 3반이 있다고 해보자! 그 3반에 교실이 있고 그 교실에 책상을 8개를 만들었고 

신입학생들을 모집할껀데 총 6명이 왔다. 

전학생을 최대 2명까지 받을 수는 있다. 공간이 있으니까

이말이 무슨말인가 1학년 3반의 배열의 크기가 8개라는 것이다.

이게 평소에는 6자리만 사용했으니까 두자리가 낭비가 된다. 이게 어쩔 수가 없다.

그러다가 전학생이 오면 낭비가 되진 않으니까 8명이 꽉차면 낭비가 안되겠지만

배열을 8자리 공간을 만들어두면 단점이 공간 낭비가 있다는 것이다.

다른 1학년 4반은 배열을 안쓰고 컬렉션을 쓴다고 하면? 

1학년 4반은 애초에 어차피 6명밖에 없으니까 6자리만 만들어 놓는다. 

그러다가 전학생이 들어오면 전학생 G가 들어오면 그떄 그 공간에 책상을 만들어 낸다

 

그래서 배열은 정적이라는 것이고 컬렉션은 동적이라는 것이다

6자리만 확보 해놓았다가 전학생이 오면 책상을 만들어 낼 수 있다는 것이다.

 

그러면 컬렉션이 훨씬더 좋아보이는데? 실제로는 이 데이터를 보면 

데이터가 띄엄 띄엄 있기 떄문에 데이터를 찾아갈떄 점프를 해야해서 읽는 것이 굉장히 느리다.

컬렉션은 데이터를 넣을떄는 좋지만 읽을떄가 안좋다

 배열은 데이터를 넣을떄 안좋고 낭비가 생기지만 읽을때는 굉장히 좋다!

 

컬렉션(Collection)은 수집하다라는 뜻을 가지고 있다.

수집할때 멀 수집할지 아직 모르니까 수집안에 컬렉션 ArrayList<E>를 배울것이다.

 

제네릭으로 만들어져있다. 너 멀 수집할래? 라고 만들어져있다.

그러면 숫자를 수집할꺼면 int라고 

근데 여기서 오류가 난다. 왜냐하면 int는 기본 자료형이기 떄문이다.

기본 자료형은 값을 가지고 있다.

String이나 커스텀 자료형들은 reference자료형이기 떄문에 애네들은 값을 들고 있는것이 아니라

주소를 가지고 있다.

ArrayList 제네릭 공간에 들어올수있는것은 double , boolean , char은 못들어온다.

이 공간에는 커스텀 은 들어올 수 있따,

 

자바에서는 기본자료형들이 제네릭에 안들어가서 기본 자료형에 대한 래핑클래스라는것을 만들어 놨다.

int를 감싸고 있는 클래스를 하나 만들었다.

Int는 Integer, double은 d만 대문자로 Double

char는 Character , boolean은 Boolean이다. 이런 래핑클래스를 제공하고 있기 때문에 

내가 숫자를 넣고 싶으면 Integer를 넣어야한다.

이 Integer는 기본 자료형의 클래스자료형처럼 바꿔치기할 수 있는 래핑클래스라고 한다.

애는 배열과 똑같은데 다른것은 배열은 이 크기를

[ ] 안에 적어놨었는데 

이런게 없다. 크기를 미리 정하지 않아도 된다. 

꺼내서 볼때는 c1.get

get이라는 문법으러 본다. get이라는 메서드를 본다! 0번지를 보려고 하면 1이다.

이건 for문(반복문) 이랑 많이 쓴다.

 

for 하고 컨트롤 스페이스를 하면 

이걸 클릭하면 이상한것들이 나온다 자동으로 만들어진다.

 

여기에서 두번쨰꺼를 엔터로 치면 자동으로 형태가 만들어져서 편하다.

 

i는 0부터 시작해서 어디까지 가냐면 arrayList의 크기가 총 3이니까 3보다 작다, 

c1.get(i)라고 하면 컬렉션에 있는 데이터를 하나씩 뽑아서 출력할것이다.

근데 이 3을 이렇게 해놓으면 코드를 수정하게 되면 크기가 한칸이 더늘어난다 

배열과는 다르게 가변적이기 떄문에 4를 하나 표현하기 못하기 떄문에

 4라고 수정을 해야한다. 바뀔때마다 수정을 해야하니까 힘들텐데

c1.size()라는 메서드가 있는데 이 메서드가 애의 크기를 가져온다. 

그러면 조금 편해진다.

c1.add(6)을 넣어도 밑에 코드를 수정할 필요가 없다.

근데 이게 내가 옛날에 배웠는데 메서드를 호출하면 코드가 실행되다가 메서드를 호출하게 되면

자동으로 점프하게 되어서 이런 코드가 좋은 코드가 아니다.

반복할떄마다 계속 이 메세드를 부르게 되기때문에 메서드를 쓸데 없이 계속 호출하는것은 안좋다.

 

어떤 방식이 좋은가>

int size - c1.size()이렇게 한번만 호출하여 크기 6을 받아서

메서드 호출하지 않고 size

이렇게하는게 확실히 더 좋은 코드이다.

코드를 리팩토링 하였따.

애가 컬렉션이다! 컬렉션은 ArrayList하나만 우선 기억하자!