본문 바로가기

JAVA

배열타입

반응형

알고리즘 공부하면서 배열을 자주 볼수 있는데 사용방법은 알고 있지만 정확한 사용방법과 개념을 정리해야겠다

 

배열이란?

변수는 한 개의 데이터만 저장할 수 있다. 따라서 저장해야 할 데이터의 수가 많아지면 그만큼 많은 변수는 필요하다 예를 들어 학생 30명의 성적을 저장하고, 평균값을 구한다고 가정해보자. 먼저 학생 30명의 성적을 저장하기 위해 변수 30개를 선언해야 한다.

만약 배열 변수가 null값을 가진 상태에서 변수[인덱스]로 값을 읽거나 저장하게 되면 NullPointException 이 발생한다. 배열 변수는 배열을 생성하고 참조하는 상태에서 값을 저장하거나 읽어야한다.

 

값 목록으로 배열 생성

배열 항복에서 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열 객체를 만들 수 있다.

 

데이터 타입 [] 변수 = { 값0, 값1,값2,값3..};

 

 

중괄호 {} 는 주어진 값을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴 한다. 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다. 예를 들어 "김자바" , " 홍길동" , "이모무시키" 문자열을 갖는 배열은 다음과 같이 생성할수 있다.

String [] name = {" "김자바" , " 홍길동" , "이모무시키"};

 

이렇게 생성된 배열에서 "김자바"는 name[0], "홍길동"은 name[1] , "이노무시키"는 name[2] 로 읽을수 있다. names[1] 의 "홍길동"을 "홍삼원"으로 바꾸고 싶다면 다음과 같이 대입 연산자를 사용하면 된다. 

 

name[1] = "홍삼원";

 

 

값의 목록에서 배결 객체를 생성할때 주의할 점이 있는데, 배열 변수를 이미 선언한 후에 다른 실행 문에서 중괄호를 사용한 배열 생성은 허용되지 않는다.

 

타입 [] 변수 ;

변수 = { 값0,값1,값2,값3,값4...}//커파일 에러

 

배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 다음과 같이  new 연산자를 사용해서 값 목록을 지정해주면된더. new 연산자 바로 뒤에는배열 변수 선언에서 사용할 "타입[]"를 붙여주고 중괄호 {} 애는 값들을 나열해주면된다.

 

변수 new 타입 [] {값0,값1,값2,값3,값4};

 

예를 들어 배열 names를 다음과 같이 생성할수 있다.

 

String [] name = null;

names = new String [] { "김자바" , " 홍길동" , "이모무시키"};

 

메소드의 매개 값이 배열일 경우에도 마찬가지다. 매개 변수로 int[] 배열이 선언된 add()  메소드가 있을 경우, 값 목록으로 배열을 생성함과 동시에 add() 메소드의 매게값으로 사용하고자 할때는 반드시 new 연산자를 사용해야한다.

 

 

 

 

 

 

 

new 연산자로 배열 생성

값의 목록을 가지고 있지 않지만 ,향우 값들을 저장할 배열을 미리 만드고 싶다면  new 연산로 다음과 같이 배열 객체를 생성시킬 수 있다.

 

타입[] 변수 = new 타입[길이];

 

길이는 배열이 저장할 수 있는 값의 수를 말한다. new 연산자로 배열을 생성할 경우에는 이미 배열 변수가 선언된 후에도 가능하다.

 

타입 [] 변수 = null ;

변수 new 타입[길이];

 

다음은 길이 5인 int[] 배열을 생성한다.

 

int[] intArray = new int[5];

 

자바는 intArray[0]~ int Array[4] 까지 값이 저장될 수 있는 공간을 확보하고, 배열의 생성번지를 리턴한다. 리턴된 번지는 intArray 변수에 저장된다. 항목의 크기는 int타입의 크기인 4byte이다.

 

 

 

 

 

new 연산자로 배열을 처음 생성할 경우, 배열은 자동적으로 기본값으로 초기화된다. 학생 30명의 점수를 저장할 배열을 다음과같이 생성한다고 가정해보자.

 

int [] scores = new int [30];

 

scores 배열은 int타입 배열이므로 다음과 같이 scores[0] ~ scores[29] 까지 모두 기본값 0으로 초기화된다.

 

만약 String 배열을 생성했다면 names[0] 에서 name[29]  까지 모두  null 값으로 초기화 된다.

 

 

타입별로 배열의 초기값을 보여준다.

분류 데이터 타입  초기값
기본 타입(정수) byte[],
char[]
short[]
int[]
long[]
0
\u0000
0
0
0L
기본타입(실수) float[]
double[]
0.0F
0.0
기본타입(논리) boolean[] null
참조타입 클래스[]
인터페이스[]
null

 

배열이 생성되고 나서 새로운 값을 저장하려면  대입 연산자를 사용하면된다.

 

변수[인덱스] = 값;

예를 들어 배열 score의 0,1,2   인덱스에 각각 83,90,75를 저장하는 코드는 다음과 같다.

 

int[] scores = new int [3]

scores[0] = 83;

scores[1] = 90;

scores[2] = 75;

 

 

배열 길이

 

배열의 길이란 배열에 저장할 수 있는 전체 항목 수를 말한다. 코드에서 배열의 길이를 얻으려면 다음과 같이 배열 객체의 length 필드를 읽으면 된다. 참고로 필드는 객체 내부의 데이터를 말한다. 배열의 length 필드를 읽기 위해서는 배열 변수도트(.) 연산자를 붙이고 length 를 적어주면된다.

 

배열변수.length;

int [] Array = new int [10.20.30];

int num = Array.length;

 

 

 

다차원 배열

 

값 들이 행과 열로서 구성된 배열을 2차 원 배열이라고 한다. 2차원 배열은 수학의 행렬을 떠올리면 되는데, 가로 인덱스와 새로 인덱스를 사용한다. 예를 들어 2(행) x 3(열) 행렬을 만들기 위해 다음과 같은 코드를 사용한다. 

 

int [][] scores = new int [2][3] 

이코드는 메모리에 다음과 같이 세 개의 배열 객체를 생성한다.

 

 

 

 

 

배열 변수인 scores 는 길이 2인 배열 A를 참조한다. 배열 A의 scores[0]은 다시 길이 3인 배열 b를 참조한다 그리고 scores[1]  역시 길이3인 c를 참조한다. scores[0]과 scores[1]은 모두 배열을 참조하는 변수 역할을 한다. 따라서 각 개별의 길이는 다음과 같이 얻을수 있다.

 

scores.length;

scores[0].length;

scores[1].length;

 

생성 원리는 수학 행렬과는 근본적으로 다르지만 사용 방식은 행렬과 동일하다. scores[0][1] 은 배열 b의 인덱스 1값을 뜻한다. 수학 행렬에서는 0,1 값이라고 볼수 있다. 마찬가지로 scores[1][0] 은 배열c의 인덱스 0값을 뜻한다. 이것은 수학 행렬의 (1,0) 값이다. 자바는 일차원 배열이라서 서로 연결된 구조로 다차원 배열을 구현하기 때문에 수학 행렬 구조가 아닌 계단식 구조를 가질수 있다. 

 

scores[0] 은 b배열을 참조하는거니까 [1] 이 b배열의 첫번째 방이라고 생각하면되고 scores[1]은 배열c를 참조 하니까 [0]이 c배열에 0번째방 이라고 생각하면된다.

 

 

int [][] scores = new int [2][];

scores[0] = new int [2];

scores[1] = enw int [3];

 

이경우 배열 항복의 수를 조사해보면 scores[0] 배열에는 2개의 방이 만들어졌고 scores[1] 3개의방이 만들어졌다

 

scores.length;

scores[0].length;

scroes[1].length;

 

 

이런 형태으 배열에서 주의할 점은 배열의 길이를 알고 인덱스를 사용해한다. scores[0] [2] 는 ArrayIndexOutBoundException을 발생시킨다. 이유는 배열 b객체의 마지막 인덱스는 1이기 때문이다. 하지만 scores[1][2] 는 배열c객체의 세번째 항목을 가리킨다. 만약 그룹화된 값 목록을 가지고 있다면 다음과 같이 중괄호 안에 다시 중괄호를 사용해서 값 목록을 나열하면 된다.

 

타입 [][] 변수 = {{값,값,값},{값,값,}};

 

예를 들어 그룹화된 성적 점수를 이용해서 다음과 같은 배열을 만들수 있다. scores[0]에는 {95,80} 배열을 참조하고, scores[1]에는 92,96 베열을 참조한다

 

int [][] scores = {{95,80} , {92,96}};

위코드로 생성된 scores 배열에서 항목 값은 다음과 같이 읽을 수 있다.

int score = scores[0][0]; // 95

int score = scores[1][1]; // 96

 

 

예시

 

 

 

 

다차원 배열까지 다시 복습을 해봤다 알고리즘 중에 재긔알고리즘 공부하다가 다차원 배열이 갑자기 생각이 안나서... 오잉 했다.... 프로젝트 할때도 배열을 쓰지 않고 컬렉션 타입으로 하니까.. 머릿속에서 지워져버렸다 .. 오늘 부터 무슨일이 있어도 잊어버리지 않기를..

 

반응형

'JAVA' 카테고리의 다른 글

상속과 구현의 차이점  (0) 2020.12.02
사용자 정의 예외와 예외 발생  (0) 2020.11.16
예외 종류에 따른 처리코드  (0) 2020.11.16
JAVA 예외처리  (0) 2020.11.15
클래스의 구성 멤버(return)  (0) 2020.11.11