본문 바로가기

Java

Java- 배열

배열의 생성

//둘다 가능
int[] arr1 = new int[5];  
int arr2[] = new int[5];

배열을 생성하는 방법은 위와 같다. 중괄호 위치는 둘다 가능하다.

 

배열은 여러개의 인스턴스를 생성하지 않는다

int iArr[] = new int[10];  //10개의 int형 데이터를 담을 수 있는 참조변수 10개 생성
String[] sArr = new String[5]; //5개의 String형 인스턴스를 담을 수 있는 참조변수 5개 생성
IMadeClass cArr[] = new IMadeClass[20]; //20개의 IMadeClass 인스턴스를 담을 수 있는 참조변수 20개 생성

 배열 그 자체로는 배열 인스턴스가 맞지만, arr[1], arr[2] .. 처럼 각각의 공간이 인스턴스는 아니다.  

배열의 생성에서 중요한 것은 배열은 해당 데이터나 인스턴스를 담을 수 있는 공간, 즉 참조변수들을 생성하는 것이지

이것 자체가 인스턴스를 생성하지는 않는다는 것이다. 배열은 처음에 0 또는 null로 초기화 된다.

 

class Box{
    private String data;
    Box(String data){
        this.data = data;
    }
    Box(){
        this("ABCD");
    }
    void setData(String data){
        this.data = data;
    }
    public String toString(){  //Box.data를 출력하기 위한 구현
        return data;
    }
}
public class 배열 {
    public static void main(String[] args) {
        Box box[] = new Box[100];
        //box[]는 Box 인스턴스를 100개 담을수 있는 참조변수의 배열이지 인스턴스가 아니다!

        box[0] = new Box("123");  //box[0]에 인스턴스를 넣어줌

        System.out.println(box.length);
        System.out.println(box[0]);  //box[0]에는 인스턴스가 들어갔음.
        System.out.println(box[1]);  //box[1]은 인스턴스가 아닌 비어있는 공간임.
    }
}


100
123
null

  위 코드에서 마지막 출력문을 보면 null이 나옴을 확인할 수 있다. 만일 배열을 생성한 당시 각 배열마다 인스턴스가 생성이 되었다면 기본 생성자가 실행 되어서 모든 인스턴스들의 멤버변수 data는 "ABCD"로 초기화가 되었을 것이다.

그러나 null이 출력됨으로 보아 이는 배열의 생성이 인스턴스의 생성과 관계가 없다라는 것을 알 수 있다.

  단지 인스턴스들을 담을 수 있는 공간, 더 정확히는 참조변수들을 생성한 것이다.

 

배열을 대상으로 한 값의 저장과 참조

class Box2{
    private String data;
    Box2(String data){
        this.data = data;
    }
    Box2(){
        this("ABCD");
    }
    void setData(String data){
        this.data = data;
    }
    public String toString(){ 
        return data;
    }
}
public class 배열 {
    public static void main(String[] args) {
        Box2 box[] = new Box2[3];
        
        for(int i=0; i<box.length; i++){
            box[i] = new Box2();  // 배열에 인스턴스를 집어넣음
            System.out.println(box[i]);
        }
    }
}

ABCD
ABCD
ABCD

  내부의 for문을 통해서 3개의 인스턴스를 생성하고 있음을 확인할 수 있다. 

type 배열[idx] = new type(..); 과 같은 방법으로 새로운 인스턴스를 각 배열 인덱스에 생성할 수있다.

 

 생성과 동시에 초기화

int[] arr = {1,2,3};
String[] sArr = {"홍익대학교","정보","컴퓨터","공학과"};

 

배열 메소드

 채워 넣기 ( fill 메소드 )

  -Arrays.fill(type[ ] a, type val)

  -Arrays.fill(type[ ] a, int fromIndex, int toIndex, type val)

import java.util.Arrays;   //Import 필요

public class FillMethod {
    public static void main(String[] args) {
        int[] a = new int[3];
        Arrays.fill(a,7);  //처음부터 끝까지 배열 a를 7로 채움

        for(int num: a){
            System.out.print(num+", ");
        }
        System.out.println();

        String[] b = new String[4];
        Arrays.fill(b,1,3,"Hello");  //1번부터 2번까지 배열 b를 "Hello"로 채움
        for(String str: b) {
            System.out.print(str + ", ");
        }
    }
}

7, 7, 7, 
null, Hello, Hello, null,

 

 배열끼리 복사하기

  -System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  • 복사 원본의 위치: 배열 src의 인덱스 srcPos
  • 복사 대상의 위치: 배열 dest의 인덱스 destPos
  • 복사할 요소의 수: length
public class ArraysCopyMethod {
    public static void main(String[] args) {
        int a[] = {0,1,2,3,4,5,6,7,8,9};
        int b[] = new int[10];

        System.arraycopy(a,3,b,4,5);  //a의 3번 내용부터를 b의 4번위치 부터 5개 복사
        for(int num:b){
            System.out.print(num+" ");
        }
    }
}

0 0 0 0 3 4 5 6 7 0

 

2차원 배열에서 length

  •  int arr[3][4]에서 arr.length 3이다
  • int arr[5][14]에서 arr.length5이다.
  • int arr[5][12]에서 arr[3].length12이다.

int arr[3][4];

arr[2] = new arr[10]; 에서 arr[2].length는 10이다.

'Java' 카테고리의 다른 글

Java- Object 클래스  (0) 2022.12.29
Java- 상속  (0) 2022.12.29
Java- 콘솔 입출력  (0) 2022.12.27
Java- 문자열 결합의 최적화(StringBuilder 클래스)  (0) 2022.12.27
Java- 메소드 오버로딩과 this  (0) 2022.12.26