본문 바로가기

5. 참조타입

5.6.1~5_배열, 배열 선언, 배열길이

배열이란?

-같은 타입의 데이터를 연속된 공간에 저장하는 자료구조

-각 데이터에 인덱스(index)를 부여해놓은 자료 구조

 

예를들어 학생들의 성적은 다음과 같이 배열로 나타 낼 수 있다. 

점수 78 49 90 78 99 84
인덱스 0 1 2 3 4 5

-각 데이터 저장 위치는 인덱스를 부여해서 접근 할 수 있다. 

-배열변수는 참조변수에 속한다. 


배열 읽기

배열이름[인덱스]

위의 score 배열을 예시로 들면

score[2]		//90을 값으로 가진다. 

배열선언

-배열을 사용하기 위해서는 우선 배열을 선언해야 한다. 

 

-배열 변수 선언은 다음 두 가지 형태로 작성 할 수 있다. 

타입[] 변수;
타입 변수[];

보통 위의 방법이 일반적이다. 

 

<배열선언 예시>

int[] intArray;
int[] doubleArray;
String[] stringArray;

-배열도 객체이므로 힙 영역에 생성되고, 배열 변수는 힙 영역의 배열 객체를 참조하게 된다. 

ㄴ위의 예시에서 intArray, doubleArray, stringArray는 heap 영역에 있는 번지를 저장한다. 

 

-참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화 될 수 있다. 

-배열 변수는 배열을 생성하고 참조하는 상태에서 값을 저장하거나 읽어야 한다. 

 


값 목록으로 배열 생성

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

-데이터타입과 값의 데이터타입은 일치해야 한다. 

-{값1, 값2..}값들을 항목으로 가지는 배열 객체를 힙에 생성하고,

stack 영역에 저장된 참조변수는 배열 객체의 번지를 리턴한다. 

String[] cafe = {"블랙업", "스타벅스", "이디야"};

여기서 "블랙업"은 cafe[0]으로 읽히고, "스타벅스"는 cafe[1]로 읽힌다. 

 

-블랙업을 할리스로 바꾸고 싶다면 대입연산자(=)를 사용하면 된다. 

cafe[0] = "할리스";

주의사항

배열 변수를 이미 선언 한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용하지 않는다. 

타입[] 변수;
변수 = {값1, 값2,...};		//컴파일에러

(X)

배열 변수를 미리 선언 한 후에 값 목록이 나중에 결정되는 상황이라면 new연산자를 사용해야 한다.

밑의 설명 참조↓


배열 변수 선언(new 연산자)

-배열 변수를 미리선언 한 후, 값 목록들이 나중에 결정되는 상황

타입[] 변수;
변수 = new 타입[] {값1, 값2,...};
String[] names = null;
names = new String[] = {"백자바", "김자바"};

 

또 다른 방법(밑의 new 연산자로 배열생성2를 참고)

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

 


메소드의 매개값이 배열일 경우

-매개변수 자리에 (중괄호) 값 목록으로 배열을 생성함과 동시에 new 연산자를 사용해야 한다. 

 

학생들의 점수를 다 더하는 메소드를 만들어보자. 

int add(int[] scores) {
	...//메소드식
}

 정수를 리턴하는 add 라는 메소드에 점수 정보를 담고 있는 정수타입 배열 scores를 매개변수를 넣는다. 

 

int result = add(new int[] {95, 85, 90});

괄호 자리에 new 연산자가 없다면 컴파일 에러가 난다. 


배열생성 예시

public class ArrayCreateByValueListExample2 {
	public static void main(String[] args) {
		
        //new 생성자를 이용한 배열생성(배열 변수 먼저 만든 후 값을 나중에 저장할 때)
        int[] scores;
		scores = new int[] { 83, 90, 87 };	
        
        //for문을 이용해서 총합 구하기
		int sum1 = 0;
		for(int i=0; i<3; i++) {
			sum1 += scores[i];
		}
		System.out.println("총합 : " + sum1);	
        
        //리턴된 총 합을 add2에 저장
		int sum2 = add( new int[] { 83, 90, 87 } );		//new를 쓰지 않으면 컴파일 에러 
		System.out.println("총합 : " + sum2);	
		System.out.println();
	}
	
   		 //점수를 더하는 add메소드
		public static int add(int[] scores) {
		int sum = 0;
		for(int i=0; i<3; i++) {
			sum += scores[i];
		}
		return sum;
	}
}

 

