Loading...

JAVA / / 2022. 1. 20. 17:48

자바 28강. 컬렉션(ArrayList)

반응형

자료구조는 컴퓨터 과학에서 효율적인 접근 및 수정을

가능케 하는 자료의 조직, 관리, 저장을 의미한다.

 

더 정확히 말해, 자료 구조는 데이터 값의 모임, 또 데이터 간의 관계,

그리고 데이터에 적용할 수 있는 함수나 명령을 의미한다.

 

클래스로 자료구조를 표현한 것

큐를 만들면 먼저 넣은 게 먼저 나오도록,

스택을 만들면 먼저 넣은 게 마지막에 나오도록 표현한 것을 말한다.

 

자주 쓰는 자료구조에 대한 메서드의 집합을 컬렉션(collection)이라고 한다.

 

 

컬렉션의 기본은 연결 리스트(Linked-list)이다.

리스트의 첫 번째 데이터에 접근하면

메모리의 다음칸으로 넘어가는 것이 아닌

링크를 이용하여 두 번째 데이터가 저장되어있는 곳으로 간다.

 

동적으로 데이터를 추가할 수 있다.

데이터를 추가하는 것뿐만 아니라

데이터를 삭제해 크기 줄이는 것도 가능하다.

 

또한 연결 리스트는 링크만 걸면 되기 때문에

모두 다 같은 타입의 값을 넣어야 하는 것은 아니다.

 

데이터를 추가하기 위한 빈 공간은 어떻게 찾을까?

메모리의 처음부터 끝까지 남는 공간 찾는 것을

풀스캔이라고 하는데 효율이 좋지 않다.

데이터가 정렬이 되어있지 않을 때는 풀스캔을 사용한다.

 

데이터가 정렬되어있다면 이진트리검색(binary search)을 사용한다.

단, 무조건 데이터가 정렬되어있어야 한다.

 

데이터가 아래 그림과 같이 정렬되어 있을 때

내가 8을 찾아야 한다고 하자.

그러면 배열의 전체 사이즈(8) / 2 = 4번지로 찾아간다.

4번지의 값이 15로 8보다 크다.

그러면 아래 4칸에서 다시 시작한다.

전체 사이즈(4) /2 = 2번지로 찾아간다.

2번지에 내가 찾는 8이 있다!

 

이게 이진트리 검색이다.

 

수정, 삭제가 빈번하게 일어나는 프로그램에서 연결 리스트의 사용은 적절할까?

매우 적절하다.

 

데이터를 저장하려는 목적이 수정, 삭제보다 검색(스캔)에 있다면

연결 리스트의 사용은 적절할까?

 

아니다.

 

연결 리스트는 데이터의 저장, 수정에는 유리하지만

배열에 비해 데이터에 접근하는 속도가 느리기 때문에

검색(스캔)을 하는 프로그램에는 배열의 사용이 적절하다.

 

1부터 10까지 정렬되어 저장되어 있는 배열과 연결 리스트 중

7을 누가 더 빨리 찾을까?

 

무조건 이진트리 검색 방법이 빠를까?

 

빠르다.

 

연결 리스트에서 7을 찾기 위해선 7이 연결되어있는 링크를 먼저 알아야 한다.

그럼 결국 1부터 스캔해야 하는 것이다.

 

배열이 무조건 빠르게 검색이 가능하다.

 

배열보다 연결 리스트가 데이터를 찾는데 속도가 느린 편이지만,

컴퓨터의 퍼포먼스가 아주 좋아진 지금은

access 속도가 프로그램을 크게 좌우하지 않는다.

 

그리고 우리는 연결 리스트와 거의 비슷한 ArrayList를 사용할 것이다.

 

 

우리가 Arraylist에 어떤 타입을 넣을지 모르니

제네릭 타입으로 만들어져 있다.

 

ArrayList는 여러 개의 데이터가 저장되는 제네릭 박스인 것이다.

ArrayList는 배열이 아니기 때문에 get이라는 메서드로 값을 가져온다.

package ex22;

import java.util.ArrayList;

public class CollectionEx01 {
    public static void main(String[] args) {

        // ArrayList는 데이터가 중복되도 되는 데이터 모임
        // 여러개의 데이터가 저장되는 제네릭 박스
        ArrayList<String> datas = new ArrayList<String>();
        datas.add("데이터1");
        datas.add("데이터2");
        datas.add("데이터3");
        datas.add("데이터4");

        // 중간 수정, 삭제
        datas.set(1, "data2");
        datas.remove(3);

        System.out.println(datas.get(0));
        System.out.println(datas.get(1));
        System.out.println(datas.get(2));
        // System.out.println(datas.get(3));
    }
}

 

ArrayList는 선언한다고 해서 데이터 공간이 생기는 것이 아니다.

0번지에 데이터가 없으면 1번지에 데이터를 넣을 수 없다.

링크를 걸어야 하기 때문이다.

 

그래서 인덱스를 사용해 데이터를 넣는 것이 아니라 add( ) 메서드를 사용해 넣는 것이다.

0번지에 있던 데이터가 삭제되면 1번지에 있던 데이터가 0번지로 들어가게 될 것이다.

무조건 0번지에 데이터가 있어야 하기 때문이다.

 

연결 리스트와 ArrayList의 차이점이 있다.

ArrayList는 인덱스 넘버를 사용하여 다이렉트 접근이 가능하다.

 

 

데이터를 순차적으로 저장하고 싶을 땐

arraylist 쓰자! 끝!

add, get, remove, set만 기억!

 

 


 

interface Hello {
}

interface Haha {
}

class Bye implements Hello, Haha{

}

class Hi implements Hello{

}

 

interface를 구현하는 클래스를 new 했을 때

상속과 마찬가지로 부모처럼 사용이 가능하다.

메모리에 동시에 뜨기도 하고, 문법적으로 다형성도 성립해서

메모리에 떠있는 공간을 가리키는 포인터도 부모, 자식 둘 다 가능하다.

 

인터페이스는 상속과 달리 여러 개를 구현할 수 있다.

 

결국 arrayList도 Collection의 자식인 것이다.

 

확인을 해보니 컬렉션에도 부모가 있다.

 

Iterable이 순차적 저장의 최강자인 것이다.

 

 

크게 알아둘 필요는 없지만

컬렉션이 추상화되어 만들어져 있다는 것만 알면 된다.

 

List<String>datas = new ArrayList<String>( );

 

List에는 vector라는 것도 있는데, 나중에 그것도 배우면 사용할 것이기 때문에

List<String>datas = new Vector<String>( );

 

List라고 순서가 있는 저장 공간으로 추상화시킨 것이다.

 

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

 

반응형