Java

Arrarys클래스의 sort() 메소드 및 SCJP 49번 문제

bang2001 2013. 7. 25. 15:34

Arrays 클래스는 객체나 혹은 기본자료형에 대한 배열을 좀더 관리하기 쉽게하기 위해 구현된 클래스입니다.


따라서 Arrays클래스에는 이들 배열과 관련된 메소드들이 들어있습니다.

그 중에서 SCJP에 sort()메소드에 관한 내용이 나와서 이 부분에 대해서 간단히 글을 올려보겠습니다.

먼저 제가 테스트한 예제입니다. 

------------------------------------------------------------------------------------------

import java.util.*;

class ArraysTest 
{
public static void main(String[] args) 
{
int a[] = {5,3,2,4,1}; // int타입 1차원 배열에서 값을 불규칙적으로 나열하여 대입

/* 먼저 위의 값들을 반복문을 통하여 출력해보겠다. */

for (int b : a)
{
System.out.println(b);
}

/* public static void sort(int[] a) <- Arrays의 static 메소드 sort()를 이용하여 다음 배열을 정렬한다. */
Arrays.sort(a);

/* 그 다음 위의 변수를 한번 출력 해보겠다. */
System.out.println("--------------------구분선---------------------");
for (int b : a)
{
System.out.println(b);
}
}
}


결과값을 한번 보겠습니다. 
-------------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------------

다음과 같이 처음에는 배열에 값을 대입한 순서대로 출력되었지만,
Arrays클래스의 sort()메소드를 사용하고 난 이후부터는 숫자가 작은수에서 큰 수의 순서대로 정렬된 것을 볼 수 있습니다.

단, 여기엔 조건이 있습니다. 위의 코드처럼 기본자료형에 대한 배열의 정렬이 있고, 객체배열에 대한 정렬이 있습니다.

먼저 기본자료형에 대한 배열은 상관없습니다. 

하지만 객체배열을 대입하고자 할 때에는 객체에 대한 비교가 이루어져야 하고 따라서 다음과 같은 사항을 알고계셔야 합니다.

[객체 비교에 필요한 조건]
1. 객체의 비교가 가능한 객체는 같은 객체끼리 객체비교가 가능하다.
2. 객체비교를 하기 위해서는 Comparable 인터페이스를 구현해야 한다.

이와 같이 두가지의 조건이 충족되어야 합니다.
그 이유는 객체의 비교가 이루어 지기 위해서는 객체를 비교할 수 있는 기준이 있다는 이야기가 됩니다.
즉 객체라는것은 크게 두가지로 나누어진다는 이야기가 됩니다.

    같은 클래스 끼리 비교 가능한 객체 or 같은 클래스끼리 비교 불가능한 객체

여기서 비교 가능한 객체인지 아닌지에 대한 기준은 Comparable 인터페이스를 구현 했는지 안했는지로 결정됩니다.
그리고 이 인터페이스를 구현한 객체로는 다음과 같은 클래스가 있습니다.

   Byte, Character, Double, File,Float, Integer, Long, ObjectStreamField, Short, String, BigDecimal, BigInteger, URI, 

   Charset,   Date, CollationKey 등등....


따라서 객체배열에 대한 정렬을 하고자 할 때에는 비교하고자 하는 객체가 같은 클래스가 되어야 하고,

Comparable 구현한 클래스이어야 한다는 점 입니다.


음.. 이게 49번 문제 풀다가 이렇게 됫는데요 ㅇㅅㅇ;;;;


잠시 49번문제를 보겠습니다.


-----------------------------------------------------------------------------------

QUESTION 49

Given:

23. Object [] myObjects = {

24. new Integer(12),

25. new String("foo"),

26. new Integer(5),

27. new Boolean(true)

28. };

29. Arrays.sort(myObjects);

30. for(int i=0; i<myObjects.length; i++) {

31. System.out.print(myObjects[i].toString());

32. System.out.print(" ");

33. }


What is the result?


A. Compilation fails due to an error in line 23.

B. Compilation fails due to an error in line 29.

C. A ClassCastException occurs in line 29.

D. A ClassCastException occurs in line 31.

E. The value of all four objects prints in natural order.


Answer: C

-------------------------------------------------------------------------------------


여기서 정답은 C가 됩니다. 그 이유는 객체에 대하여 정렬을 한다는것은 객체를 서로 비교한다는 뜻이고,

따라서 객체를 비교하기 위해서는 위에서 언급한 조건이 충족되어야 한다는 점입니다.


문제의 코드중에서 Object타입의 myObjects 배열변수에 들어있는 객체들은 모두 Comparable 인터페이스를

구현하고 있지만, 이들 객체의 클래스가 모두 틀리기 때문에 서로 비교할 기준이 모두 틀리게 됩니다.

따라서 객체에 대한 비교를 할 수 없고, 때문에 정렬을 할 수 없습니다.


때문에 예외가 발생하게 되는것 입니다.


여기서 잠시!! ClassCastException 에 대해서 알아보겠습니다.


이 예외의 발생하는 조건은 다음과 같습니다.

1. 객체가 상위클래스가 아닌 클래스로 형변환 하고자 할 때 발생한다.

    ---> 단 Object클래스는 제외입니다. 임의 객체에 한해서 극히 제한적인 범위내에서 자신의 클래스형을

            변환할 수 있습니다.

2. 코드가 인스턴스에 없는 서브 클래스로 객체를 보낼려고 할 때 발생한다.


여기서 SCJP문제의 코드에서 발생한 예외는 위의 두 조건중에서 후자쪽으로 판단이 됩니다.


그리고 문제를 풀면서 느낀점은 각 예외에 대하여 발생하는 조건을 숙지를 하는것이 SCJP문제를 풀기에 유리하고

나아가서 실무작업시에도 해당 예외를 보고 잘못된 점을 빠르게 찾을 수 있다고 생각이 됩니다.


다음은 몇몇 예외에 대한 발생조건입니다. (전부다 알아볼려고 했지만.. 지금 당장은 여기가 한계인것 같아요 추후 더 올릴께요)


-------------------------------------------------------------------------------------------

ArrayIndexOutOfBoundsException

 -> 배열이 잘못된 색인으로 액세스 되었음을 나타내기 위해 발생한다.

 -> 잘못된 배열요소를 참조할 경우에 발생한다.


ArithmeticException

 -> 0으로 정수를 나눌때와 같은 수학적으로 부적절한 계산을 실행할 때 발생한다.


ArrayStoreException

 -> 객체배열에 잘못된 객체유형을 저장하려고 할 때 발생한다.


AWTError

 -> 심각한 Abstract Window Toolkit 오류가 발생할 때


CheckedException

 -> 컴파일러에 의해 검사된 예외


EmptyStackException

-> 스텍이 비었음을 나타내기 위해 Stack클래스에 있는 메소드에 의해 발생

-------------------------------------------------------------------------------------------