본문 바로가기
프로그래밍 공부/Java

[lesson] Java 프로그래밍 언어 - 배열

by Luna_lua 2021. 7. 26.
반응형

오늘은 배열을 배워보려 합니다.

우리 변수를 배웠으니 그전에 질문 하나!!

 

정수 1개를 받을 변수 num을 선언을 하려면 어떻게 해야 할까요? 바로 int num = 정수값; 이렇게 선언하여 사용할 것 입니다.

그렇다면 정수 10개를 받을려면 어떻게 하나요? 혹시 int num1=0, int num2=0 . . . int num10 =0이렇게 선언해서 사용할건가요? 그렇다면 10개가 아니라 100개, 1000개, 수많은 정수를 받는다면? 막막한 생각이 납니다.... 그러나 이럴때 쓰는것이 바로 배열!!! 그 배열을 이제 배워 볼까요?

 

전에 변수 파트에서 변수는 저장공간이라고 했습니다.

배열의 사전적 의미는 '동일한 성격의 데이터를 관리하기 쉽도록 하나로 묶는 일'이라고 되어 있습니다.

즉, 쉽게 말해 배열은 저장공간의 나열이라고 보면 됩니다.

2021.07.21 - [프로그래밍 공부/Java] - [lesson] Java 프로그래밍 언어 - 자료형 및 변수

 

[lesson] Java 프로그래밍 언어 - 자료형 및 변수

오늘은 Type 즉 자료형을 알아보려 합니다. 먼저 자료형은 아래의 표와 같습니다. 위의 자료형만 보면은 어떻게 사용하는지 잘 모를것 같아요~ 그럼 위의 자료형을 어떻게 사용하는지 알아볼까요

luna-lua.tistory.com

 

<사용의 목적>

1. 변수를 여러 개 선언하면 이름도 여러 개 생긴다. 이때 각 저장공간을 관리하기가 불편하다.
   따라서 n칸 배열을 한 번 선언하면 저장공간도 한번에 여러 개 생기고, 이름도 한 개이기 때문에 관리하기 편하다.

( 처음 질문했던 내용의 사용목적입니다. )

 

2. 규칙성이 없는 값에 규칙성을 부여하기 위해서 (사용 빈도가 더 높음)

( 문자열 "하나", "둘", "셋", "넷" ... 일때 글씨이기 때문에 규칙성이 없는데, 이를 String 배열에 넣는다면 규칙이 생기기 때문에 관리 및 사용이 용이해집니다. )

 

<배열의 선언>

// 1. 자료형[] 배열명 = {값1, 값2....};  // 어떤값을 넣을 지 알 때 사용 (new가 생략 되어있음)

   int[] arData = { 3 , 5 , 7 , 9 , 1 };

// 2. 자료형[] 배열명 = new 자료형[칸수] // 어떤 값을 넣을 지 모를 때 사용

   int[] arData = new int[5];

// 3. 자료형[] 배열명 = null; // 몇 칸 만들 지도 모를 때

   int[] arData = null;

 

※ 자료형[] 배열명 과 자료형 배열명[] 모두 가능하지만

배열도 타입이라고 인지하기위해 int[]로 사용하는것이 좋습니다.!!!

 

★Point! 여기서 new라는것은 Heap 메모리에 할당하라고 해주는 명령어, 초기값으로 자동초기화가 되며, 각 타입에 맞게 초기화가 됩니다.

 

여기서 메모리관점에서 Heap은 주소만 가지고 있는 영역입니다. 

※ 자바에서 배열은 항상 heap메모리(동적 메모리)에 할당되기 때문에 메모리 상, 동적배열만 존재합니다.

 

 

<배열의 구조>

int [] arData = { 3 , 5 , 1 , 7 , 9 };

 

arData라는 이름의 저장공간은 한 개 만들어지며, 여기에는 한 개의 값(arData가 메모리에 어디있는지에 대한 주소값)만 담을 수 있다. 
5개의 값을 담기 위해서는 5칸이 필요하며,
이는 Heap메모리에 할당된다. 5칸의 저장공간 중 첫번째 저장공간의 주소값이
arData 저장공간으로 들어가며, 다음 주소에 접근하기 위해서 +n을 한다.
예를 들어, arData+ 2 는 1이라는 값이 담긴 저장소의 주소값이 되며,
*(arDatya +2)는 해당 주소에 가서 읽어온 1이라는 값이 된다.
JAVA에서는 직접 주소에 접근하는 연산자가 없기 때문에 위와 같은 식을[]로 치환하여 사용하며, 
arData[2]로 사용한다.
각각의 방 번호는 index라고 부르며, 배열은 시작주소를 가지고 있기 때문에
인덱스 번호는 항상 0부터 시작된다.

 

 

<.length> 

배열을 선언하면, length라는 상수가 선언되고 해당 배열의 길이가 담긴다.
배열명.length로 사용하게 된다.

 

 

<배열의 사용>
int[] arData = new int[4] // 저장공간
arData[0] = 10;  //저장공간
arData[0] + 9; //값
System.out.print(arData); // 주소값
arData[2] = arData[0] + arData[1]; //저장공간, 값, 값
System.out.print(arData[4]); //오류

 

 

배열이라는게 하나의 데이터가 아닌 규칙성이 있는 데이터들을 모으기 위해 사용한다고 했습니다.

그렇다면 배열이 또하나의 규칙성을 가지고 여러 배열을 모을수 있지 않나? 라고 생각이 들지 않나요? 

그래서 나온것이 2차원 배열입니다.

즉 배열안에 배열인 셈이죠~ 1차원 배열을 여러개 선언할때 관리가 힘들어 2차원으로 한 번 선언합니다.

그러나 배열은 메모리 공간에 필요한 공간을 한곳에 다 모아 인덱스로 관리한다고 했기 때문에 2차원 배열은 큰 저장공간에 들어가야 하므로 메모리 낭비가 심해 선호하지는 않습니다.

 

그래도 쓸일이 있기 때문에 선언 방법만 설명 드릴게요

<2차원 배열의 선언>

// 자료형[][] 배열명 = { {값1, 값2, 값3 ..... } , {값1, 값2, 값3} };

  int[][] arrData = { { 1 , 2 , 3 } , { 3 , 4 , 5 } };

// 자료형[][] 배열명 = new 자료형 [행][열];

  int[][] arrData = new int[2][3];



// 자료형[][] 배열명 = null;

  int[][] arrData = null;

// 배열명 = new 자료형[행][열]; (null이기 때문에 따로 나중에 선언 해주어야 합니다.)

  arrData = new int[2][3];

 

★Point! null이란 '아직 입력되지 않은 값' 또는 '알 수 없는 값'을 의미. 즉, 아직 아무런 주소값이 없다는 의미입니다.

반응형