[윤성우의 열혈 Java 프로그래밍] Chapter 13 - 배열(Array)
카테고리: Java lang
태그: java
13-1. 1차원 배열의 이해와 활용
배열: 자료형이 같은 둘 이상의 값을 저장할 수 있는 메모리 공간
- 1차원 배열의 생성방법
자바는 배열도 ‘인스턴스’로 처리한다.
public class ArrayIsInstance {
public static void main(String[] args) {
// 길이가 5인 int형 1차원 배열의 생성
int[] ar1 = new int[5];
// 배열의 참조변수와 인스턴스 생성 분리
double[] ar2;
ar2 = new double[10];
// 배열 '인스턴스 변수(length)' 접근
System.out.println("배열 ar1의 길이: " + ar1.length);
System.out.println("배열 ar2의 길이: " + ar2.length);
}
}
다음 예시처럼 인스턴스를 저장할 수 있는 배열을 선언하는 방법도 있다.
class Box {
private String conts;
Box(String conts) {
this.conts = conts;
}
public String toString() {
return conts;
}
}
public class ArrayIsInstance2 {
public static void main(String[] args) {
Box[] boxes = new Box[5]; // 길이가 5인 Box형 1차원 배열의 생성
System.out.println("length : " + boxes.length);
}
}
주의해야할 점은
이는 Box 인스턴스 5개를 저장할 수 있는 ‘참조변수의 배열’ 이라는 점이다.
즉, Box 인스턴스의 생성과는 관계가 없고, 위 문장을 통해 5개의 Box 인스턴스를 저장할 수 있는 배열이 생성될 뿐이다.
- 배열을 대상으로 한 값의 저장과 참조
위의 Box 예시로 배열 대상의 값 저장 및 참조 방법을 알아보자.
class Box {
private String conts;
Box(String conts) {
this.conts = conts;
}
public String toString() {
return conts;
}
}
public class BoxArray {
public static void main(String[] args) {
Box[] boxes = new Box[3];
// 배열에 인스턴스 저장
boxes[0] = new Box("One");
boxes[1] = new Box("Two");
boxes[2] = new Box("Three");
// 저장된 인스턴스의 참조
for (int i = 0; i < 3; i++) {
System.out.println(boxes[i]);
}
}
}
- 배열을 생성과 동시에 초기화하기
int[] arr = new int[] {1, 2, 3}; // 첫 번째 방법
int[] arr = {1, 2, 3}; // 두 번째 방법
- 참조변수 선언의 두 가지 방법
int[] ar = new int[3];
int ar[] = new int[3];
- 배열의 참조 값과 메소드
배열도 인스턴스이므로 메소드 호출 시 참조 값의 전달 및 반환이 가능하다.
static int sumOfAry(int[] ar) { // 배열의 참조 값 전달
int sum = 0;
for(int i = 0; i < ar.length; i++)
sum += ar[i];
return sum;
}
static int[] makeNewIntAry(int len) {
int[] ar = new int[len];
return ar; // 배열의 참조 값 반환
}
- 배열의 초기화와 배열의 복사
배열이 생성되면 모든 요소는 0 또는 null로 초기화된다.
따라서 특정 값으로 초기화하고 싶다면 java.util.Arrays에 정의되어있는 다음 메소드를 사용한다.
또, 배열을 복사해야 하는 상황도 종종 생기는데, 이 때는 java.lang.System에 있는 다음 메소드를 사용한다.
코드를 통해 확인해보자!
import java.util.Arrays;
public class ArrayUtils {
public static void main(String[] args) {
int[] ar1 = new int[10];
int[] ar2 = new int[10];
Arrays.fill(ar1, 7); // 배열 ar1을 7로 초기화
// 배열 ar1을 ar2로 부분 복사
System.arraycopy(ar1, 0, ar2, 2, 5); // ar1의 0번 인덱스부터 5개의 요소를 ar2의 2번 인덱스로 부분 복사
for (int i = 0; i < ar1.length; i++) {
System.out.print(ar1[i] + " ");
}
System.out.println();
for (int i = 0; i < ar2.length; i++) {
System.out.print(ar2[i] + " ");
}
}
}
13-2. enhanced for문
enhanced for문은 자바5에서 추가되었다.
for loop의 구조가 파이썬과 유사하게 돌아가니 참고하자.
- enhanced for문의 이해와 활용
배열을 사용하다보면 ‘배열에 저장된 모든 요소들’을 대상으로 연산, 참조 또는 탐색을 진행해야하는 경우를 자주 보게 된다.
이러한 상황의 문장 구성을 돕기 위해 등장한 것이 enhanced for문(for-each문)이다.
int[] ar = {1,2,3,4,5};
// 일반 for문
for(int i = 0; i < ar.length; i++){
System.out.println(ar[i]);
}
// enhanced for문
for(int e : ar){
System.out.println(e);
}
- 인스턴스 배열을 대상으로 하는 enhanced for문
배열에 저장된 내용이 ‘기본 자료형의 값’이 아닌 ‘인스턴스의 참조 값’인 경우에도 달라지는 것은 없다.
class Bucket{
private String contents;
private int bucketNum;
Bucket(int bucketNum, String contents) {
this.bucketNum = bucketNum;
this.contents = contents;
}
public int getBucketNum() {
return bucketNum;
}
public String toString() {
return contents;
}
}
public class EnhancedForInst {
public static void main(String[] args) {
Bucket[] buckets = new Bucket[3];
buckets[0] = new Bucket(101, "Coffee");
buckets[1] = new Bucket(202, "Computer");
buckets[2] = new Bucket(303, "Apple");
// 배열에서 번호가 202인 Bucket을 찾아 그 내용물을 출력하는 반복문
for(Bucket b : buckets){
if(b.getBucketNum() == 202){
System.out.println(b);
}
}
}
}
13-3. 다차원 배열의 이해와 활용
- 2차원 배열의 생성과 접근
이해를 위해 2차원 배열을 선언해보고, 값을 순차적으로 저장해보자!
public class TwoDimenArray {
public static void main(String[] args) {
int[][] ar = new int[3][4];
int num = 1;
// 배열에 값을 저장 및 참조
for (int i = 0; i < 3; i++) { // 행의 수: 3
for (int j = 0; j < 4; j++) { // 열의 수: 4
ar[i][j] = num;
num++;
System.out.print(ar[i][j] + "\t");
}
System.out.println();
}
}
}
- 2차원 배열의 구조
2차원 배열의 실제 구조를 보면 각 행을 담당하는 변수인 arr[0], arr[1], arr[2]들은
각각의 ‘1차원 배열을 참조하는 참조변수’임을 알 수 있다.
따라서, 위의 코드를 다음과 같이 수정할 수 있다.
public class TwoDimenArray {
public static void main(String[] args) {
int[][] ar = new int[3][4];
int num = 1;
// 배열에 값을 저장 및 참조
for (int i = 0; i < ar.length; i++) { // 행의 수: 3 -> ar.length
for (int j = 0; j < ar[i].length; j++) { // 열의 수: 4 -> ar[i].length
ar[i][j] = num;
num++;
System.out.print(ar[i][j] + "\t");
}
System.out.println();
}
}
}
- 2차원 배열의 초기화
1차원 배열과 마찬가지로 다음 방법을 통해 간단히 초기화가 가능하다.
public class PartiallyFilledArray {
public static void main(String[] args) {
int[][] arr = {
{11},
{22, 33},
{44, 55, 66}
};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
댓글 남기기