실행결과: 

총합:260

총합:260


배열생성 (new 연산자2)

-값의 목록을 가지고 있지 않지만, 나중에 값들을 저장할 배열을 만들고 싶다면 new연산자를 사용해야 한다. 

-길이를 미리 정해야 한다. 

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

 

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

변수[인덱스] = 값;

 

 

길이가 5이고 정수를 받는 배열 intArray를 생성 해보자. 

int[] intArray = new int[5]; 

자바는 intArray[0] ~ intAraay[4]까지 값이 저장 될 수 있는 공간을 확보하고, 배열의 생성 번지를 리턴한다.

리턴된 번지는 intArray 변수에 저장된다. 

 

<Stack>

intArray

 

<Heap>

인덱스 intArray[0] intArray[1] intArray[2] intArray[3] intArray[4]
확보된 공간 4byte(=1int) 4byte 4byte 4byte 4byte

-new 연산자로 배열을 처음 생성 할 경우 배열은 자동적으로 기본값으로 초기화 됨

위의 예시를 예로 들면,

인덱스 intArray[0] intArray[1] intArray[2] intArray[3] intArray[4]
확보된 공간 4byte(=1int) 4byte 4byte 4byte 4byte
0 0 0 0 0

 

-만약 String 배열을 생성했다면 모두 null값으로 초기화 된다. 


예시

public class ArrayCreatByNewExample {
	public static void main(String[] args) {
		
		int[] arr1 = new int[3];	//길이가 3인 배열 생성
		for(int i=0; i<3; i++) {
			System.out.println("arr1[" + i + "] : " + arr1[i]);
		}
		
		//new 연산자로 만든 배열에 값 넣기
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[2] = 30;
		
		for(int i=0; i<3; i++) {
			System.out.println("arr1[" + i + "]: " + arr1[i] );
		}
		
		//new 연산자로 생성한 double타입의 길이가 3인 배열 생성
		double[] arr2 = new double[3];
		
		for(int i = 0; i<3; i++) {
			System.out.println("arr2[" + i + "]: " + arr2[i]);
		}
		
		//new 연산자로 만든 배열에 값 넣기
		arr2[0] = 0.1;
		arr2[1] = 0.2;
		arr2[2] = 0.3;
		
		for(int i=0; i<3; i++) {
			System.out.println("arr2[" + i + "]: " + arr2[i]);
		}
		
		//new 연산자로 생성한 String 타입의 길이가 3인 배열 생성
		String[] arr3 = new String[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr3[" + i + "]: " + arr3[i]);
		}
		
		//new 연산자로 만든 배열에 값 넣기
		arr3[0] = "1월";
		arr3[1] = "2월";
		arr3[2] = "3월";
		
		for(int i=0; i<3; i++) {
			System.out.println("arr3[" + i + "]: " + arr3[i]);
		}


	}

}

실행결과

arr1[0] : 0
arr1[1] : 0
arr1[2] : 0
arr1[0]: 10
arr1[1]: 20
arr1[2]: 30
arr2[0]: 0.0
arr2[1]: 0.0
arr2[2]: 0.0
arr2[0]: 0.1
arr2[1]: 0.2
arr2[2]: 0.3
arr3[0]: null
arr3[1]: null
arr3[2]: null
arr3[0]: 1월
arr3[1]: 2월
arr3[2]: 3월

 


배열길이

배열에 저장할 수 있는 전체 항목 수

배열변수.length

-final 필드다 = 읽기전용(값을 바꿀 수 없다)

-for문을 사용해서 배열 전체를 루핑 할 때 유용하게 사용


public class ArrayLengthExample {

	public static void main(String[] args) {
		int[] scores = { 83, 90, 87 };
		
		int sum = 0;
		for (int i=0; i<scores.length; i++) {
			sum += scores[i];
		}
		System.out.println("총합: " + sum);
		
		double avg = (double) sum / scores.length;
		System.out.println("평균: " + avg);

	}

}

 

 

실행결과 :

총합: 260
평균: 86.66666666666667

'5. 참조타입' 카테고리의 다른 글

5.6.10_ 향상된 for문  (0) 2020.05.01
5.6.8_객체를 참조하는 배열  (1) 2020.04.30
5.6.7_다차원 배열  (0) 2020.04.30
5.6.6_커맨드 라인 입력  (0) 2020.04.30
5.1_ 데이터 타입 분류  (0) 2020.04.18