Java

쉽게 배우는 JAVA2 -1(== VS equals)

꽃달린감나무 2021. 8. 4. 14:32
728x90

-부스트 코스에 있는 쉽게 배우는 자바2 수업을 듣고 까먹었던 것, 익숙하지 않은 것, 새롭게 알게된 것을 잊어버리지 않기위해 스스로 남겨두는 공간입니다. -

 

 

JAVA의 기본 데이터 타입 중 2가지의 타입이 존재합니다.
하나는 원시적 데이터 타입 또 하나는 비원시적 타입 입니다.

먼저 원시적 데이터 타입을 살펴보죠.

원시적 데이터 타입에는 8가지의 데이터 타입이 있습니다.

가장 기본적인 자료형인, boolean, byte, char, short, int, long, float, double 입니다.

이러한 데이터 타입은 변수가 선언이 되면 메모리(Stack)에 공간이 할당됩니다.

예를 들면 int num = 8  변수선언을 했을 때 8을 메모리 공간에 할당하게 됩니다. 여기서 중요한 포인트는 

int num2 = 8를 두번째로 선언하면 8이 이미 있으므로 num이 가리키고 있는 메모리 공간을 num2가 가리키게 합니다.

따라서 if(num == num2)가 있을 때 서로 값이 같은 지를 보기 보다는 서로가 가리키는 메모리 공간이 같은 지를 확인하게 하는 것 입니다. 여기서 요점은 ==(비교)는 값이 같은 지 보다는 메모리 공간 중에 어디를 가리키는 가(같은 주소인가?)에 중점을 두는 것 입니다.

 

이제 비원시적 데이터 타입을 봅시다. 비원시적 데이터 타입에는 java.lang.Object 클래스를 비롯해 파생된 모든 클래스들을 일컸습니다. 클래스로 인스턴스를 생성할 때마다 같은 값을 가졌더라고 늘 새로운 메모리 공간에 할당하는 것 입니다. 그래서 ==연산자는 메모리 공간에 값보다는 주소가 같은 가를 확인하다 보니다 같은 값을 가진 인스턴스라도 false값이 도출되게 되는 것입니다. 따라서 인스턴스를 비교할때는 메모리의 주소 확인하지 않고 값이 같은지를 확인하는 *.equals를 사용해야 합니다.

 

문자열과 리터럴은 원시적 데이터와 비슷한 방식을 가집니다. 

예를 들며 설명해 봅시다.

String s1 = "Hello";

String s2 = "apple";

String s3 = "Hello";

s1을 생성할 때 메모리 공간(Heap)에 문자열 값을 Hello를 넣습니다. 그리고 그 메모리(Heap) 주소 10을

메모리(Stack)에 넣습니다. 

s2를 생성할 때도 마찬가지 입니다.

s3를 생성할 때에는 이미 같은 값을 가진 문자열이 있으므로 s3 메모리 공간(stack)에 Hello값을 가진 메모리(Heap) 주소값 10을 넣습니다.

String은 같은 주소값을 가졌는지 확인하는  ==연산자를 사용할 수 있습니다.

따라서 if(s1 ==s2)의 결과값은 true가 됩니다.

변수와 메모리 관계도

사진출처 : https://www.boostcourse.org/cs128/lecture/264918?isDesc=false

728x90