09009

[Java] Arrays 클래스 본문

Back-End/JAVA
[Java] Arrays 클래스
09009

Arrays 클래스

• 배열 조작 기능을 하는 클래스

• 배열을 다루는데 유용한 메서드가 정의되어 있다.

 

배열의 비교와 출력 -  equals(), toString()

• equals()

두 배열에 저장된 모든 요소를 비교하여 같으면 true, 다르면 false 반환 (1차원 배열에만 사용 가능)

 - Arrays.equals(배열, 배열) - 1차원 배열 비교

 - Arrays.deepEquals(배열, 배열) - 다차원 배열 비교

 

• toString()

배열의 모든 요소를 문자열로 편하게 출력 가능 (1차원 배열에만 사용 가능)

  - 다차원 배열에는 deepToString() 사용

int[] arr= {1,2,3,4,5};
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]

 

배열의 복사 -  copyOf(), copyOfRange()

반환형 메서드 설명
타겟배열 copyOf(원본 배열 , 복사할 길이) 원본배열의 0번 index에서 복사할 길이만큼 복사한 배열 반환
타겟배열 copyOfRange(원본배열, 시작인덱스, 끝인덱스) 원본배열의 시작 index에서 끝 index까지 복사한 배열 반환
(지정된 범위의 끝은 포함 x)

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

package ch11;
import java.util.Arrays;

public class Arrays1 { 
	public static void main(String[] args) {
		String[] arr1 = {"J","A","V","A"};
		String[] arr2 = Arrays.copyOf(arr1, arr1.length);  // [J, A, V, A]
		String[] arr3 = Arrays.copyOfRange(arr1, 1, 3);  // [A, V]
        						// 인덱스 1부터 3 이전까지 복사
		
		String[] arr4 = new String[arr1.length];
		System.arraycopy(arr1, 0, arr4, 0, arr1.length);  // [J, A, V, A]
		
		System.out.println(arr1);
        	// toString: 배열 객체에 들어있는 값 출력
		System.out.println(Arrays.toString(arr1)); // [J, A, V, A]
		System.out.println(Arrays.toString(arr2)); // [J, A, V, A]
		System.out.println(Arrays.toString(arr3)); // [A, V]
		System.out.println(Arrays.toString(arr4)); // [J, A, V, A]
	}
}

 

배열의 정렬과 검색 -  sort(),  binarySearch()

반환형 메서드 설명
void sort(배열) 배열의 전체 항목을 오름차순으로 정렬
void sort(배열, Collections.reverseOrder()) 배열의 전체 항목을 내림차순으로 정렬
int binarySerach(배열, 찾는 값) 배열에 지정된 값이 저장된 index를 찾아서 반환

 

package ch11;

import java.util.Arrays;
import java.util.Collections;

public class Arrays2 {
	public static void main(String[] args) {
		Integer[] scores = {43,98,56,78,34};
		System.out.println(Arrays.toString(scores)); // [43, 98, 56, 78, 34]
		Arrays.sort(scores);  // 오름차순 정렬  // [34, 43, 56, 78, 98]
		System.out.println(Arrays.toString(scores));
		Arrays.sort(scores, Collections.reverseOrder()); // 내림차순 정렬 // [98, 78, 56, 43, 34]
		System.out.println(Arrays.toString(scores));
	}
}

!!! 주의할 점!!! 

binarySearch 메서드를 사용할 때는 반드시 이전에 배열을 sort 해야 한다.

package ch11;
import java.util.Arrays;

public class Arrays3 {
	public static void main(String[] args) {
		Integer[] scores = {99,97,98,88,77};
		Arrays.sort(scores); // 오름차순 정렬
		System.out.println(Arrays.toString(scores)); // [77, 88, 97, 98, 99]
		int index = Arrays.binarySearch(scores, 97);
		System.out.println("찾은 인덱스 : " + index); // 찾은 인덱스 : 2
	}
}

 

객체를 정렬할 때 - Comparable 인터페이스

위의 예제 소스코드에서 Arrays.sort()를 호출만 하면 컴퓨터가 알아서 배열을 정렬하는 것처럼 보이지만

사실은 Character 클래스의 Comparable의 구현에 의해 정렬된 것이다.

Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는 데 필요한 메서드를 정의한다.

 

- Comparator와 Comparable의 실제 소스

    public interface Comparator {
        int compare(Object o1, Object o2);
        boolean equals(Object obj);
    }
    public interface Comparable {
        public int compareTo(Object o);
    }

