배열

2025. 9. 15. 17:56카테고리 없음

반응형

배열의 선언과 생성

int[] students; //1. 배열 변수 선언
students = new int[5]; //2. 배열 생성

  • 배열을 사용하려면 `int[] students;` 와 같이 배열 변수를 선언해야 한다.
  • 일반적인 변수와 차이점은 `int[]` 처럼 타입 다음에 대괄호( `[]` )가 들어간다는 점이다.
  • 배열 변수를 선언한다고해서 아직 사용할 수 있는 배열이 만들어진 것은 아니다!
    • `int a` 에는 정수를, `double b` 에는 실수를 담을 수 있다.
    • `int[] students` 와 같은 배열 변수에는 배열을 담을 수 있다. (배열 변수에는 10, 20 같은 값이 아니라 배열이라는 것을 담을 수 있다)

  • 배열을 사용하려면 배열을 생성해야 한다.
  • `new int[5]` 라고 입력하면 오른쪽 그림과 같이 총 5개의 `int` 형 변수가 만들어진다.
  • `new` 는 새로 생성한다는 뜻이고, `int[5]` 는 `int` 형 변수 5개라는 뜻이다. 따라서 `int` 형 변수 5개를 다룰 수 있는 배열을 새로 만든다는 뜻이다.
  • 앞서 `int student1` , `int student2` ... `int student5` 까지 총 5개의 변수를 직접 선언했다. 배열을 사용하면 이런 과정을 한번에 깔끔하게 처리할 수 있다.

배열과 초기화

  • `new int[5]` 라고 하면 총 5개의 `int` 형 변수가 만들어진다. 자바는 배열을 생성할 때 그 내부값을 자동으로
    초기화한다.
  • 숫자는 `0` , `boolean` 은 `false` , `String` 은 `null` (없다는 뜻이다.)로 초기화 된다.

  • `new int[5]` 로 배열을 생성하면 배열의 크기만큼 메모리를 확보한다.
  • `int` 형을 5개 사용하면 `4byte * 5` `20byte` 를 확보한다.
  • 배열을 생성하고 나면 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소)( `x001` )을 반환한다.
  • 여기서 `x001` 이라고 표현한 것이 참조값이다. (실제로 `x001` 처럼 표현되는 것은 아니고 이해를 돕기 위한 예시이다.)
  • 앞서 선언한 배열 변수인 `int[] students` 에 생성된 배열의 참조값( `x001` )을 보관한다.
  • `int[] students` 변수는 `new int[5]` 로 생성한 배열참조값을 가지고 있다.
  • 이 변수는 참조값을 가지고 있다. 이 참조값을 통해 배열을 참조할 수 있다. 쉽게 이야기해서 참조값을 통해 메모리에 있는 실제 배열에 접근하고 사용할 수 있다.
  • 참고로 배열을 생성하는 `new int[5]` 자체에는 아무런 이름이 없다! 그냥 `int` 형 변수를 5개 연속으로 만드는 것이다. 따라서 생성한 배열에 접근하는 방법이 필요하다.
  •  따라서 배열을 생성할 때 반환되는 참조값을 어딘가에 보관해두어야 한다. 앞서 `int[] students` 변수에 참조값( `x001` )을 보관해두었다. 이 변수를 통해서 이 배열에 접근할 수 있다.
System.out.println(students); //[I@4617c264 @앞의 [I는 int형 배열을 뜻한다. @뒤에 16진수
는 참조값을 뜻한다.

배열 사용

인덱스

  • 배열은 변수와 사용법이 비슷한데, 차이점이 있다면 다음과 같이 `[]` 사이에 숫자 번호를 넣어주면 된다. 배열의 위치를
    나타내는 숫자를 인덱스(index)라 한다.

기본형 vs 참조형

  • 자바의 변수 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다. 사용하는 값을 직접 넣을 수 있는 기본
    형, 그리고 방금 본 배열 변수와 같이 메모리의 참조값을 넣을 수 있는 참조형으로 분류할 수 있다.
  • 기본형(Primitive Type): 우리가 지금까지 봤던 `int` , `long` , `double` , `boolean` 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형(Primitive Type)이라 한다.
  • 참조형(Reference Type): `int[] students` 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형(Reference Type)이라 한다. 뒤에서 학습하는 객체나 클래스를 담을 수 있는 변수들도 모두 참조형이다.

