Programming 기초/Java

[Java] == vs equals

뭉제 2023. 3. 9. 19:17
목차
1. 원시 데이터 타입과 클래스
2. == 연산자
3. equals 메소드

 

 

 

이전 게시글에서 문자열을 비교할 때 == 연산자 대신 equals 메소드를 이용했다.

왜 == 연산자를 이용할 경우 같은 문자열처럼 보여도  false가 반환될까?

 

 

원시 데이터 타입과 클래스


자바에서 기본적으로 다루는 데이터 타입으로 boolean, byte, char, short, int, long, float, double 8개가 있다.

-> 원시 데이터 타입(primitive type) 또는 기본 데이터 타입이라고 부른다.

 

원시 데이터 타입을 제외한 나머지는 참조 타입(reference type)이라고 한다.

ex) 배열, 클래스, 인터페이스 등

 

원시 데이터 타입

· 변수 선언: 메모리(stack)에 공간이 할당되며, 그 메모리 공간 안에 실제값이 저장된다.

-> 기본 타입 변수는 값을 직접 저장한다.

 

클래스

· 인스턴스 생성: 메모리(heap)에서 공간을 할당하여 값을 저장하고, 변수는 그 값이 저장된 메모리의 주소를 가리킨다.

-> 참조 변수는 객체를 가리킨다. 즉 객체의 주소값을 저장한다. 

 

=> 변수는 stack 영역에 생성, 객체는 heap 영역에 생성된다.

=> 원시 데이터 타입은 java 메모리의 stack 영역에 실제값을 가지고 있고,

     참조 타입은 stack 영역에 주소값(heap 영역의 객체 주소)을 갖고 있다.

 

 

 

== 연산자


public class EqualsApp {
	public static void main(String[] args) {
		int a=1; 
		int b=1;	
		System.out.println(a==b); //true
		
		String s1=new String("java");
		String s2=new String("java");
		System.out.println(s1==s2); //false
		
		String s3="java";
		String s4="java";
		System.out.println(s3==s4); //true
	}
}

변수와 메모리의 관계

 

· == 연산자변수가 일차적으로 가리키고 있는 메모리 공간의 값을 기준으로 판단

· 원시 타입 변수인 a, b는 1이라는 값을 가리키고 있다.

   -> == 연산자를 이용하면 true가 나온다.

· 참조 변수인 s1, s2, s3(s4)는 일차적으로 각각 10번지, 11번지, 12번지라는 주소값을 가리키고 있다.

   -> 서로 == 연산자를 이용하면 false가 나온다.

 

=> 기본 타입의 == 연산은 변수의 값을 비교하고, 참조 타입의 == 연산은 동일한 객체를 가리키는지 비교한다.

 

 

** 리터럴을 이용해 문자열을 생성할 때

이미 같은 문자열을 생성한 적 있다면 새로 메모리 공간을 할당하지 않고, 변수는 기존의 문자열이 저장된 메모리(String pool(heap))의 주소를 가리키게 된다.

-> == 연산자를 이용하면 같은 주소를 가리키고 있기 때문에 true가 나온다.

 

 

equals 메소드


public class EqualsApp {
	public static void main(String[] args) {		
		String s1=new String("java");
		String s2=new String("java");
		System.out.println(s1.equals(s2)); //true
		
		String s3="java";
		String s4="java";
		System.out.println(s3.equals(s1)); //true
	}
}

 

· equals 메소드는 구현에 따라 다르지만, 변수가 최종적으로 가리키고 있는 값을 기준으로 판단

· 다른 번지에 저장되어 있는 s1, s2, s3(s4)는 최종적으로 "java"라는 값을 가리키고 있다.

   -> 서로 equals 메소드를 이용하면 true가 나온다.

 

 

 

<참고>

https://kephilab.tistory.com/35

https://yaboong.github.io/java/2018/05/26/java-memory-management/