Java

Chapter 05-2 배열

yeooniyeoon 2022. 11. 14. 03:25
728x90
SMALL

배열

배열은 데이터를 메모리의 연속된 공간에 나열하고 각 데이터에 인덱스를 부여한 자료구조이다.

배열은 같은 타입의 데이터만 저장할 수 있고 한 번 생성된 배열은 길이를 수정할 수 없다.

 

 

배열 변수 선언

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

배열도 참조 타입이기 때문에 힙 영역에 배열 객체 생성 후 그 번지를 변수에 저장한다.

배열 변수를 선언하는 방법은 두가지가 있다.

1. 타입[] 변수

2. 타입 변수[]

 

대괄호는 배열 변수를 선언하는 기호로 변수명 앞이나 뒤에 붙을 수 있다.

 

 

배열 생성

배열을 생성할 때도 값 목록을 사용하거나 new 연산자를 사용하는 두가지 방법이 있다.

 

값 목록으로 배열 생성

타입[] 변수명 = { 값0, 값1, ...};

형식은 위와 같다.

중괄호는 주어진 값들을 항목으로 하는 배열 객체를 힙 영역에 생성 후 배열 객체의 번지를 리턴한다.

 

값 목록으로 배열 생성 시 주의할 점은 배열 변수를 선언한 후 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않는다.

변수를 선언한 뒤에 값을 저장하려면 new 연산자를 사용해야 한다.

 

 

new 연산자로 배열 생성

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

형식은 위와 같다.

new 연산자를 사용하여 배열 생성 시 배열의 각 값들은 자동으로 기본값으로 초기화된다.

int는 0, double은 0.0, String은 null... 처럼 각 타입의 기본값으로 알아서 초기화된다.

 

 

배열 길이

배열의 길이는 배열의 length 속성을 이용하여 구할 수 있다.

 

int len = 배열변수.length;

위처럼 배열 변수에 . 연산자를 붙인뒤 length를 입력하면 된다.

length 필드는 읽기 전용 필드이기 떄문에 값을 변경할 수 없다! ! !

 

 

명령 라인 입력

main() 메소드가 호출되어 실행될 때 String[] args라는 배열이 생성되어 main() 메소드에 전달된다.

프로그램 실행 시 매개값을 주지 않으면 args의 길이는 0이 되며 이는 요소가 없음을 의미한다.

그리고 args에는 요소가 없는 빈 배열 객체의 번지값이 저장된다.

 

프로그램 실행 시 명령라인에 매개값을 주면 main() 메소드 실행 시 args 배열로 생성되어 전달된다.

// 매개값으로 3, 5 전달
public class MainStringArrayArgument {
	public static void main(String[] args) {
    	if(args != 2)	// 전달된 매개값이 2개가 아닐 경우 프로그램 종료
        	System.exit(0);
		int num1 = Integer.parseInt(args[0]);
		int num2 = Integer.parseInt(args[1]);
		
		System.out.println(num1 + num2);	// 결과 : 8
	}
}

 

위 코드는 매개값으로 받은 3과 5를 각각 정수형으로 변환한 뒤 둘의 합을 출력하는 코드이다.

 

System.exit(0) 은 프로그램을 종료시키는 코드로 0을 전달 시 정상 종료되었다는 의미이다.

 

args는 String 배열이므로 전달받은 매개값을 정수형으로 사용하기 위해서는 Integer.parseInt() 메소드를 사용하여 정수형으로 캐스팅 해야한다.

 

 

다차원 배열

자바에서는 다차원 배열을 생성할 때 1차원 배열을 연결하여 만든다.

2차원 배열 변수를 생성하면 일단 행 인덱스 길이만큼 생성된 1차원 배열을 참조하게 된다.

예를 들어 2행 3열인 2차원 배열 변수 arr를 생성할 경우 arr는 길이가 2인 1차원 배열 객체의 번지값을 갖게된다.

그리고 길이가 2인 1차원 배열 객체의 각 요소들은 각각 길이가 3인 1차원 배열 객체를 참조하게 된다.

 

2차원 배열 변수는 행 길이만큼 생성된 1차원 배열 객체를 참조하고, 행에 해당하는 1차원 배열의 요소들은 각 열에 해당하는 배열을 참조하게 되는 것이다.

 

자바는 1차원 배열을 연결하여 다차원 배열을 만들기 때문에 행렬구조가 아닌 계단식 구조로도 생성할 수 있다.

배열의 모든 행의 길이를 다르게하여 배열을 생성할 수도 있는 것이다.

그러나 보통은 행렬 구조를 많이 사용하므로 계단식 구조는 별로 안쓰임~

 

 

객체를 참조하는 배열

참조 타입 배열은 배열 각 항목 안에 값이 직접 저장되지 않고 객체의 번지값을 갖고 있다.

예를 들어 String[] 배열을 생성하면 배열의 각 항목들은 String 변수와 동일하게 취급되어야 한다.

 

 

배열 복사

배열을 복사하는 방법에는 두가지가 있다.

하나는 for문을 사용하여 각 항목을 하나씩 복사하는 방법이고

하나는 System.arraycopy() 메소드를 사용하는 방법이다.

 

System.arraycopy() 메소드 호출 방법은 다음과 같다.

System.arraycopy(원본 배열, 복사를 시작할 인덱스, 복사받을 배열, 붙여넣기 시작할 인덱스, 복사할 길이);

System.arraycopy() 메소드를 사용할 경우 원본 배열을 복사받을 배열에 그대로 복사하게 되는데

그렇기 때문에 복사받은 배열은 원본 배열과 동일한 객체를 참조하게 된다.

int[] arr1 = { 4, 8, 6 };
int[] arr2 = new int[5];
		
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
		
for(int i = 0; i < arr2.length; i++) {
	System.out.println(arr2[i]);
}

위 코드는 arr1을 arr2에 복사한 뒤 arr2의 모든 요소를 출력하는 코드이다.

위에서 말한 것처럼 System.arrarcopy() 메소드를 사용해 배열을 복사할 경우 동일 객체를 참조하게 되므로

arr2는 arr1과 동일한 객체의 번지값을 갖게 된다.

 

 

향상된 for문

자바에서는 배열이나 컬렉션을 더 쉽게 처리하기 위하여 향상된 for문을 제공한다.

향상된 for문은 배열 카운트 변수와 증감식이 없다.

향상된 for문의 형식은 다음과 같다.

for (타입 변수 : 배열) { 실행문 }

이는 타입 변수에 배열의 각 요소가 첫번째부터 차례대로 대입되며 실행된다.

타입 변수에 배열의 마지막 요소가 대입될 때까지 계속 실행되며

타입 변수에 전달할 다음 값이 없으면 for문이 종료된다.

728x90
반응형
SMALL

'Java' 카테고리의 다른 글

&&와 &, ||와 |의 차이  (0) 2023.11.01
Chapter 05-3 열거 타입  (0) 2022.11.16
Chapter 05-1 참조 타입과 참조 변수  (0) 2022.11.10
Chapter 01 자바 시작하기  (0) 2022.11.02
환경변수를 설정하는 이유  (0) 2022.08.18