Hyebin‘s blog
article thumbnail
Published 2023. 1. 15. 18:07
배열 JAVA

배열이란?

변수는 하나의 값만 저장할 수 있다. 따라서 저장해야 할 값의 수가 많아지면 그 만큼 많은 변수가 필요하다.

따라서 많은 양의 값을 다루는 좀 더 효율적인 방법이 필요하다.

이것이 배열이다.

 

배열의 특징

1. 배열은 같은 타입의 값만 관리한다.

2. 배열의 길이는 늘리거나 줄일 수 없다.

 

배열의 변수 선언

배열을 사용하기 위해 우선 변수를 선언해야한다.

//타입[] 변수;

int[] intArray;
double[] doubleArray;
String[] strArray;

타입[] 변수 = null;

타입은 벼열에 저장될 값의 타입을 말한다. 

 

배열 변수는 참조변수이다. 따라서 배열도 객체이므로 힙영역에 생성되고,

배열 변수는 힙 영역의 배열 주소를 저장한다.

참조할 배열이 없다면 배열 변수도 null로 초기화 할 수 있다.

만약 배열 변수가 null 값을 가진 상태에서 변수[인덱스] 값을 읽거나 저장하게 되면 NullPointerException이 발생한다.

 

값 목록으로 배열 생성

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

String[] season = {"Spring". "Summer", "Fail", "Winter"};

//대입 연산자
season[1] = "여름"

🧐 헷갈림 주의

중괄호 { } 로 감싼 값의 목록을 배열 변수에 대입할 때 주의할 점이 있다.

1. 배열 변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없다. 배열 변수를 선언한 시점이 다를 경우 new 타입[]을 중괄호앞에 붙여주면 된다

타입[] 변수;
변수 = { 값0, 값1, 값2, 값3, ...}; //컴파일 에러
String[] name = null;
name = new String[] {"신용권","신짱구", "신용만"};

2. 메소드의 매개변수가 배열일 경우에도 마찬가지이다. 

//메소드 선언
void printItem(int[] scores){ ... }

//잘못된 메소드 호출
printItem( {95,85,90} ); //컴파일 에러

//올바른 메소드 호출
printItem( new int[] {95,85,90} );

* 메소드 선언 : 이름 있는 중괄호 블록을 만드는 것

* 메소드 호출 : 해당 이름으로 중괄호 블록을 실행하는 것

 

new 연산자로 배열 생성 (배열 항목을 기본값으로 초기화한 배열 생성)

값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성할 수 있다.

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

//길이가 5인 int[] 배열 생성
int[] intArray = new int[5];

new 연산자로 배열을 처음 생성하면 배열의 항목은 기본값으로 초기화 된다.

대표적으로 데이터 타입이 int[] 는 0으로, boolean[]는 false로 , 참조타입은 null로  초기값을 보여준다.

 

배열의 길이

배열의 길이란 배열에 저장할 수 있는 항목 수를 말한다.

배열의 길이는 for문을 사용하여 전체 배열 항목을 반복할 때 많이 사용된다.

배열변수.length;

 

다차원 배열

배열 항목에는 또 다른 배열이 대입될 수 있다. 이러한 배열을 다차원 배열이라고 부른다.

타입[][] 변수 = {
	{값1, 값2, ...}, //1차원 배열의 0 인덱스
    	{값3, 값4, ...}, //2차원 배열의 1 인덱스
    ...
]

int[][] scores = {
	{80, 90, 96}, 
    	{76, 88}, 
    ...
]

int score = scores[0][2]; //96
int score = scores[1][1]; //88

score.length; //2
scores[0].length; //3
scores[1].length; //2

 

객체를 참조하는 배열

기본 타입 배열은 각 항목의 값을 저장하지만 참조 타입 배열은 항목의 객체의 번지를 저장한다.

String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";

strArray변수가 참조하는 배열은 힙 역역의 String[] 배열이고 

다시 그 인덱스 항목이 다시 String 객체를 참조하게 된다. 그리고 각각의 번지의 값이 들어간다.

String[] languages = new String[3];
languages[0] = "Java";
languages[1] = "Java";
languages[2] = new String("Java");

System.out.println(languages[0] == languages[1]); //true
System.out.println(languages[0] == languages[2]); //false
System.out.println(languages[0].equals(languages[2])); //true

⭐️ 리터럴이 같은 문자열은 같은 객체를 참조한다.

⭐️ ==, != 연산자는 객체가 같은 객체인지 다른 객체인지 확인할 수 있다.

⭐️ 문자열을 비교할 때는 equals() 메소드를 사용한다.

배열 복사

배열은 한 번 생성하면 길이를 변경할 수 없다.

더 많은 공간이 필요하다면, 더 큰 길이의 배열을 새로 만들고 이전 배열로 부터 값을 복사해야한다.

1) 기본적인 복사 방법 for문 이용

int[] oldIntArray = {1,2,3};
int[] newIntArray = new int[5];

for (int i=0; i<oldIntArray.length(); i++){
	newIntArray[i] = oldIntArray[i];
}

2) System.arraycopy() 사용

//System.arraycopy(원본배열, 원본 배열 복사 시작 인덱스 , 새 배열, 새 배열 붙여넣기 시작 인덱스, 복사 항목 수);
System.arraycopy(arr1, 0 , arr2, 0, arr1.length);

원본 배열이 arr이고 새 배열이 arr2일 경우, arr의 모든 항목을 arr2에 복사하기 위해 위와같이 메소드를 호출한다.

이때 복사 되는 값은 String 객체의 번지이므로  Stirng 객체는 변함이 없다.

 

배열 항목 반복을 위한 향상된 for문

지금 까지 for문은 Index를 기반으로 접근을 했다.

하지만 Index가 중요하지 않고 배열 전체의 있는 값을 하나씩 가져오고 싶을 경우 Index에 대한 정보가 필요 없다.

for( 타입 변수 : 배열 ) { //타입은 배열 항목의 타입
	실행문;
}

//예제
int[] scores = {95,71,84,93,87};

int sum = 0;
for (int score : scores ){ //5개의 항목이 한번씩 score 변수에 저장되고 누적됨
	sum = sum + score;
}

   

참고자료 : [자바 기초 강의] 이것이 자바다(개정판) 유튜브

'JAVA' 카테고리의 다른 글

클래스  (0) 2023.01.23
열거(Enum) 타입  (0) 2023.01.15
참조 타입, 문자열  (0) 2023.01.15
switch문  (0) 2023.01.07
비교 연산자  (0) 2023.01.05
profile

Hyebin‘s blog

@hyebin Lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그