본문 바로가기

프로그램/JAVA

자바기초 : 자료를 담는 List와 Map

자료를 담는 List와 Map

아마도 프로그램을 작성하면서 가장 많으 사용하는 타입중에 하나가 List와 Map 일 겁니다.

둘다 interface 입니다. 즉. 실제 타입을 구현하는 객체는 따로 있다는 것이죠..
인터페이스가 뭔지 모르시면 그냥 그런것이 있는 보다 넘어가시면 됩니다.

중요한것은 List와 Map 차이점을 이해하고 각각 어떤 경우에 사용하는 가 입니다.

들어가기에 앞서서

컴퓨터라는 것은 뭔가? 라는 생각을 해봅니다.

아주 오래전에 전산학 처음 하면 배우는 것이 있었습니다.
EDPS 개론 이라고 하죠..
electronic data processing system (맞나요?)

전산이라는 것이 결국 data를 전기적으로 처리하는 것이라는 말인것 같네요.(전기적이라고 하는 것은 논리회로 구성을 들어가면 전기 신호가 어쩌구저쩌구 나옵니다.)

중요한 것은 data 입니다.
data에는 어떤 종류가 있냐면..
무수히 많은 종류가 있습니다.

수학 표현에서 잘 알려진 정수, 실수, 등등 기본적인 것이 정해져 있겠죠..
그것들인 primitive type으로 정해져 있습니다.
이외의 타입은 모두 레퍼런스 타입으로 만들면(?), 또는 가져다 쓰면 됩니다.

프로그래머로 있으면서 특정 데이터의 특성을 파악하고 적절한 분류를 해내는 것이 매우 중요 하다고 생각합니다.
계속 분류하고 나눠서 단순화 시켜야 전기적으로 처리하기 쉽습니다(EDPS를 얘기해서 전기적이란 말을 썼습니다.). 즉 프로그램 하게 쉽다는 말이죠..

본론으로 들어가서.

비슷한 데이터들이 많을때 묶어서 관리 하고 싶어집니다.

아마 배열이라는 것을 들어봤을 텐데요..

int[] a = new int[10];

int형 데이터 10개를 담을수 있는 공간을 만들고 해당 공간의 주소를 a에 넣습니다.
다시말해 10개짜리 int 배열을 만들고 a라는 변수에 할당한다.

new 라는 키워드가 있는걸로 봐서 a는 reference type 변수임을 짐작할수 있습니다.

그런데 이 배열이라는 것이 실재 프로그램에서 사용하기는 영 껄끄럽습니다.
이유는 생성시에 크기를 미리 정해야 한다는 겁니다.
10개넣을 수 있다던지.. 100개를 넣을수 있다던지 한번 new로 생성이 되면 그 크기를 변경할 수 없습니다.

그래서 배열 대신에 List를 씁니다.
감이오시죠? List는 생성시에 크기를 지정하지 않아도 됩니다.

List

list는 목록이라는 뜻인데요..

List aaa = new ArrayList();

aaa라는 list를 만들었습니다.

aaa에 뭔가를 추가 하려면
aaa.add(Object); 하시면 됩니다.
목록에 Object를 추가하는 거죠..

제거 하고 싶으면
aaa.remove(Object); 하시면 됩니다.
또는
aaa.remove(Index); 로 하셔도 됩니다.
List의 함수 목록을 보면 어떤 것들이 있는지 확인이 가능 합니다.
(https://docs.oracle.com/javase/8/docs/api/index.html?java/util/List.html)



list에는 Object 타입의 데이터를 넣을 수 있습니다.
이말은 모든 reference type의 데이터를 넣을수 있다는 얘기 입니다.

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

이렇게 <> 사이에 특정한 Obejct만 넣겠다고 선언할 수 있습니다.
실제로는 <> 안에 관리하고자 하는 Object 를 정하고 사용할 때가 많습니다.
<>를 사용하면 컴파일 단계에서 오류를 잡아낼수 있습니다.

aaa 변수에 계속 무언가를 추가 했습니다.
추가 하다 보니 aaa에 몇개가 있는지 모르겠습니다. - 대부분은 프로그램 작성단계에서 몇개가 들어갈지 모릅니다.-

그럼 함수중에 size()를 호출 하여 몇개가 있는지 알아낼수 있습니다.

총 1000개의 데이터가 들어 있고 이중에 10번째 데이터를 얻고 싶으면

aaa.get(9); 하시면 됩니다.

인덱스 9에 있는 데이터를 꺼냅니다. (0부터 여서 9면 10번째 데이터 입니다.)

int[] aa;

이런 일반 배열보다 훨씬 유용 하다고 생각되지 않나요?

Map

List가 몇번째 데이터에 뭘 넣고 몇번째 데이터를 가져 오고 한다면
Map은 몇번째가 아니라 마치 서랍에 붙은 label 처럼 특정 key 값을 가지고 데이터를 특정 합니다.

Map aaa = new HashMap();
aaa.put("홍길동", new Object());

aaa에 홍길동이라는 label로(key) Object를 생성해서 넣었습니다.
꺼낸때는

aaa.get("홍길동"); 하면 됩니다.

즉 List가 index로 접근한다면 map은 key로 접근 합니다.
또한 key의 data Type은 Object여서 숫자로도 문자로도 가능 합니다.(물론 다른 어떤 Object로도 가능 합니다.)



Map이 좋은 것은 사람이 쓴기 편하다는 겁니다.

나 : 길동아 내가 맵 aaa를 줄깨 거기서 원하는 데이터 꺼내 써라~~
길동이 :  aaa에 이름은 어떻게 꺼내?
나 : 아~~ "name"을 키로 해서 꺼내면 되.. 추가로 메일주소는 "email", 주소는 "addr", 우편번호는 "zip" 이야..

편하지 않나요?
만약 리스트나 배열로 했다면?

나 : 첫번째가 이름이고 두번째가 메일주소고 세번째가 주소 네번째가 우편번호야..
길동이 : OK..

몇일 후

길동이 : 2번째가 뭐라고 했지?(우편번호가 몇번째라고 했지?)
나 : ㅠㅠ

뭐 이런 겁니다.
Map도 참 편하지 않나요?

'프로그램 > JAVA' 카테고리의 다른 글

자바기초 : primitive Type , reference type  (0) 2019.01.22
apache deamon 설정  (0) 2019.01.22