Comparable : 기존 정렬기준을 구현하는데 사용. Comparable을 구현한 클래스들이 기본적으로 오름차순으로 정렬되어 있다.

Comparator : 내림차순으로 정렬하던지 아니면 다른 기준에 의해 정렬하고 싶을 경우 Comparator를 구현

 

•  정렬의 기준을 정하는 인터페이스

Java에서 기본 자료형은 부등호를 통해서 서로 쉽게 비교할 수 있다.

int x = 3, y = 2;
System.out.println(x > y); // true
System.out.println(x == y); // false
System.out.println(x < y); //false

 

사람의 이름과 나이 정보를 갖고 있는 클래스가 있다고 가정해 보자.

이러한 클래스의 경우 부등호를 통해 크고 작음을 비교할 수 있을까? 

이와 같은 클래스는 이름의 대소를 비교할 것인지, 나이의 대소를 비교할 것인지

즉, 비교 기준이 명확하게 정해져 있지 않기 때문에 정확한 비교를 할 수 없다.

 

그래서 우리는 Comparable 또는 Comparator 인터페이스를 이용하여 비교 기준을 직접 정한 후 객체를 비교할 수 있게하여야 한다.

 

CompareTo() 메서드

- Comparable 인터페이스에 정의된 메서드 중 하나

- 두 개의 값, 객체를 비교하여 int값으로 반환하는 함수

- 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야 한다.

- 숫자 비교: 크다(1), 같다(0), 작다(-1)와 같은 결괏값 반환

- 문자열 비교: 같다(0), 그 외 양수/음수값과 같은 결과를 반환

 

•  a.compareTo(b) 메서드

- a와 b가 같은 순서면 0

- a > b 이면 0보다 큰 값 반환

- a < b 이면 0보다 작은 값 반환

 

위 메서드를 수행하고 결과 값이 0이면 같은 순서. 0보다 크면 a > b, 0보다 작으면 b > a로 순서가 정해진다.
새 클래스를 만들고 그 클래스의 객체들 사이에 순서를 정해주고 싶다면 
Comparable 인터페이스를 구현하고 compareTo 메서드를 위 규칙대로 정의하여 순서를 정해줄 수 있다.


!!! Comparable은 인터페이스이므로  Comparable을 이용하여 객체를 정렬하려면 비교하고자 하는 객체에서

아래에 작성된 소스코드와 같이 Comparable 인터페이스를 구현해야 한다.!!!

 

✍ Member1.java

package ch11;
// 객체를 정렬하기 위해서는 comparable 을 구현해야 한다.
public class Member1 implements Comparable<Member1>  {
	String name;
	public Member1(String name) {
		this.name = name;
	}

// 정렬할 기준을 재정의한다.
	@Override
	public int compareTo(Member1 o) {
		return name.compareTo(o.name);
	}

	@Override
	public String toString() {
		return name;
	}
}

✍ Arrays4.java

package ch11;
import java.util.Arrays;
public class Arrays4 {
	public static void main(String[] args) {
		Member1 m1 = new Member1("음바페");
		Member1 m2 = new Member1("홀란드");
		Member1 m3 = new Member1("케인");
		Member1 m4 = new Member1("비니시우스");
		
		Member1[] members = {m1, m2, m3, m4};
		Arrays.sort(members);
		System.out.println(Arrays.toString(members));
		int index = Arrays.binarySearch(members, m2);
		System.out.println("찾은 인덱스 : "  + index);
	}
}

 

💻  출력 

[비니시우스, 음바페, 케인, 홀란드]
찾은 인덱스 : 3

예제

 

• 나이를 기준으로 정렬하고 싶을 때

 

✍ Member2.java

package ch11;
public class Member2 implements Comparable<Member2>{
	String name;
	int age;
	public Member2(String name, int age) {
		this.name = name; this.age =age;
	}
	// 비교하는 기준
	@Override
	public int compareTo(Member2 o) {
		// 비교 대상은 문자열이어야 한다.
		String age1 = age + ""; // 숫자 + 문자 = 문자 
		String age2 = o.age + "";
		return age1.compareTo(age2);
	}
//    @Override
//    public int compareTo(Member2 o) {
//        if (age > o.age) return 1;
//        else if (age < o.age) return -1;
//        else return 0;
//    }
	@Override
	public String toString() {
		return name + "(" + age + ")";
	}
}

✍ ArraysMember2.java

