dohun.log

[Java]05.참조 타입 본문

Study/Java

[Java]05.참조 타입

dohun31 2022. 1. 18. 16:05

배열

배열이란 같은 타입의 데이터를 연속된 공간나열시키고, 각 데이터에 인덱스(index)를 부여해 놓은 자료구조

 

다음과 같은 4명의 학생의 점수를 담은 score 배열이 있다고 하자.

인덱스 0 1 2 3
데이터 83 90 87 93

score 배열의 각 인덱스는 각 항목의 데이터를 읽거나, 저장하는데 사용되고 다음과 같이 배열 이름 옆에 대괄호 []에 기입된다.

score[인덱스]

이렇게 성적을 배열로 만들면 평균값은 for문을 사용하여 쉽게 구할 수 있다.

int sum = 0;
for(int i = 0; i < 4; i++) {
    sum += score[i];
}
int avg = sum / 4;

 

❓ 배열은 같은 타입의 데이터만 저장할 수 있다. → 다른 타입의 값을 저장하려고 하면 타입 불일치(Type mismatch) 컴파일 오류 발생

❓ 프로그램 실행 도중 배열의 길이는 수정할 수 없다. → 길이를 수정하려면 새로운 배열을 생성하고, 기존 배열을 새 배열로 복사시켜야 함

 

배열 선언

배열을 사용하기 위해서는 배열 변수를 선언해야한다.

 

다음과 같이 두 가지 형태로 작성할 수 있다.

1. 타입[] 변수;
2. 타입 변수[];
// 1.
int[] intArray;
double[] doubleArray;
String[] strArray;

//2.
int intArray[];
double doubleArray[];
String strArray[];

 

❓ 배열 변수는 참조 변수에 속한다. → 힙 영역에 생성

 

값 목록으로 배열 생성

배열 항목에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열 객체를 만들 수 있다.

데이터타입[] 변수 = {값0, 값1, 값2, 값3, ...};
String[] names = {"신용권", "홍길동", "감자바"};

 

감자바 이름을 박자바로 바꾸고 싶다면 다음과 같이 대입 연산자를 사용하면 된다.

names[2] = "박자바";

 

❓ 배열을 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성은 허용되지 않는다. → new 연산자를 사용해서 값 목록을 지정해주면 된다.

타입[] 변수;
변수 = {값0, 값1, 값2, 값3, ...}; // 컴파일 에러
변수 = new 타입[] {값0, 값1, 값2, 값3, ...};
String[] names = null;
names = new String[] {"신용권", "홍길동", "감자바"};

 

❓ 메소드의 매개값이 배열일 경우, 값 목록으로 배열을 생성함과 동시에 메소드의 매개값으로 사용하려고 하려면 반드시 new 연산자를 사용해야 한다.

int add(int[] scores) {...}

int result = add({95, 85, 100}); // 컴파일 에러
int result = add(new int[] {95, 85, 100});

 

new 연산자로 배열 생성

값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 배열 객체를 생성시킬 수 있다.

타입[] 변수 = new 타입[길이];
int[] intArray = new int[5];

❓ 길이 → 배열이 저장할 수 있는 값의 수

 

new 연산자로 배열을 생성할 경우에는 이미 배열 변수가 선언된 후에도 가능하다.

타입[] 변수 = null;
변수 = new 타입[길이];
int[] intArray = null;
intArray = new int[5];

배열이 생성되고 나서 새로운 값을 저장하려면 대입 연산자를 사용하면 된다.

변수[인덱스] = 값;
intArray[1] = 30;

 

배열 길이

코드에서 배열의 길이를 얻으려면 다음과 같이 배열 객체의 length 필드를 읽으면 된다.

배열변수.length;
int[] intArray = {10, 20, 30};
int len = intArray.length;

length 필드는 읽기 전용 필드이기 떄문에 값을 바꿀 수 없다.

intArray.length = 10; // 잘못된 코드

 

커맨드 라인 입력

프로그램 실행을 위해 main() 메소드가 필요하다. 이때 매소드의 매개값인 String[] args가 왜 필요한 것일까?

public static void main(String[] args) {...}

 

"Java 클래스"로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고 main() 메소드를 호출할 때 매개값으로 전달한다.

String args = {}; // 길이가 0인 String 배열을 먼저 생성

public static void main(String[] args) { // 이때 매개값으로 전달
    ...
}

 

"Java 클래스" 뒤에 공백으로 구분된 문자열 목록을 주고 실행하면, 문자열 목록으로 구성된 String[] 배열이 생성되고 매개값으로 전달된다.

java 클래스 문자열0 문자열1 문자열2 ... 문자열n-1
String[] args = {문자열0, 문자열1, ... , 문자열n-1}; // 문자열 생성

public static void main(String[] args) { // 생성된 문자열 매개값으로 전달
    ...
}

 

다차원 배열

지금까지 살펴본 배열은 값 목록으로 구성된 1차원 배열이다.

이와는 달리 행과 열로서 구성된 배열을 2차원 배열이라고 한다.

 

자바는 2차원 배열을 중첩 배열 방식으로 구현한다.

int[][] scores = new int[행][열];

 

자바는 일차원 배열이 서로 연결된 구조로 다차원 배열을 구현하기 때문에 수학 행렬 구조가 아닌 계단식 구조를 가질 수 있다.

int[][] scores = new int[2][];
scores[0] = new int[2];
scores[1] = new int[3];

 

그룹화된 값 목록을 가지고 있다면 다음과 같이 중괄호 안에 다시 중괄호를 사용해서 값 목록을 나열하면 된다.

타입[][] 변수 = {{값0, 값1, 값2}, {값0, 값1, 값2}, ...};
int[][] scores = {{95, 80}, {92, 96}};

위 코드로 생성된 scores 배열에서 항목 값은 다음과 같이 읽을 수 있다.

int score = scores[0][0]; // 95
int score = scores[1][1]; // 96

 

배열 복사

배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.

 

배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() 메소드를 사용하면 된다.

// for문으로 배열 복사하기
public static void main(String[] args) {
    int[] oldIntArray = {1, 2, 3};
    int[] newIntArray = new int[5];
    
    for(int i = 0; i < oldIntArray.length; i++) {
        newIntArray[i] = oldIntArray[i];
    }
}

System.arraycopy() 메소드는 다음과 같이 호출하면 된다.

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

❓ src → 원본 배열

❓ srcPos → 복사할 항목의 시작 인덱스

❓ dest → 새 배열

❓ destPos → 새 배열에서 붙여넣을 시작 인덱스

❓ length→ 복사할 개수

System.arraycopy(oldIntArray, 0, newIntArray, 0, oldIntArray.length);

복사되지 않은 항목은 배열의 기본 초기값으로 그대로 유지된다.

 

❓ 얕은 복사(shallow copy) → 복사되는 값이 객체의 번지 → 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일

❓ 깊은 복사(deep copy) → 참조하는 객체도 별도로 생성한다.

 

출처: 이것이 자바다 Chater05 참조 타입

'Study > Java' 카테고리의 다른 글

[Java]01.자바 시작하기  (1) 2022.01.11
[Java]04.조건문과 반복문  (0) 2022.01.11
[Java]03.연산자  (0) 2022.01.10
[Java]06.클래스-확인문제  (0) 2021.12.29
[Java] 02.변수와 타입  (0) 2021.12.20
Comments