본문 바로가기

Java

동일성과 동등성(==, equals())

동일성과 동등성

Java를 쓰다보면 equals()를 써야하는데 ==를 써서 에러가 나는 경우가 많다. ( ... ㅜㅜ )

두 변수의 값을 비교하기 위해서 == 연산자를 사용하고 있는데 이 연산자를 이용한 비교는
primitive 타입의 자료형에만 해당한다.

primitive 타입 자료형은 char, byte, short, int, long, float, double, boolean과 같은 기본형 타입을 말한다.

Java에는 primitive말고 reference 타입이란 게 있는데 우리가 흔히 사용하는 new 연산자로 생성할 수 있는 객체입니다.
얘네는 주소 값을 가지고 있다.

new 연산자란 클래스의 객체를 생성하고 -> 메모리를 올리고 -> 참조변수(주소 값)를 반환해주는 연산자다.

 

여기서 동일성동등성이란 개념이 나오는데

동일하다는 두 개의 객체가 완전히 같은 경우를 의미하고
동등하다는 두 객체가 같은 정보를 갖고 있을 경우를 의미한다.

동일하다는 ==로 쓰고, 동등하다는 equals 연산자를 사용한다

== 연산자는 주소값을 비교하고 equals는 내용을 비교한다.

예를 들어보자.

String str1 = new String("abc");
String str2 = new String("abc");

System.out.println(str1==str2); //=> false
System.out.println(str1.equals(str2)); //=> true

str1과 str2의 객체를 생성해주면 str1과 str2는 주소 값이 다른 두 개의 객체가 생성되게 된다.
그래서 str1==str2를 하면 false가 나온다. 왜냐하면 str1의 주소 값과 str2의 주소 값은 다르기 때문이다.

대신 equals() String 클래스에서 오버라이딩해서 만들어둔 함수로
주소가 아닌 변수 내 값을 비교해준다. 결과 값은 true가 나오게 된다.

 

* 추가 : String의 특이한 점
String은 reference 타입이다. 그래서 new를 사용해서 객체를 만들어주어 사용해야 한다.
하지만.. 문자열을 정말 자주 사용하고 있고, 시스템의 부담을 줄이기 위해 primitive 변수 처럼 선언할 수 있다


또한 실제로 값을 비교해도 primitive 타입 변수처럼 비교가 가능하다.
String str1 = "안녕";
String str2 = "안녕";

System.out.println(str1==str2); // => true

문자열 상수에 대해서 문자열이 동일할 경우 인스턴스를 한 개만 생성하고 이를 같이 사용한다.
str1과 str2는 같은 주소 값을 갖고 사용하고 있다.

반응형

'Java' 카테고리의 다른 글

상속 : final 클래스와 final 메소드  (0) 2021.03.07
상속 : 메소드 재정의(오버라이딩)  (0) 2021.03.07
상속 : 상속의 개념  (0) 2021.03.07
참조타입  (0) 2021.03.04
변수와 타입  (0) 2021.02.08