1. 다음 Java로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.
public class Main {
public static void check(int[] x, int[] y) {
if(x==y) System.out.print("O");
else System.out.print("N");
}
public static void main(String[] args) {
int a[] = new int[] {1, 2, 3, 4};
int b[] = new int[] {1, 2, 3, 4};
int c[] = new int[] {1, 2, 3};
check(a, b);
check(b, c);
check(a, c);
}
}
위 문제를 풀기 위해 필요한 Java의 개념
1. 객체 참조(Reference)와 메모리 할당
- new 키워드: new 키워드를 사용하면 메모리에서 새로운 객체가 할당됩니다. int[] a = new int[] {1, 2, 3, 4};와 같이 배열을 생성할 때마다 새로운 객체가 메모리에 만들어지고, 그 주소값이 변수 a에 저장됩니다.
- 참조 비교: 객체를 비교할 때 == 연산자는 두 변수가 같은 객체를 가리키는지, 즉 같은 메모리 주소를 가지고 있는지를 비교합니다. 배열이나 객체의 내용을 비교하는 것이 아니라, 해당 객체가 동일한 메모리 위치를 가리키는지를 확인합니다.
2. 배열(Array)와 객체
- 배열도 객체: Java에서는 배열이 객체로 취급됩니다. 따라서 배열 변수는 배열 객체의 참조를 저장하고 있습니다. 예를 들어, int[] a는 int 타입의 배열 객체를 참조하는 변수입니다.
- 객체 비교: 배열과 같은 객체의 경우 == 연산자는 해당 객체의 메모리 주소를 비교합니다. equals() 메서드로 객체의 내용을 비교하는 경우가 많지만, 기본 배열에서는 equals()를 사용할 수 없고, Arrays.equals()와 같은 메서드를 사용해야 합니다.
3. 메서드 호출 시 배열 전달
- 참조에 의한 전달: Java에서 배열은 참조에 의해 메서드로 전달됩니다. 따라서 메서드 내부에서 배열의 값을 변경하면 원래 배열도 영향을 받습니다. 하지만 여기서 주의할 점은 배열의 참조 자체가 전달된다는 것입니다. 즉, 배열 객체가 어떤 메모리를 가리키고 있는지에 대한 정보가 전달되는 것이지, 배열의 복사본이 만들어지는 것이 아닙니다.
4. == 연산자와 equals() 메서드의 차이
- == 연산자: 객체의 참조(메모리 주소)를 비교합니다. 같은 메모리 주소를 가리키는지 확인할 때 사용됩니다.
- equals() 메서드: 보통 객체의 내용을 비교할 때 사용됩니다. 예를 들어, 두 문자열의 내용을 비교할 때 equals() 메서드를 사용합니다. 배열의 경우 객체 자체이기 때문에 기본적으로 equals()는 ==처럼 작동하며, 배열의 내용을 비교하려면 Arrays.equals()를 사용해야 합니다.
요약하자면
- 객체 참조와 메모리에 대한 이해 : new 키워드를 사용하면 항상 새로운 객체가 생성됩니다.
- 배열도 객체라는 점과 배열의 참조가 같은 메모리 위치를 가리키는지를 ==로 비교한다는 것.
- ==는 참조 비교이며, 값 비교를 위해서는 Arrays.equals()와 같은 메서드를 사용해야 한다는 점.
프로그램 분석
- check 메서드는 두 배열 x와 y가 같은 참조인지 확인합니다. x == y는 배열의 값이 아니라 배열이 저장된 메모리 주소를 비교합니다.
- main 메서드에서 a, b, c 세 개의 배열이 정의되어 있습니다.
- a와 b는 모두 {1, 2, 3, 4}로 동일한 값을 가지고 있지만, 각각 new 키워드를 사용해 생성되었기 때문에 다른 참조를 갖습니다.
- c는 {1, 2, 3} 값을 가지고 있습니다.
실행 과정
- check(a, b) 호출
- a와 b는 값은 같지만 다른 객체이므로 x == y는 false입니다. 따라서 else문이 실행되고 "N"이 출력됩니다.
- check(b, c) 호출
- b와 c 역시 다른 객체이므로 x == y는 false입니다. 따라서 "N"이 출력됩니다.
- check(a, c) 호출
- a와 c 역시 다른 객체이므로 x == y는 false입니다. 따라서 "N"이 출력됩니다.
최종 출력 결과
=> NNN