티스토리 뷰

주의 사항!

  • 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.


Arrays 클래스는 배열 조작 기능을 가지고 있습니다. 배열 조작이란 배열의 복사, 항목 정렬, 항목 검색과 같은 기능을 말합니다. 단순한 배열 복사는 System.arraycopy() 메서드를 사용할 수 있으나, Arrays는 추가적으로 항목 정렬, 항목 검색, 항목 비교와 같은 기능을 제공합니다.

 

다음은 Arrays 클래스가 가지고 있는 메서드들입니다. 메서드 이름만 보면 어떤 기능을 제공하는지 쉽게 알 수 있습니다. Arrays 클래스의 모든 메서드는 정적 메서드이므로 Arrays 클래스로 바로 사용이 가능합니다.

리턴 타입 메서드 설명
int binarySearch(배열, 찾는 값) 전체 배열 항목에서 찾는 값이 있는 인덱스를 리턴
타겟 배열 copyOf(원본 배열, 복사할 길이) 원본 배열의 0번 인덱스에서 복사라 길이만큼 복사한 배열을 리턴, 복사할 길이는 원본 배열의 길이보다 커도 되며, 타겟 배열의 길이가 됨
타겟 배열 copyOfRange(원본 배열, 시작 인덱스, 끝 인덱스) 원본 배열의 시작 인덱스에서 끝 인덱스 전까지 복사한 배열 리턴
boolean deepEquals(배열, 배열) 두 배열의 깊은 비교(중첩 배열의 항목까지 비교)
boolean equals(배열, 배열) 두 배열의 얕은 비교(중첩 배열의 항목은 비교하지 않음)
void fill(배열, 값) 전체 배열 항목에 동일한 값을 저장
void fill(배열, 시작 인덱스, 끝 인덱스, 값) 시작 인덱스부터 끝 인덱스까지의 항목에만 동일한 값을 저장
void sort(배열) 배열의 전체 항목을 오름차순으로 정렬
String toString(배열) "[값1, 값2, ...]"와 같은 문자열 리턴

 

배열 복사

배열 복사를 위해 사용할 수 있는 메서드는 copyOf(원본 배열, 복사할 길이), copyOfRange(원본 배열, 시작 인덱스, 끝 인덱스)입니다. copyOf() 메서드는 원본 배열의 0번 인덱스에서 복사할 길이만큼 복사한 타깃 배열을 리턴하는데, 복사할 길이는 원본 배열의 길이보다 커도 되며 타깃 배열의 길이가 됩니다.

char[] arr1 = {'J', 'A', 'V', 'A'};
char[] arr2 = Arrays.copyOf(arr1. arr1.length);

copyOfRange() 메서드는 원본 배열의 시작 인덱스에서 끝 인덱스의 전까지 복사한 배열을 리턴합니다. 시작 인덱스는 포함되지만, 끝 인덱스는 포함되지 않습니다.

char[] arr1 = {'J', 'A', 'V', 'A'};
char[] arr2 = Arrays.copyOfRange(arr1. 1, 3);

단순히 배열을 복사할 목적이라면 Arrays 클래스를 사용하지 않고 System.arraycopy() 메서드를 이용할 수 있습니다. System.arraycopy() 메서드는 다음과 같이 5개의 매개 값이 필요합니다.

System.arraycopy(원본 배열, 원본 시작 인덱스, 타겟 배열, 타겟 시작 인덱스, 복사 개수);

원본 시작 인덱스는 원본 배열에서 복사할 항목의 시작 위치이고, 타깃 시작 인덱스는 타깃 배열에서의 복사 시작 위치를 말합니다. 복사 개수는 원본 시작 인덱스에서부터 몇 개의 항목을 복사할 것인지를 말합니다.

 

다음 예제는 Arrays와 System.arraycopy() 메서드를 이용해서 배열을 복사하고 있습니다.

//Main.java
package Example;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		char[] arr1 = {'J', 'A', 'V', 'A'};
		
		char[] arr2 = Arrays.copyOf(arr1, arr1.length);
		System.out.println(Arrays.toString(arr2));
		
		char[] arr3 = Arrays.copyOfRange(arr1, 1, 3);
		System.out.println(Arrays.toString(arr3));
		
		char[] arr4 = new char[arr1.length];
		System.arraycopy(arr1, 0, arr4, 0, arr1.length);
		System.out.println(Arrays.toString(arr4));
		
	}
}

/*
실행결과

[J, A, V, A]
[A, V]
[J, A, V, A]

*/

 

배열 항목 비교

Arrays의 equals()와 deepEquals()는 배열 항목을 비교합니다. equals()는 1차 항목의 값만 비교하고, deepEquals() 메서드는 1차 항목이 서로 다른 배열을 참조할 경우 중첩된 배열의 항목까지 비교합니다. 다음 예제는 배열 복사 후 항목을 비교합니다.

