공부/Java

[즐거운자바] 객체지향(7) - 참조형 배열

다음에바꿔야지 2023. 10. 17. 23:52

<참조형 배열>

배열의 타입이 기본형이 아닌 경우.

배열변수가 참조하는 배열의 공간이 값을 저장하는 것이 아니라, 값을 참조한다는 것을 의미.

 

<사용 목적>

1. 그룹화: 비슷한 종류의 객체를 논리적으로 그룹화할 수 있다. 예를 들어, 모든 동물 객체를 한 배열에 저장할 수 있다.
2. 다형성과 유연성: 참조형 배열은 다형성을 지원한다. 이는 서로 다른 클래스의 객체를 동일한 배열에 저장할 수 있음을 의미한다. 이는 객체의 동작을 다양하게 조정하거나 객체의 유형을 동적으로 변경할 수 있는 유연성을 제공합니다.
3. 동적 데이터 구조: 배열은 크기가 정해져 있어 변경하기 어렵지만, 참조형 배열은 동적으로 크기를 조정할 수 있다.
4. 컬렉션 구현: 자체적으로 컬렉션을 구현하고자 할 때, 배열은 가장 기본적이고 간단한 방법이다.
5. 메모리 관리: 객체의 참조를 관리하면서 메모리를 효율적으로 사용할 수 있다.

<Arrays>

배열 관련 유틸리티

 

배열을 수만큼 복사: .copyOf(배열, 수);

public class Array14 {
	public static void main(String[] args) {
    	int[] copyFrom = {1,2,3};
        
        int[] copyTo = java.util.Arrays.copyOf(copyFrom, copyFrom.length);
        
        for (int c : copyTo) {
        	System.out.println(c);
        }
            
        int[] copyTo2 = java.util.Arrays.copyOf(copyFrom, 5);
        
        for (int c : copyTo2) {
        	System.out.println(c);
        }
    }
}

 

<얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)>

객체 복사에 대한 서로 다른 방법.

 

1. 얕은 복사(Shallow Copy)

: 객체의 필드들은 복사하지만, 객체가 참조하는 다른 객체들은 복사하지 않는 방법.

즉, 복사된 객체와 원본 객체는 동일한 객체를 참조한다. 이로 인해 원본 객체나 복사본 중 하나를 수정하면 다른 객체도 영향을 받는다.

 

2. 깊은 복사(Deep Copy)

: 객체의 필드들을 복사하고, 객체가 참조하는 다른 객체들까지 재귀적으로 복사하는 방법.

이로 인해 원본 객체와 복사본은 완전히 독립된 객체가 되며, 한 객체의 변경이 다른 객체에 영향을 미치지 않는다.

 

<배열 메서드 실습>

배열을 범위만큼 복사: .copyOf(배열, 시작수, 끝수);

import java.util.Arrays;

public class Array15 {
	public static void main(String[] args) {
    	char[] copyFrom = {'h','e', 'l', 'l', 'o', '!'};
        
        char[] copyTo = Arrays.copyOfRange(copyFrom, 1, 3);
        
        for (char c : copyTo) {
        	System.out.println(c);
        }
    }
}

 

배열 비교: .compare(배열1, 배열2);

import java.util.Arrays;

public class Array16 {
	public static void main(String[] args) {
    	int[] array1 = {1,2,3,4,5};
        int[] array2 = {1,2,3,4,5};
        
        int compare = Arrays.compare(array1, array2);
        
        System.out.println(compare);
    }
}

 

배열 정렬: .sort(배열);

import java.util.Arrays;

public class Array17 {
	public static void main(String[] args) {
    	int[] array = {5,4,3,2,1};
        
        Arrays.sort(array);
        
        for (int i : array) {
        	System.out.println(i); // 1,2,3,4,5 순으로 출력
        }        
    }
}

 

배열 안에 인덱스 찾기: .binarySearch(배열, 수);

import java.util.Arrays;

public class Array18 {
	public static void main(String[] args) {
    	int[] array = {5,4,3,1,2};
        
        Arrays.sort(array);
        
        int i = Array.binarySearch(array, 4);      
        System.out.println(i); // 3, 3번째 인덱스에 4가 있다.                
    }
}