배열 리펙토링

  • 리펙토링(Refactoring)은 기존의 코드 기능은 유지하면서 내부 구조를 개선하여 가독성을 높이고, 유지보수를
    용이하게 하는 과정을 뜻한다. 
  • 이는 중복을 제거하고, 복잡성을 줄이며, 이해하기 쉬운 코드로 만들기 위해 수행된다. 리펙토링은 버그를 줄이고, 프로그램의 성능을 향상시킬 수도 있으며, 코드의 설계를 개선하는 데에도 도움이된다.
  • 쉽게 이야기해서 작동하는 기능은 똑같은데, 코드를 개선하는 것을 리펙토링이라 한다.
int[] students = {90, 80, 70, 60, 50}; // 배열 생성과 초기화

2차원 배열

향상된 for문

//향상된 for문, for-each문
for (int number : numbers) {
	System.out.println(number);
}
  • index값이 필요할 때에는 일반 for문을 사용하는 것이 좋다.

퀴즈

  • 배열을 사용하는 주된 이유는 무엇일까요?
    • 동일 타입 변수를 하나의 이름으로 묶어 관리하며, 코드 중복을 줄이고 확장성을 높여줍니다. 개별 변수 방식의 비효율성을 개선하죠.
  • 배열 변수가 기본 타입 변수와 다른 점은 무엇일까요?
    • 배열 변수는 실제 배열 데이터가 있는 메모리 공간의 주소를 가리킵니다. 기본 타입은 변수 자체에 값을 저장하죠.
  • `new int[5]` 코드가 하는 역할은 무엇일까요?
    • `new` 키워드는 메모리 공간을 새로 만드는 역할을 합니다. `int[5]`는 정수 5개를 저장할 연속된 공간을 만든다는 의미입니다.
  • 배열에서 특정 위치의 요소에 접근하려면 무엇을 사용해야 할까요?
    • 배열은 0부터 시작하는 순서 번호인 인덱스를 이용해 각 요소에 접근합니다. 배열 이름 뒤에 대괄호와 인덱스를 사용하죠.
  • 배열의 유효한 범위를 벗어나는 인덱스를 사용하면 어떻게 될까요?
    • 배열은 선언 시 정해진 크기 내에서만 접근해야 합니다. 범위를 벗어나면 실행 중 'ArrayIndexOutOfBoundsException' 예외가 발생합니다.
  • 리팩토링(Refactoring)은 무엇을 의미할까요?
    • 리팩토링은 프로그램의 동작은 유지하면서 코드를 더 읽기 쉽고 유지보수하기 좋게 만드는 작업입니다. 코드의 설계 품질을 높이죠.
  • 2차원 배열 `int[][] arr`에서 전체 행의 개수를 얻으려면 어떻게 해야 할까요?
    • 2차원 배열 `arr`은 여러 개의 1차원 배열(행)을 담고 있습니다. `arr.length`는 이 1차원 배열들의 개수, 즉 행의 수를 반환합니다.
  • 2차원 배열의 각 요소에 접근하며 순회할 때, 행과 열 인덱스를 모두 사용하는 일반적인 반복 구조는 무엇일까요?
    • 2차원 배열은 행과 열, 두 개의 차원을 가지므로, 바깥 for 문이 행을, 안쪽 for 문이 열을 순회하는 이중 for 문이 흔히 사용됩니다.
       
  • 향상된 for 문(for-each loop)을 사용하는 주된 이점은 무엇일까요?
    • 향상된 for 문은 배열의 시작부터 끝까지 순차적으로 요소를 읽어올 때 인덱스 변수를 직접 관리할 필요가 없어 코드가 간결해집니다. 
  • 향상된 for 문을 사용하기 어려운 경우는 언제일까요?
    • 향상된 for 문은 내부적으로 인덱스를 숨기므로, 반복문 내에서 현재 요소의 인덱스 값이 필요한 작업에는 적합하지 않습니다. 이럴 땐 일반 for 문을 씁니다.
       

 

 

 

 

반응형