본문 바로가기
JAVA

[JAVA] Chapter 10. Array

by varcode 2023. 7. 12.

자바에서는 배열과 컬렉션(Collection) 두 가지 저장소를 사용한다. 배열의 크기가 정해져 있고, 인덱스를 사용하여 요소에 접근할 수 있으며, 연속된 메모리 공간에 요소를 저장하기 때문에 데이터의 접근이 빠르고 효율적이다. 그러나 배열은 크기를 동적으로 변경할 수 없으므로 초기에 지정한 크기보다 더 많은 데이터를 저장할 수 없다.

 

① What is Array?

배열은 반복문을 사용할 때 유용하게 사용되는데, 반복문을 사용할 때는 고려해야 할 사항들이 있다.
1)
반복문 내부에 들어오는 코드는 코드의 변화 없이 값만 변화해야 한다. 따라서 이름이 다른 변수가 많을 때는 반복문을 사용할 수 없다.
2) for
문 내부에 들어오는 데이터는 반드시 순서를 가지고 있어야 한다.

 

배열을 저장소 관점으로 접근할 때는 다음과 같은 사항들을 고려해야 한다.
-
저장소를 만드는 방법
-
저장소에 데이터를 넣는 방법
-
저장소에서 데이터를 빼는 방법

int[] arr = new int[5];

배열은 위와 같은 방식으로 생성할 수 있다. “int type의 일차원 배열을 만드는데, 방을 5개짜리로 만들어주세요.”라는 의미이다.

new를 사용한다는 것은 인스턴스를 생성하는 것이다. Java에서는 배열을 인스턴스로 본다. 메모리에 올라갔으니 주소를 받아와서 자바에서 제공하는 참조형 타입 중 array 타입에 배열의 주소를 저장한다. 따라서 arr는 배열의 이름이자 reference 변수가 된다.

- 자바에서 배열의 각 요소가 객체의 주소를 가지고 있는 배열을 Instance Array라고 부르지만, 저장소 안에 인스턴스를 저장하는 것이 아니라 인스턴스의 주소를 저장하는 것이다.
- []
앞에 기본 데이터 타입이 뜨면 기본 데이터 값을 저장하고, [] 앞에 클래스 타입이 뜨면 해당 클래스로 생성된 인스턴스의 주솟값을 저장한다.
-
배열을 선언과 동시에 초기화할 때 사용하는 중괄호 뒤에는 ;을 붙여야 한다.

 

② length
배열의 크기를 알고 싶을 때는 length라는 키워드를 사용하지만, length는 메서드가 아니므로 중괄호 ()를 사용해서는 안 된다. 그런데, arr.length라고 쓴다는 것은 length가 변수라는 뜻일까? String에서는 메서드였는데? 그렇다, Array type에서 length는 배열의 크기를 나타내는 변수이고, String 클래스에서는 문자열의 길이를 반환하는 메서드이다.

 

③ Call By Value vs Call By Reference
parameter로 배열을 넘겨줄 때, 배열 전체를 복사해서 넘겨줘야 할까? 배열의 이름은 곧 주솟값이기 때문에 주소를 넘겨주면 된다. 이를 call by reference라고 한다. (모든 프로그래밍 언어에서 배열의 이름은 주솟값이지만, 특성은 조금씩 다르다. 예를 들어 C 언어에서는 포인터를 상수로 취급한다.)

Call by valuecall by reference는 메서드가 인자를 전달하는 방식에 대한 용어이다. Call by value는 메서드가 인자로 전달받은 값을 복사하여 처리하기 때문에 원본 값이 변경되지 않는다. 하지만 Call by reference는 메서드가 인자로 전달받은 객체의 주솟값을 참조한다. 따라서 Call by reference에서는 메서드 내부에서 객체의 내용을 변경할 수 있다.

 

이차원 배열
이차원 배열은 결국 일차원 배열의 확장이다.
- arr.length : 이차원 배열을 만들 때 사용된 일차원 배열의 개수
- arr[i].length : 이차원 배열을 만들 때 사용된 각각의 일차원 배열의 길이

위와 같은 상황에서 arr[i].length는 왼쪽이 각각 4, 4, 4이고 오른쪽이 각각 2, 3, 4이다.

초기화 방식과 언어에 따라 다르지만, 일반적으로 오른쪽과 같은 방식으로 초기화하게 되면 X에 해당하는 값은 0으로 출력된다. 하지만 Java에서는 0이 아니라 ArrayIndexOutOfRangeException이 뜬다. 각 행의 길이가 서로 다른 배열을 자바에서는 ragged array라고 부른다.

 

⑤ for each : 배열은 아닌데 배열과 같이 등장하는 내용 1
for each
java5에서 처음 등장한 반복문으로, 배열이나 컬렉션의 요소를 순회하는 데 사용된다. for each 반복문은 다음과 같은 구조를 가진다.

for (데이터 타입 변수명 : 배열 또는 컬렉션) {
    // 반복 실행할 코드
}

for each 문은 부분 반복이 안된다.

 

⑥ main 메서드 : 배열은 아닌데 배열과 같이 등장하는 내용 2

public static void main(String[] args) {
    // code
}

main 메서드를 살펴보면, 파라미터로 String type의 일차원 배열을 전달받는다. Java에서 main 메서드는 JVM(Java Virtual Machine)이 프로그램을 실행할 때 자동으로 호출한다. main methodJVM이 호출한다면, 파라미터는 어떻게 전달할 수 있을까?

Java 파일을 컴파일할 때는 ‘javac’ 명령어를 사용한다. 컴파일이 성공하면 같은 디렉터리에 .class 파일이 생성된다. 이 파일은 JVM에서 실행할 수 있는 Java bytecode로 변환된 파일이다. 파일은 java [filename] [parameter]의 형태로 실행할 수 있다.
eclipse
에서도 파라미터를 전달할 수 있다. eclipse에서는 저장 버튼을 누르면 compile을 하고, Run > Run Configurations > Arguments에서 인자를 넣어줄 수 있다. 하지만 현업에서는 client가 요청을 주는 곳이 시작점이기 때문에, 실제 class 안에는 main 메서드가 없는 경우가 많다.

'JAVA' 카테고리의 다른 글

[JAVA] Chapter 11. Inheritance (2)  (0) 2023.07.14
[JAVA] Chapter 11. Inheritance (1)  (0) 2023.07.13
[JAVA] Chapter 9. String  (0) 2023.07.11
[JAVA] Chapter 8. Class Variable & Class Method  (0) 2023.07.10
[JAVA] Chapter 7. Class (3)  (0) 2023.07.09

댓글