본문 바로가기

컴퓨터/JAVA

java 배열 복사, String 비교 할 때 주의점!!!

반응형

String 비교시, 배열 복사시 주의해야 할 점에 대해서 알아보겠습니다.

 


		int a = 1;
		int b = a;		
		System.out.println( a == b );
		

 

위 코드를 실행하면 true가 출력됩니다.

 

		String a = "hi";
		String b = "hi";
		String c = new String("hi");
		
		System.out.println(a == b);
		System.out.println(a == c);
		

위 코드의 실행결과는 어떻게 나올까요?

 

직접 해보시면 알겠지만 true false가 나오게 됩니다.

 

		
		int[] a = {1,2,3};
		int[] b = a;
		int[] c = {1,2,3};
		
		System.out.println(a == b);
		System.out.println(a == c);

위 코드 역시 true false가 나옵니다.

 

이렇게 나오는 이유는 무엇일까요?

 

먼저 String에 관한 설명입니다.

String 객체를 new 연산자 없이 생성하면 같은 값을 가지는 String 객체가 있는지, 없는지 확인을 하게 됩니다.

만약 같은 값을 가지는 객체가 이미 있다면 이미 있는 객체의 주소값을 반환하고, 같은 값을 가지는 객체가 없다면 새로운 String객체를 생성합니다. 

 

그러므로 a와 b는 같은 객체이고 c는 다른 객체입니다.

 

==(등위연산자)는 같은 객체인지 판단을 하는 연산자이므로 a와 b는 같지만 c와는 다르다는 결과가 나옵니다.

a,b,c 모두 같은 값을 가지므로 true라는 값이 나오기를 원한다면 

		String a = "hi";
		String b = "hi";
		String c = new String("hi");
		
		System.out.println(a.equals(b));
		System.out.println(a.equals(c));

위와 같이 .equals() 함수를 사용하면 됩니다.

 

 

배열을 복사하고 싶을때 아래와 같이 하면 원하는 것과는 다른 결과를 얻으실 수도 있습니다.

		int[] a = {1,2,3};
		int[] b = a;
		int[] c = {1,2,3};
		
		b[0] = 4;
		b[1] = 5;
		b[2] = 6;
		
		for(int i = 0 ; a.length > i ; i++) {
			System.out.println(a[i]);
		}

a를 {1,2,3} 으로 선언 후 b의 값을 {4,5,6} 으로 바꾸었습니다. 결과는 1 2 3 이 나올까요?

결과는 4 5 6이 나옵니다. 

그 이유는 아래와 같습니다.

 

		int[] a = {1,2,3};
		int[] b = a;
		int[] c = {1,2,3};
		
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);

 위 와 같은 코드를 실행해보면 다음과 비슷한 결과가 나올겁니다.

 

[I@15db9742
[I@15db9742
[I@6d06d69c

 

a와 b는 주소가 같고, c는 다릅니다.

즉 a와 b는 같은 배열이므로 b를 수정해도 a가 바뀌는 것 입니다.

 

a배열은 그대로 두고 b배열만 수정이 되도록 하려면 

		int[] a = {1,2,3};
		int[] b = new int[a.length];
		for(int i=0; a.length > i ; i++) {
			b[i] = a[i];
		}
		
		b[0] = 4;
		b[1] = 5;
		b[2] = 6;
		
		for(int i = 0 ; a.length > i ; i++) {
			System.out.println(a[i]);
		}
		for(int i = 0 ; b.length > i ; i++) {
			System.out.println(b[i]);
		}

위와 같이 배열을 복사하면 됩니다.

 

실행결과는 a는 1 2 3 , b는 4 5 6 이 나옵니다.

 

참고) 주소값을 복사하는 것을 옅은 복사, 동일한 값을 가지는 새로운 객체를 만드는 것을 깊은 복사라고 합니다.

반응형