본문 바로가기

프로그래밍 언어 기초/JAVA

chapter 4. 배열(Array)과 컬렉션(Collection)

4.1. 배열이란 ?

오늘은 배열(Array)와 컬렉션(Collection)에 대해서 알아보도록 하겠습니다. 먼저 배열부터 알아보도록 할 건데요. 우리가 마트에서 물건을 구매할 때 바구니나 카트가 없다면 한번에 많은 물건을 담을 수 없겠죠? 아마도 구매한 모든 물품을 집으로 가져가기 위해서는 몇번이고 마트를 재방문 하는 수고로움을 동반할 지 모르겠습니다. 만약 이렇게 된다면 아무도 마트에 가고 싶어하지 않겠죠? 프로그래밍에서도 마찬가지입니다. 자바에서도 0 이상의 변수들을 한번에 관리할 수 있는 자료구조(Data structure)를 제공해주는데요 이것이 바로 배열입니다.

 

 물건을 여러개 담기 위해 바구니가 발명되었듯이 변수를 여러 개를 한번에 담기 위하여 배열이 탄생하게 되었습니다. 이렇게 되면 똑같은 코드를 몇 번이고 작성하는 수고로움 없이 단 한줄로도 여러 줄을 대체 가능하게됩니다. 단순히 코드가 깔끔해지는 장점만이 있는 것은 아닙니다. 서울에서 부산에 사는 친구를 만나러 가는 것보다 서울에 사는 친구를 만나러 가는 것이 더 쉬운 것처럼 배열은 동일한 자료형을 갖는 변수들을 연속된 공간에 저장하여 관리하기 때문에 데이터에 접근하는 속도가 굉장히 빠르다는 장점이 있습니다. 

 

배열은 기본적으로 "동일한" 자료형을 갖는 변수들을 연속적인 공간에서 관리하는 자료구조입니다. 하지만 자바는 모든 객체들, 즉 reference type 자료형들의 공통 조상인 Object 라는 자료형이 존재합니다. 그래서 이 자료형을 사용한다면 서로 다른 자료형이라도 같은 배열안에 담을 수는 있긴 합니다. 그러나, 이렇게 배열을 사용하는 것은 나중에 관리하는 것도 어려움을 증가시키며, 문제가 발생했을 경우 해결하는 데에도 어려움을 증가시키기 때문에 정말 꼭 필요한 경우가 아니라면 Object를 배열이 담는 자료형으로 하여 배열을 생성하고 다양한 변수들을 담아 관리하는 것은 지양해야 합니다.

 

4. 2. 배열의 선언

배열은 자료형 [] 의 형식으로 선언합니다. 배열은 한번 선언했을 경우 크기를 바꾸는 것이 불가능하며,

크기를 조절하고 싶을 경우에는 새롭게 변수를 선언해야 합니다.

		// 배열의 선언
		int[] intArr = new int[] {1,2,3,4};
		long longArr [] = new long[] {1,2,3,4}; // 이렇게 선언하는 것도 가능!
		boolean[] boolArr = new boolean[] {true, false};
		float[] floatArr = new float[] {}; // 값이 없는 배열도 선언 가능!
		
		// 배열의 크기만 작성하여 기본 값으로 세팅된 배열 선언이 가능합니다.
		int[] intArr2 = new int[4]; // {0,0,0,0} 인 배열 선언
		float[] floatArr2 = new float[2]; // {0.0, 0.0}인 배열 선언
		boolean[] boolArr2 = new boolean[2]; // {false, false}인 배열 선언

 

 4. 3. 배열의 조회, 수정, 복사, 변경

 배열은 연속된 공간에 저장된 변수들의 모임입니다. 따라서 이들을 관리할 주체가 필요한데요. 자바에서 배열은 index를 통해 값에 접근하고 index를 사용해 값을 수정 또는 복사할 수 있습니다. 배열의 index는 우리가 물건을 셀 때처럼 1개, 2개... N개 이런식으로 1부터 시작하여 셈하지 않습니다. 배열에서 index는 배열의 가장 첫 요소와의 거리를 나타내는 기준값입니다. 따라서 index  = 0 이라고 하는 것은 배열의 가장 첫 요소에서 첫 요소 까지 즉 자기 자신으로의 거리는 0이므로 0, 그다음 요소부터는 1만큼씩 떨어져서 0, 1, 2, 3.. 이런식으로 셈하게 되는 것입니다. 따라서, 사람이 물건을  셀 때처럼 셈하고 싶다면 이 index에 1을 더하여 환산하여 계산하기도 합니다. 

 

		// 배열의 선언
		int[] intArr = new int[] {1,2,3,4};

		// 배열의 조회
		System.out.println(intArr[0]); // 1;
		
		// 배열의 수정
		intArr[0] = 3;
		System.out.println(intArr[0]); // 3;
		
		// 배열 속 값의 복사
		int x = intArr[0];
		System.out.println(x); // 3;

 

 배열의 자료형은 reference type으로 구분합니다. 배열을 선언할 때 primitive 자료형을 사용하지만 배열도 프로그램에서 스택영역에 이름=값의 형태로 바로 저장되는 것이 아닌 reference type처럼 배열의 이름에 대한 정보가 stack에 저장되고 heap 영역에 실제 변수들에 대한 주소에 저장되어 동적으로 할당되기 때문입니다. 이는 배열을 사이즈로 선언할 수 있는 것에서도 유추할 수 있습니다. 만약에 배열이 primitive type이었다면 배열을 크기로 선언하는 문법은 컴파일 오류를 발생시켜야 할 것입니다. 왜냐하면 배열의 크기에 대한 정보는 stack 영역에서 찾을 수 있지만 나머지 변수들에대한 정보는 찾을 수 없기 때문입니다. 따라서 배열은 reference type입니다.

 

