배열이 필요한 이유? 같은 타입의 변수를 하나로 묶어서 사용이 가능하기 때문
배열은 하나의 변수에 여러 데이터를 정리정돈해서 담아두기 위한 자료 구조로, 이를 통해 여러 정보를 효율적으로 다룰 수 있기 때문에 필요하다.
- 중복해서 변수를 선언하지 않아도 되고, 메모리 절약이 가능하다.
- 코딩 코드를 줄일 수 있다.
배열은 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것이다.
int[] foods;
int[] foods;
와 같이 배열 변수를 선언해야 한다.int[]
처럼 타입 다음에 대괄호( []
)가 들어간다는 점이다. int a
에는 정수를, double b
에는 실수를 담을 수 있다.int[] foods
와 같은 배열 변수에는 배열을 담을 수 있다. (배열 변수에는 10, 20 같은 값이 아니라 배열이라는 것을 담을 수 있다)foods = new int[5]
new int[5]
라고 입력하면 오른쪽 그림과 같이 총 5개의 int
형 변수가 만들어진다.new
는 새로 생성한다는 뜻이고, int[5]
는 int
형 변수 5개라는 뜻이다. 따라서 int
형 변수 5개를 다룰 수 있는 배열을 새로 만든다는 뜻이다.자바는 지역변수와는 다르게 생성하면 자동으로 초기화를 해준다.
new int[5]
라고 하면 총 5개의int
형 변수가 만들어진다. 자바는 배열을 생성할 때 그 내부값을 자동으로 초기화한다.- 숫자는
0
,boolean
은false
,String
은null
(없다는 뜻이다.)로 초기화 된다.3. 배열 참조값 보관
foods = x001; //배열 참조값 보관
배열의 크기만큼 메모리를 확보한다.
-new int[5]
로 배열을 생성하면 배열의 크기만큼 메모리를 확보한다. => int형은 4byte니까 4byte * 5 -> 20byte 확보
- 배열을 생성하고 나면 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소값)(
x001
)을 반환한다.- 앞서 선언한 배열 변수인
int[] foods
에 생성된 배열의 참조값(x001
)을 보관한다.int[] foods
변수는new int[5]
로 생성한 배열의 참조값을 가지고 있다.
배열은 변수와 사용법이 비슷한데, 차이점이 있다면
[]
사이에 숫자 번호를 넣어주면 된다. 배열의 위치를 나타내는 숫자를 인덱스(index)라 한다.
//변수 값 대입
foods[0] = 90;
foods[1] = 80;
//변수 값 사용
System.out.println("음식1 점수: " + foods[0]);
System.out.println("음식2 점수: " + foods[1]);
new int[5]
와 같이 5개의 요소를 가지는 int
형 배열을 만들었다면 인덱스는 0,1,2,3,4
가 존재한다.
배열에 값을 대입하든 배열의 값을 사용하든 간에 일반적인 변수와 사용법은 같다. 추가로
[]
를 통해 인덱스만 넣으면 된다.
foods[1] = 80; //1. 배열에 값을 대입
x001[1] = 80; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입
배열을 사용하면 이렇게 참조값을 통해서 실제 배열에 접근하고 인덱스를 통해서 원하는 요소를 찾는다.
//1. 변수 값 읽기
System.out.println("음식1 점수: " + foods[0]);
//2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근
System.out.println("음식1 점수: " + x001[0]);
//3. 배열의 값을 읽어옴
System.out.println("음식1 점수: " + 90); ```
리펙토링(Refactoring)은 기존의 코드 기능은 유지하면서 내부 구조를 개선하여 가독성을 높이고, 유지보수를 용이하게 하는 과정을 뜻한다. 이는 중복을 제거하고, 복잡성을 줄이며, 이해하기 쉬운 코드로 만들기 위해 수행된다. 즉, 코드를 개선하는 것을 뜻함
//변수 값 사용
System.out.println("학생1 점수 " + students[0]);
System.out.println("학생2 점수 " + students[1]);
System.out.println("학생3 점수 " + students[2]);
System.out.println("학생4 점수 " + students[3]);
System.out.println("학생5 점수 " + students[4]);
위의 코드는 변수명이 students
로 같기 때문에 숫자가 반복되는 부분을 리팩토링 할 수 있다.
//for문 사용
for (int i = 0; i < 5 ; i++) {
System.out.println("학생" + (i+1)+ " 점수 " + students[i]);
}
반복문을 사용해서 배열을 통해 값을 사용하는 부분을 변경했다.
배열은
{}
만 사용해서 생성과 동시에 편리하게 초기화 하는 기능을 제공한다.
int[] students;
students = new int[]{90, 80, 70, 60, 50}; //배열 생성과 초기화
students = new int[5];
로 표현한 부분을 students = new int[]{90, 80, 70, 60, 50};
게 적음으로서 배열의 생성과 초기화가 한번에 가능하다
int[] students = {90, 80, 70, 60, 50}; //배열 생성과 초기화
이렇게 적으면 배열의 생성과 초기화를 더 간략히 적을 수 있다.
아래처럼은 안 된다. 변수의 선언과 동시에 적어야함
int[] students; students = {90, 80, 70, 60, 50};
2차원 배열은 하나의 차원이 추가되어 있는 배열로, 행과 열로 구성된다.
2차원 배열은int[][] arr = new int[2][3]
와 같이 선언하고 생성한다.
arr[1][2]
와 같이 사용하는데, 먼저 행 번호를 찾고, 그 다음에 열 번호를 찾으면 된다.
행은 영어로 row(로우), 열은 영어로 column(컬럼)이라 한다.
arr[행][열]
, arr[row][column]
아래의 방법으로 쉽게 선언이 가능하다
int[][] arr = new int[][]{ {1, 2, 3}, {4, 5, 6} }; //행2, 열3
2차원 배열은 {{1, 2, 3},{4, 5, 6}}
괄호를 하나 더 묶어서 초기화한다.
{{},{}}
를 생각해보면 arr
배열은 {}
, {}
2개의 배열 요소를 가진다.