케네스로그

[Java] 관계 연산자, 균등 연산자 본문

Dev/Java

[Java] 관계 연산자, 균등 연산자

kenasdev 2022. 2. 5. 14:31
반응형

관계 연산자 Comparison Operator

관계연산자는 같은 타입의 값들을 비교하는 연산자를 말하며, 결과 값은 true 또는 false로 반환합니다.

 

균등연산자, 관계연산자 equality & relational operator

== equal to
!= not equal to
> greater than
>= greater than or eqaul to
< less than
<= less than or eqal to

균등 연산자와 관계 연산자 둘 다 피연산자들의 값을 비교합니다.

균등 연산자는 피연산자들이 같은지 다른지를 비교하며, 관계연산자는 피연산자 값들의 크기를 비교합니다.

 

균등연산자와 메모리 값 비교

균등 연산자의 경우, 각 피연산자가 어떤 타입이냐에 따라 나뉘어집니다.

  • 두 피연산자 모두 primitive type인 경우
    primitive variable이 저장되어 있는 stack영역의 메모리에서 값을 가져와서 비교합니다.
  • 한쪽은 primitive type, 다른 한쪽은 reference type인 경우
    refeerence type 변수는 Heap영역의 메모리 주소를 갖고 있습니다. 따라서, primitive type 값과 메모리 주소 값이 동일한지 확인하게 되는 오류를 범하게 됩니다.
  • 둘 다 reference type인 경우
    둘 다 reference type인 경우, 스택영역에서 저장하고 있는 변수가 같은 heap영역의 메모리 주소를 가리키고 있는지 확인하게 된다.
int a = 3;
int b = 3;
a == b // true

String s1 = new String("hello");
String s2 = new String("hello");
s1 == s2 // false

String s3 = "world";
String s4 = "world";
s3 == s4 // true

 

참조타입 비교 reference type comparision

==연산자는 피연산자(객체)가 메모리 공간 상 같은 곳을 가리키는지 확인한다.
new키워드를 통해 객체를 생성하면 새로운 메모리 공간에 객체가 생성된다. 

레퍼런스 타입의 경우, 주소값을 다루는 데이터 타입이기때문에 균등/관계 연산자를 사용하는것이 적절치 않습니다.

// CASE 1
String s1 = new String("hello");
String s2 = new String("hello");

System.out.println(s1==s2); // false

// CASE 2
String s3 = "world";
String s4 = "world";

System.out.println(s3==s4); // true

CASE 1에서는 “hello”라는 문자열을 각각 새로운 메모리에 할당하여 비교합니다. 그렇기에 같은 문자열을 갖고 있지만, 서로 다른 주소를 참조하고 있습니다. 그 결과로 둘을 비교하면 false를 반환한다.

 

CASE 2에서는 메모리 공간에 위치한 “world”라는 문자열을 둘 다 가리킵니다. 따라서, 둘을 비교하면 true를 반환하게 됩니다.

 

반응형

'Dev > Java' 카테고리의 다른 글

[Java] 메소드, 접근제어자  (0) 2022.02.08
[Java] 클래스  (0) 2022.02.08
[Java] 쉬프트 연산자 <<, <<<  (0) 2022.02.05
[Java] 비트연산자 bitwise  (0) 2022.02.04
[Java] 산술연산자  (0) 2022.02.04