4. 3. 컬렉션이란?

 Java 의 컬렉션(Collection)이란 객체를 저장하고 조작하기에 특화된 구조(architecture)를 가진 자바의 프레임워크입니다.

정의가 난해하죠? 방금 앞서 배운 자바의 배열(Array)은 한번 선언시 배열의 크기를 조절하거나, 동적으로 그 안의 요소들을 제거하기가 무척이나 어렵습니다. 바로 배열은 한번 선언 시 크기 수정이 불가하다는 특성 때문인데요. 배열을 사이즈를 줄여서 사용하고 싶다면 원하는 사이즈의 배열을 새로 선언해서 사용해야하는 단점이 있었습니다. 그렇다면 그렇게 하면 어떨까요? 배열의 크기가 바뀌면 사이즈를 바꾸고, 새로 선언하는 귀찮은 작업을 자동화시키면 되지 않을까 하는 생각이 듭니다. 다행히도 훌륭하신 자바 개발자분들께서 이런 생각을 실현 시켜 놓았습니다. 바로 ArrayList라고 하는 클래스입니다. 클래스라는 개념은 다양하게 해석될 수 있는데요. 여기서 말하는 클래스는 쉽게 설명하자면 다른 개발자들이 편하게 쓸 수 있도록 부품을 미리 만들어 둔 것이라고 이해하시면 될 것 같습니다. 만약 클래스에 대한 정의가 궁금하시다면 여기 를 참고해주세요.

 

 

 

4. 4. 컬렉션의 선언.

 자바의 컬렉션은 java.util 이라는 패키지 속에 포함되어 있는데요. 패키지라 함은 프로그래밍 언어에서 디렉토리(폴더) 구조로 구분될 수 있는 특정 데이터의 저장 위치 정도로 정의할 수 있을 것 같습니다. 말이 어렵죠? 그냥 우리나라로 치면 도로명 주소라고 생각하면 될 것 같습니다. 친구네 집에 가려고 하면 주소를 알아야 찾아갈 수 있듯이 원하는 데이터를 찾아가기 위한 주소 정도 된다라고 이해하면 될 거 같아요. 자세한 설명은 여기를 참고해주세요! 이처럼 자바의 컬렉션은 외부의 자료를 가져오는 작업 후에 사용할 수 있는데요. 자바로 작성된 프로그램을 실행시키기 위해서 많이 사용하는 IDE로 이클립스가 있죠. 이클립스 같은 IDE에서는 친절하게도 이렇게 잘 알려진 외부 자료(라이브러리)는 개발자가 코드를 입력한 것을 인식해서 자동으로 가져오는(import) 기능을 지원해주고 있어서 우리는 문법에만 잘 맞게 사용하면 된답니다.

 

// 컬렉션 중 하나인 ArrayList의 선언
ArrayList arr = new ArrayList<>();
ArrayList arr2 = new ArrayList<>(2); 
// 크기를 선언할 수는 있는데 값이 없으면 사이즈는 0을 리턴합니다.
// 왜냐하면 ArrayList의 사이즈를 리턴하는 메서드 size()의 로직때문인데요.
// 이걸 자세히 설명하면 너무 내용이 복잡해지므로, ArrayList의 size()라는 메서드는
// 내부의 값이 실제로 들어갔는지 확인하고 그 사이즈를 돌려주는구나 하고 생각하면 될거 같습니다.

 

 

4. 5. 컬렉션의 조회, 수정, 복사, 변경

컬렉션은 각 컬렉션마다 특화된 자료의 조회, 수정, 복사 등의 기능을 제공하는데요.

대표적인 컬렉션 ArrayList의 기능들(메서드)에 대해서 알아보도록 할게요!.

ArrayList arr = new ArrayList<>();
ArrayList arr2 = new ArrayList<>(2); 


System.out.println(arr2.size()); // 배열의 크기

arr.add(1); // 배열에 값을 추가!
arr.add(2);
arr.remove(0); // index를 기준으로 배열의 값을 제거... -> 1이 제거됨
// arr.remove(Object); // 컬렉션에 들어가는 데이터의 자료형이 reference type인 경우 값을 기준으로 삭제!
System.out.println(arr.size());

arr.addAll(arr2); // 다른 컬렉션을 합치기

arr.set(0, 3); // index를 기준으로 값을 수정

 

이외에도 다양한 컬렉션들이 있는데요. 이에 대해서는 잘 정리한 그림을 소개하면서 이번 포스팅 마치도록 하겠습니다.

 

 

다양한 컬렉션들

출처 : https://gangnam-americano.tistory.com/41