배열(Array)

민범·2023년 12월 18일

Java -기본-

목록 보기
11/18

배열이 필요한 이유

int student1 = 90;
int student2 = 80;
int student3 = 70;
  • 학생이 3명인데 여기서 학생이 더 추가된다면 간단하게 개발자가 코딩으로 해결할 수 있으나, 학생이 수백, 수천 명이 된다면 코드가 상당히 많이 늘어나고 결국 증가수에 따라 코딩의 양이 비례해서 비슷한 변수를 반복해서 선언해야 한다는 문제가 발생한다.
  • 반복문으로 해결할 수 있을것 같지만, 변수명은 중복이 안되므로 반복문도 사용할 수가 없다.
  • 이렇게 비슷한 타입의 변수가 반복할때 편리하게 처리할수 있는것이 배열이다.

배열의 선언

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

배열의 사용

  • 배열을 사용하려면 배열을 생성해야 한다.
  • new int[3]라고 입력하면 총 3개의 int형 변수가 만들어진다.
  • new는 새로 생성한다는 뜻이고, int[3]int형변수 3개라는 뜻이다.
  • 앞서 int student1, .... int student3 까지 총 3개의 변수를 만들었는데 배열을 사용하면 이런 과정을 깔끔하게 처리할 수 있다.

배열의 초기화

  • 자바는 배열을 생성할 때 그 내부값을 자동으로 초기화 한다.
  • 숫자는 0,booleanfalse, Stringnull(없다는 뜻)로 초기화 한다.

배열의 참조값 보관

  • new int[3]와 같이 5개의 요소를 가지는 int형 배열을 만들었다면 인덱스는 0,1,2가 존재한다. 여기서 주의해야할점은 인덱스는 0부터 시작한다. 그래서 사용가능한 인덱스 범위는 0 ~ (n-1)이 된다.
  • 만약 접근 가능한 배열의 인덱스 범위를 넘어가면 다음과 같은 오류가 발생한다.

배열에 값 대입

  • 배열에 값을 대입하든 배열의 값을 사용하든 간에 일반적인 변수와 사용법은 같다. 추가로 []을 통해 인덱스만 넣어주면 된다.
students[0] = 90; //배열에 값을 대입
x001[0] = 90; //변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입
students[1] = 90; //2번째 인덱스에 값을 대입

기본형 vs 참조형

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

참고

  • 배열은 왜 이렇게 복잡하게 참조형을 사용할까?
int i; //4byte
double d; //8byte
***
int size = 10000; //사용자가 입력한 값을 넣었다고 가정해보자
new int[size]; //이 코드가 실행되는 시점에 배열의 크기가 정해짐
  • 기본형은 선언과 동시에 크기가 정해진다. 따라서 크기를 동적으로 바꾸거나 할 수는 없다. 반면에 앞서본 배열과 같은 참조형은 크기를 동적으로 할당할 수 있다. 예를 들어서 Scanner를 사용해서 사용자 입력에 따라 변수의 값이 변하고, 생성되는 배열의 크기도 달라질 수 있다. 이것을 동적 메모리 할당이라 한다.
  • 기본형은 사용할 값을 직접 저장하는 반면 참조형은 메모리에 저장된 배열이나 객체의 참조를 저장한다. 이로 인해 참조형은 더 복잡한 데이터 구조를 만들고 관리할수 있다. 반면 기본형은 더 빠르고 메모리를 효율적으로 처리한다.

배열 리펙토링 - 변수값 사용

  • 리펙토링(Refactioring)은 기존의 코드 기능은 유지하면서 내부 구조를 개선해 가독성을 높이고, 유지보수를 용이하게 하는 과정을 뜻한다. 이는 중복을 제거하고, 복잡성을 줄이며, 이해하기 쉬운 코드로 만들기 위해 수행하는 과정이다. 쉽게 이야기 하면 작동하는 기능은 같으며, 코드를 개선하는 것이라고 이해하면 된다.
int[] students; //배열 변수 선언
students = new int[5]; //배열 생성
***
students[0] = 90;
students[1] = 80;
students[2] = 70;
students[3] = 60;
students[4] = 50; //for문으로 간단히 해결
***
for (int i = 0; i< students.length; i++) {
	System.out.println("학생" + (i + 1) + "점수: " + students[i]);
    }
  • 반복문을 사용해서 배열을 통해 값을 사용하는 부분을 효과적으로 변경했다.
  • 배열의 인덱스는 0부터 시작하기 때문에 반복문에서 i=0을 초기값으로 사용했다.
  • students.length
    -> 배열의 길이를 제공하는 특별한 기능이다.
    -> 참고로 이 값은 조회만 할 수 있다. 대입은 할 수는 없다.
    -> 현재 배열의 크기가 5이기 때문에 여기서는 5가 출력된다.
  • for문의 조건이 i < students.length이기 때문에 i0, 1, 2, 3, 4까지만 반복한다.
    -> i가 5가 되면 5 < 5가 되면서 조건이 거짓이 되고, 반복을 종료한다.

배열 리펙토링 - 간단한 배열 생성

  • 배열은 {}만 사용해서 생성과 동시에 편리하게 초기화 하는 기능을 제공한다.

배열의 편리한 초기화

int[] students = {90, 80, 70, 60, 50};

  • 자바가 내부에서 배열 요소의 크기를 보고 new int[5]을 사용해서 배열을 생성한다. 따라서 기존 코드를 조금 더 편리하게 사용할 수 있는 편의 기능이라 생각하면 된다.
//배열 생성 간략 버전, 배열 선언과 함께 사용시 new int[] 생략 가능
int[] students = {90, 80, 70, 60, 50};
for (int i = 0; i< students.length; i++) {
	System.out.println("학생" + (i + 1) + "점수: " + students[i]);
    }
profile
웹 백엔드 개발자를 지향하고 있습니다.

0개의 댓글