//Main.java
package Example;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		int[][] original = {{1, 2}, {3, 4}};
		
		System.out.println("얕은 복제 후 비교");
		
		int[][] cloned1 = Arrays.copyOf(original, original.length);
		
		System.out.println("배열 번지 비교 : " + original.equals(cloned1));
		System.out.println("1차 배열 항목값 비교 : " + Arrays.equals(original, cloned1));
		System.out.println("중첩 배열 항목값 비교 : " + Arrays.deepEquals(original, cloned1));
		
		System.out.println();
		System.out.println("깊은 복제 후 비교");
		
		int[][] cloned2 = Arrays.copyOf(original, original.length);
		cloned2[0] = Arrays.copyOf(original[0], original[0].length);
		cloned2[1] = Arrays.copyOf(original[1], original[1].length);
		
		System.out.println("배열 번지 비교 : " + original.equals(cloned2));
		System.out.println("1차 배열 항목값 비교 : " + Arrays.equals(original, cloned2));
		System.out.println("중첩 배열 항목값 비교 : " + Arrays.deepEquals(original, cloned2));
	}
}

/*
실행결과

얕은 복제 후 비교
배열 번지 비교 : false
1차 배열 항목값 비교 : true
중첩 배열 항목값 비교 : true

깊은 복제 후 비교
배열 번지 비교 : false
1차 배열 항목값 비교 : false
중첩 배열 항목값 비교 : true

*/

 

배열 항목 정렬

기본 타입 또는 String 배열은 Arrays.sort() 메서드의 매개 값으로 지정해주면 자동으로 오름차순 정렬이 됩니다. 사용자 정의 타입일 경우에는 클래스가 Comparable 인터페이스를 구현하고 있어야 정렬이 됩니다. Member 배열에서 Member 객체들을 name 필드 값으로 정렬하고 싶다면 다음과 같이 Member 클래스를 작성하면 됩니다.

//Member.java
package Example;

public class Member implements Comparable<Member> {
	private String name;
	
	public Member(String name) {
		this.name = name;
	}

	@Override
	public int compareTo(Member o) {
		return name.compareTo(o.name);
	}
}

Comparable <Member>는 Member 타입만 비교하기 위해 제네릭 <>을 사용하였고, compareTo() 메서드는 비고 값을 리턴하도록 오버 라이딩했습니다. compareTo() 메서드의 리턴 값은 오름차순일 때 자신이 매개 값보다 낮을 경우 음수, 같을 경우 0, 높을 경우 양수를 리턴하면 됩니다. 반대로 내림 차순일 때는 자신이 매개 값보다 낮을 경우 양수, 같은 경우 0, 높을 경우 음수를 리턴하면 됩니다.

 

다음 예제는 배열 항목을 정렬하는 방법을 보여줍니다.

//Member.java
package Example;

public class Member implements Comparable<Member> {
	private String name;
	
	public Member(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return name;
	}
	
	@Override
	public int compareTo(Member o) {
		return name.compareTo(o.name);
	}
}
//Main.java
package Example;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		Member[] members = {
			new Member("KOEY"), 
			new Member("홍길동"), 
			new Member("이순신"), 
			new Member("김아무개")
		};
		
		Arrays.sort(members);
		for(Member member : members) {
			System.out.println("member = " + member.toString());
		}
	}
}

/*
실행결과

member = KOEY
member = 김아무개
member = 이순신
member = 홍길동

*/

Member 클래스의 compareTo() 메서드를 다음과 같이 수정하면 내림차순으로 정렬할 수도 있습니다.

@Override
public int compareTo(Member o) {
	return -name.compareTo(o.name);    //-추가
}

 

배열 항목 검색

배열 항목에서 특정 값이 위치한 인덱스를 얻는 것을 배열 검색이라고 합니다. 배열 항목을 검색하려면 먼저 Arrays.sort() 메서드로 항목들을 오름차순으로 정렬한 후, Arrays.binarySearch() 메서드로 항목을 찾아야 합니다.

 

다음 예제는 배열 항목을 검색하는 방법을 보여줍니다.

//Member.java
package Example;

public class Member implements Comparable<Member> {
	private String name;
	
	public Member(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return name;
	}
	
	@Override
	public int compareTo(Member o) {
		return name.compareTo(o.name);
	}
}
//Main.java
package Example;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		Member m1 = new Member("KOEY");
		Member m2 = new Member("홍길동");
		Member m3 = new Member("이순신");
		Member m4 = new Member("김아무개");
		Member[] members = {m1, m2, m3, m4};
		
		Arrays.sort(members);
		for(Member member : members) {
			System.out.println("member = " + member.toString());
		}
		
		int index = Arrays.binarySearch(members, m2);
		System.out.println("찾은 인덱스 : " + index + ", 찾은 멤버 : " + members[index].toString());
	}
}

/*
실행결과

member = 홍길동
member = 이순신
member = 김아무개
member = KOEY
찾은 인덱스 : 0, 찾은 멤버 : 홍길동

*/

꼭 오름차순이 아니어도 내림차순으로 정렬해도 값을 찾을 수 있었습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함