1. 배열이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 하나의 블록 안에 여러 데이터들을 모아 집합시켜 저장함으로써 데이터를 구조적으로 다루는데 도와준다.
// 각각의 변수로 선언
int a1, a2, a3, a4, a5;
// 5개의 int 값을 저장할 수 있는 배열 생성
int[] a = new int [5];
만약 변수로 선언하게 되면 서로 다른 5개의 int 값 저장 공간이 생성된다.
그러나 배열로 생성하게 되면 a[0] ~ a[4]까지 5개의 int값을 저장할 수 있는 공간이 생성되고, a는 배열을 다루는데 필요한 참조변수, 배열의 주소값을 가지게 된다.
2. 배열의 선언과 생성
1) 배열의 선언
배열의 선언 방법은 원하는 타입의 변수를 선언한 후, 변수 또는 태입에 배열임을 나타내는 대괄호([])를 붙이면 된다.
선언방법 | 예시 |
타입[] 변수이름; | int[] score; String[] name; |
타입 변수이름[]; | int score[]; String name[]; |
2) 배열의 생성
배열을 선언한 다음에는 배열을 생성해야 한다.
배열을 선언하는 것은 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐, 배열을 생성해야 값을 저장할 수 있는 공간이 만들어지는 것이다.
// 해당 타입의 배열 선언(참조변수 선언)
타입[] 변수이름;
// 해당 타입의 배열 생성(실제 저장 공간 생성)
변수이름 = new 타입[길이];
int[] arr1; // int타입의 배열을 다루기 위한 참조변수 arr선언
arr1 = new int[5] // int타입의 값을 5개 저장할 수 있는 배열
int[] arr2 = new int[5]; // 배열의 선언과 생성을 동시에 수행
arr1 = new int[5];
- 연산자 new에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 할당된다.
- 할당된 공간은 자동적으로 int의 기본 값인 0으로 초기화된다.
- 대입연산자 '='에 의해 배열의 주소가 int형 배열 참조변수 arr에 저장된다.
3. 배열의 길이와 인덱스
배열이름[인덱스]의 형색으로 각 요소에 접근할 수 있다.
인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.
(인덱스는 0부터 시작된다. 따라서, 인덱스는 배열의 길이 - 1까지이다. ArrayIndexOutOfBoundsException 에러발생 주의)
- 배열 요소(element) : 배열을 구성하는 각각의 값
- 인덱스(Index) : 배열에서의 위치를 가리키는 숫자
배열의 길이
- 배열의 길이는 배열요소의 개수이다. 그러므로 양의 정수여야 하며 최대값은 int타입의 최대값이다. (길이가 0인 배열도 생성 가능)
- 배열이름.length를 통해 배열 길이에 대한 정보를 얻을 수 있다.
- 이미 생성된 배열의 길이는 변경할 수 없다. 즉, 배열이름.length는 상수이다. 값을 읽을 수만 있고 변경할 수는 없다.
4. 배열 초기화
배열은 생성과 동시에 자동적으로 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만 원하는 값을 저장하기 위해서는 각 요소마다 값을 지정해줘야 한다.
// int 형 배열 선언 & 초기화
int[] score = new int[5]; // int 타입의 값 5개가 저장될 빈 공간 생성
score[0] = 10; // 각 빈공간에 값을 초기화
score[1] = 20;
score[2] = 30;
score[3] = 40;
score[4] = 50;
// for문을 사용한 초기화
for(int i = 0; i < score.length; i++) {
score[i] = 10 * (i + 1);
}
// 처음부터 선언 + 초기화를 한번에 진행
int[] score2 = {10, 20, 30, 40, 50};
// 선언과 생성을 한 라인에서 수행
int[] a = new int[] {0, 1, 2, 3, 4};
// 선언과 생성을 동시에 하는 경우에는 new 타입[] 생략 가능
int[] b = {0, 1, 2, 3, 4};
// 선언과 생성을 따로 수행
int[] c;
c = new int[] {0, 1, 2, 3, 4};
// Error 발생. 선언과 생성을 따로 하는 경우에는 new 타입[]을 생략할 수 없다.
int[] d;
d = {0, 1, 2, 3, 4};
// 길이가 0인 배열 생성
int[] e = new int[0];
int[] f = new int[]{};
int[] g = {};
❓ 선언과 생성을 동시에 하는 경우에는 new 타입[]이 생략가능하다고 했는데 이해가 되질 않았다.
그러나 배열의 특징을 생각해보니 쉽게 이해할 수 있었다. 배열은 길이를 변경할 수 없는 특징을 가지고 있다. 그말은 즉, {0, 1, 2, 3, 4}는 5개의 값이 들어가는 길이 5인 배열이므로 new int[]를 통해 굳이 지정해주지 않아도 된다는 의미이다. (아니면 댓글 달아주세욥.. 😅 )
5. 배열 출력
변수를 출력하듯이 System.out.print()으로 배열 변수를 출력하면 이상한 값이 출력된다.
int[] iArr = {100, 95, 80, 70, 60};
System.out.println(iArr); //[I@7ad041f3
- [I : 배열 integer
- 7ad041f3 : 주소값
이 값은 메모리에 있는 배열의 주소값(타입@주소)을 가리키는 것으로, for문을 이용해서 배열 각 원소들을 순회하여 출력하도록 하드코딩하주거나, 아니면 자바에서 제공하는 Arrays.toString() 메소드를 이용해서 배열을 문자열 형식으로 만들어 출력할 수도 있다.
import java.util.Arrays; // Arrays.toString()을 사용하기 위한 import
class Test{
public static void main(String[] args) {
int[] iArr = {100, 95, 80, 70, 60};
// 루프문으로 직접 배열 원소 출력
for(int i = 0; i < iArr.length; i++) {
System.out.println(iArr[i]);
}
//Arrays.toString() 메서드 사용하여 심플하게 바로 출력
System.out.println(Arrays.toString(iArr)); //[100, 95, 80, 70, 60]
}
}
6. 배열 복사
배열 공간을 확장하고 싶을 때 어떻게 해야할까 ❓
배열은 고정된 크기로, 길이를 변경할 수 없다고 했었다. 만약 배열을 만들고 나서 데이터를 적재하다보니 배열 공간이 부족해질 수 있는 상황이 온다면 확정 시켜주어야 하는데, 어떻게 해결해야 할까?
배열은 한번 선언되고 나면 공간 자체는 직접 늘릴 수는 없기 때문에 간접적인 방법으로 배열을 확장해야 한다.
따라서, 따로 공간이 큰 배열을 새로 만들어 주고, 기존의 배열의 내용을 새로 만든 배열에 복사하는 식으로 배열을 간접적으로 확장해주어야 한다.
배열을 복사하는 방법은 for문을 사용하거나, 자바에서 제공해주는 System.arraycopy()나 Array.copyOf() 메소드를 사용하면 된다.
import java.util.Arrays;
class Test{
public static void main(String[] args) {
int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2 = new int[arr1.length * 2]; // 우선 초기 배열보다 길이가 두배인 새로운 배열을 선언
// 루프문으로 순회하여 복사
for(int i = 0 ; i < arr1.length ; i++) { // arr1의 길이만큼 반복문 실행
arr2[i] = arr1[i]; // arr1배열의 원소값을 순회하며 arr2배열에 저장
}
arr1 = arr2; // 원래의 배열을 가리키고있던 참조변수 arr1이 새로 복사된 arr2 배열을 가리키도록 한다.
}
}
int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2 = new int[arr1.length * 2]
// System.arraycopy() 메소드 사용
System.arraycopy(arr1, 0, arr2, 0, arr1.length); // arr1의 index0부터 arr1.length 전체 길이 만큼 arr2의 index 0 부터 붙여넣는다.
/*
- 첫번째 인자 : 복사할 배열
- 두번째 인자 : 복사를 시작할 배열의 위치
- 세번째 인자 : 붙여넣을 배열
- 네번째 인자 : 복사된 배열값들이 붙여질 시작위치(차례대로 붙여 넣어진다.)
- 다섯번째 인자 : 지정된 길이만큼 값들이 복사된다.
*/
int[] arr1 = {10, 20, 30, 40, 50};
int[] arr2 = new int[arr1.length * 2];
// Arrays.copyOf() 메소드 사용
arr2 = Arrays.copyOf(arr1, arr1.length); // arr1 배열을 arr1.length 전체 길이만큼 복사해서 arr2에 전달
System.out.println(Arrays.toString(arr2)); // [10, 20, 30, 40, 50]
arr2 = Arrays.copyOfRange(arr1, 1, 3); // 배열요소 시작점, 끝점 지정. 1, 2 만 복사해서 반환
System.out.println(Arrays.toString(arr2)); // [10, 20, 30, 40, 50]
얼마전 장바구니 과제에서 객체를 배열에 담으라는 요구사항이 있었다. 기본 타입 외의 배열은 처음이라 헤맸던 기억이 난다. 그래서 객체 배열 사용법을 정리하며 리마인드하고자 한다.
객체 배열의 선언 및 생성 방법
Book 객체 3개를 배열 형태로 만들어 사용하기 위해서 먼저 아래와 같이 코드를 작성하게 되면,
참조변수 b와 Book 객체에 대한 참조변수 3개가 생성된다.
Book[] b = new Book[3];
아직 Book 객체가 만들어진 것은 아니기 때문에, Book 객체를 사용하기 위해서는 아래와 같이 Book 객체를 생성해주어야 한다.
b[1] = new Book();
b[2] = new Book();
b[3] = new Book();
☝️ 위와 같이 객체 배열 생성 코드를 작성하게 되면 그림과 같이 메모리상에 변수들이 할당된다.
1. Book 객체에 대한 클래스 정의
public class Book {
String title;
int price;
public Book() {}
public void showPrice() {
System.out.printf("%s의 가격은 %d원 입니다.", title, price);
}
}
2. Book 객체 배열 생성 및 사용
public class HelloWorld {
public static void main(String[] args) {
Book[] b = new Book[3]; // 객체 배열 선언 및 생성
for(int i = 0; i < b.length; i++) {
b[i] = new Book(); // Book 객체 생성
}
b[0].title = "국어책";
b[0].price = 3000;
b[1].title = "영어책";
b[1].price = 4000;
b[2].title = "수학책";
b[2].price = 5000;
for(int i = 0; i < b.length; i ++) {
b[i].showPrice();
}
}
}
[예제]
1. 객체를 위한 클래스 생성
public class Student{
private String name;
private int age;
public Student() {
}
public student(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2. 객체 배열 선언 및 생성
public class MakeArray{
public static void main(String[] args) {
Student[] student = new Student[5]; // Student 객체 타입의 student 배열 생성
// 기본 생성자로 배열의 공간에 값을 넣는 방법
student[0] = new Student();
student[0].setName("홍길동");
student[0].setAge(12);
// 객체의 변수에 값을 바로 넣어주는 생성자를 이용한 방법
student[i] = new Student("이방인", 13);
}
}
객체 배열의 경우 배열을 생성함녀 변수를 선언한 것이 아니라 변수 이름만 생성된 것으로, set메소드 또는생성자를 이용하여 값을 넣어주어야 한다.
[참고]
☕ JAVA 배열(Array) 완벽 다루기 가이드
배열 자료형 배열(array)은 프로그래밍에서 필수로 등장하는 요소이며 정말 자주 쓰이는 자료형이다. 배열은 하나의 블록안에 여러 데이터들을 모아 집합시켜 저장함으로써 데이터를 구조적으로
inpa.tistory.com
https://jammdev.tistory.com/87
[JAVA] 배열 (Array)
1.배열이란? 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 많은 양의 데이터를 저장하고 이를 다루기 위해 사용한다. 여기서 중요한 것은 같은 타입이어야 한다는 것
jammdev.tistory.com
https://kadosholy.tistory.com/90
[Java] 자바 - 객체 배열 사용법 및 예제
[자바] 객체 배열 사용법 및 예제 자바에서 동일 타입의 여러객체를 생성하여 사용할때는 객체 배열을 사용합니다. 여기에서는 객체 배열 사용시 주의점 및 간단한 예제를 통하여 객체 배열을
kadosholy.tistory.com
'JAVA > STUDY' 카테고리의 다른 글
[Java] Enum 열거형 타입 (0) | 2024.08.09 |
---|---|
[JAVA] 멀티 스레드(1) (2) | 2024.02.15 |
[JAVA] 조건문과 반복문(if, switch, for, while문) (3) | 2024.02.12 |
[JAVA] 자바 변수, 선언, 초기화 (2) | 2024.02.12 |