▸JAVA/기본 문법

객체의 등가성(객체 비교)_관계 연산자(==) 비교 [1/4]

코데방 2019. 12. 10.
728x90

[ 관계 연산자(==) 비교 ]

  • 기본 변수(원시타입)일 경우 값을 비교
  • 참조 변수(원시타입 외)일 경우 값이 아닌 저장된 주소(포인터)를 비교

※ 원시타입(primitive) 변수

1. 논리타입 : boolean

2. 정수타입 : byte, short, int, long
3. 실수타입 : float, double
4. 문자타입 : char

 


 

관계 연산자(==) 좌우에 원시타입 변수가 하나라도 있으면 "값"을 비교해 줍니다. 아래와 같이 정수를 비교했을 때 일반 변수와 다른 객체의 값을 비교하더라도 같은 값으로 인식하고 있습니다. 하지만 객체(참조변수)와 객체를 비교했을 때는 다른 값으로 인식합니다. 객체간의 비교는 값 자체가 아닌 값이 저장된 포인터 "주소"를 비교하고, 서로 다른 객체는 다른 메모리 주소에 저장되어 있기 때문입니다.

참고로 인스턴스에 포함된 원시타입 변수 또한 값으로 비교해줍니다. 인스턴스는 자체는 객체지만, 그 안에 포함된 원시타입 변수 하나만 찍어서 비교하면 객체 간 비교가 아니게 되는 것입니다.

 

package study.first;

public class Main {

	public static void main(String[] args) {

		Integer a = new Integer(1);
		Integer b = new Integer(1);
		int f = 1;
		Sub s1 = new Sub();
		
		/* 일반 정수형(f)와 객체 비교 */
		System.out.println(a == f);  // true
		System.out.println(b == f);  // true
		System.out.println(s1.q == f);  // true
		
		/* 객체와 객체 비교 */
		System.out.println(a == b);  // false
		System.out.println(b == s1.q);  // true (인스턴스 안의 원시타입 변수이므로 값 비교)
	}
}

class Sub {

	int q = 1; 
	
}

 


 

문자열은 원시형 타입이 아닌 객체에 가깝지만, 동작 방식을 보면 원시형 타입과 비슷하게 결과가 나와서 당황스러울 수 있습니다. 이는 문자열이 저장되는 구조를 알면 쉽습니다.

코드 내에 있는 문자열의 저장은 C언어와 같습니다. 즉 억지로 객체화 시켜서 따로 저장하지 않는 한, 코드 내의 같은 문자열은 한 번만 저장하고 해당 위치의 값만 가지고 있습니다. 이 때문에 같은 관계 연산자에서도 true값이 나와 값을 비교하는 것 같이 보일 수 있지만 사실 객체 간의 비교와 같이 주소를 비교하고 있는 것이죠.

그리고 인스턴스가 달라도 그 안의 같은 문자열(코드에 포함된 문자열)은 같은 주소를 가리키고 있으므로 관계 연산자 비교 시 true값이 나오게 됩니다.

 

package study.first;

public class Main {

	public static void main(String[] args) {

		String a = new String("abc");
		String b = new String("abc");
		String f = "abc";
		Sub s1 = new Sub();
		Sub2 s2 = new Sub2();
		
		System.out.println(a == f);  // false
		System.out.println(b == f);  // false
		System.out.println(a == b);  // flase
		
		
		System.out.println(s1.q == f);  // true
	    System.out.println(s1.q == s2.z);  // true
		
	}
}

class Sub {

	String q = "abc"; 
	
}


class Sub2{
	
	String z = "abc";
}

 


 

따라서 원시타입 변수 간 비교가 아닌, 객체 간의 데이터(필드값)를 비교할 경우 메소드를 따로 만들어서 사용합니다. 대표적으로 equals와 hashCode 메소드가 있습니다. 이 메소드들은 심지어 이클립스에서 자동 생성 기능까지 있고 Object의 해쉬코드 생성 메소드를 이용하면 직접 쉽게 만들 수 있습니다. 다음글에 추가로 정리해보겠습니다.

728x90

댓글

💲 추천 글