package ch11;

import java.util.Arrays;
import java.util.Collections;

public class ArraysMember2 {
	public static void main(String[] args) {
		Member2 m1 = new Member2("손흥민", 32);
		Member2 m2 = new Member2("이강인", 23);
		Member2 m3 = new Member2("백승호", 27);
		Member2 m4 = new Member2("김민재", 28);
		Member2 m5 = new Member2("김영권", 34);
		
		Member2[] members = {m1, m2, m3, m4, m5};
		System.out.println(Arrays.toString(members)); // [손흥민(32), 이강인(23), 백승호(27), 김민재(28), 김영권(34)]
		
		// 나이를 기준으로 오름차순 정렬
		Arrays.sort(members);
		System.out.println(Arrays.toString(members)); // [이강인(23), 백승호(27), 김민재(28), 손흥민(32), 김영권(34)]
		
		// 나이를 기준으로 내림차순 정렬
		Arrays.sort(members, Collections.reverseOrder());
		System.out.println(Arrays.toString(members)); // [김영권(34), 손흥민(32), 김민재(28), 백승호(27), 이강인(23)]
	
	}
}

Member2.java에 있는 compareTo() 메서드에서 나이를 기준으로 비교하도록 설정하였으므로  ArraysMember2.java에 있는 main 메서드 실행 결과 나이를 기준으로 정렬된 것을 확인할 수 있다. 

 

그렇다면 이름으로 비교하면 어떤 결과가 나올까?

 

• 이름을 기준으로 정렬하고 싶을 때

 

✍ Member2.java

package ch11;

public class Member2 implements Comparable<Member2>{
	String name;
	int age;
	public Member2(String name, int age) {
		this.name = name; this.age =age;
	}
	// 비교하는 기준
	@Override
	public int compareTo(Member2 o) {
		return name.compareTo(o.name);
	}
	@Override
	public String toString() {
		return name + "(" + age + ")";
	}
}

✍ ArraysMember2.java

package ch11;

import java.util.Arrays;
import java.util.Collections;

public class ArraysMember2 {
	public static void main(String[] args) {
		Member2 m1 = new Member2("손흥민", 32);
		Member2 m2 = new Member2("이강인", 23);
		Member2 m3 = new Member2("백승호", 27);
		Member2 m4 = new Member2("김민재", 28);
		Member2 m5 = new Member2("김영권", 34);
		
		Member2[] members = {m1, m2, m3, m4, m5};
		System.out.println(Arrays.toString(members)); // [손흥민(32), 이강인(23), 백승호(27), 김민재(28), 김영권(34)]
		
		// 이름을 기준으로 오름차순 정렬
		Arrays.sort(members);
		System.out.println(Arrays.toString(members)); //[김민재(28), 김영권(34), 백승호(27), 손흥민(32), 이강인(23)]
		// 이름을 기준으로 내림차순 정렬
		Arrays.sort(members, Collections.reverseOrder());
		System.out.println(Arrays.toString(members)); //[이강인(23), 손흥민(32), 백승호(27), 김영권(34), 김민재(28)]
	
	}
}

Member2.java에 있는 compareTo() 메서드에서 이름을 기준으로 비교하도록 설정하였으므로  ArraysMember2.java에 있는 main 메서드 실행 결과 이름을 기준으로 제대로 정렬된 것을 확인할 수 있다. 

 

우리는 이전에 사람의 이름과 나이 정보를 갖고 있는 클래스의 대소비교를 어떻게 할 것인지에 대한 의문이 있었다. 위의 소스코드에서 볼 수 있듯이 comparable 인터페이스를 이용하면 비교 기준을 직접 정하여 우리가 원하는 대로 비교할 수 있음을 확인하였다.

 

 

 

 

[Java] compareTo()

객체를 정렬할 때 - Comparable 인터페이스 [Java] Arrays 클래스 Arrays 클래스 • 배열 조작 기능을 하는 클래스 • 배열을 다루는데 유용한 메서드가 정의되어 있다. 배열의 비교와 출력 - equals(), toStrin

haaland09009.tistory.com

 

'Back-End > JAVA' 카테고리의 다른 글

[Java] 쓰레드  (0) 2023.03.13
[Java] Generic  (0) 2023.03.12
[Java] collection  (0) 2023.03.11
[Java] Object 클래스, equals(), toString()  (2) 2023.03.11
[Java] 클래스 간의 관계 - 포함관계  (0) 2023.03.11