ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • .equals와 ==
    spring.project.log 2022. 4. 16. 23:59

    출처 글을 보고 번역하여 정리한 글입니다. 네이버님들 파파고 개발해주셔서 감사합니다

    https://www.geeksforgeeks.org/difference-between-and-equals-method-in-java/
     

    Difference Between == and .equals() Method in Java - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org

    • equals, == 의 차이
    • 부연설명
    • 예제 1 : 상수풀과 힙에 있는 값과 주솟값 비교
    • 예제 2 : 원시타입과 객체타입에서의 == 연산자
    • 예제 3 : 컴파일 에러
    • 예제 4 : ?? 뭐라고 요약하죠 지하철에서 생각해보겠음

    요약 :

    1.equals는 메서드, ==는 연산자

    2. == 연산자는 참조 비교(주소 비교)의 용도로 사용하고,

    .equals() 메서드는 내용 비교의 용도로 사용한다.

    3. 클래스가 equals메서드를 오버라이딩하지 않으면, 기본적으로 이 메서드를 오버라이딩한 가장 가까운 부모클래스의 equals 메서드를 사용한다. * equals method overriding

     

    일반적으로 자바에서 equals와 "==" 연산자는 객체를 비교하여 동일성을(equality) 확인하는 데 사용되지만, 몇 가지 차이점이 있다.

    equal() 메서드와 == 연산자는 모두 Java에서 두 객체가 같은 지 비교하는 데 사용된다. 하지만 == 연산자는 참조나 힙에 있는 객체의 메모리 위치를 비교한다. (두 객체가 같은 위치를 가리키는지 비교한다는 뜻)

    new 연산자를 사용하여 객체를 생성할 때마다 해당 객체에 대한 새 메모리 위치가 생성된다. 그래서 우리는 == 연산자를 사용하여 두 객체의 메모리 위치나 주소가 동일한지 여부를 확인한다.

    == 는 두 객체가 동일한 메모리 위치를 가리키는지 확인하는 반면, .equals()는 객체의 값이 같은지 평가한다

     


    예제 1

    // Java program to understand
    // the concept of == operator
     
    public class Test {
        public static void main(String[] args)
        {
            String s1 = "HELLO";
            String s2 = "HELLO";
            String s3 =  new String("HELLO");
     
            System.out.println(s1 == s2); // true
            System.out.println(s1 == s3); // false
            System.out.println(s1.equals(s2)); // true
            System.out.println(s1.equals(s3)); // true
        }
    }

    1. s1==s2 (true)

    s1과 s2는 상수풀에 "HELLO"라는 문자열을 가지고 있고 S1과 S2가 그걸 참조하고 있는 형태로 되어있으므로

    s1과 s2의 주솟값은 같다.

    2. s1==s3 (false)

    s1은 상수풀에 "HELLO"라는 문자열을 가지고 있고 new 생성자를 사용해 새로운 객체를 만든 s3는 새로운 주솟값이 생성되었으므로

    s1과 s3의 주솟값은 다르다.

    3. s1.equals(s2)

    문자열 s1과 문자열 s2은 같은 값을 가지고 있기 때문에 값을 비교하는 equals로 비교했을 때 참이다.

    4. s1.equals(s3)

    문자열 s1과 객체 s3는 같은 값을 가지고 있기 때문에 equals로 비교했을 때 참이다.

     

    예제 2

    boolean 타입을 포함한 모든 원시타입(primitive type)에 대해 == 연산자를 적용할 수 있다.
    또한 객체타입에 대해서도 == 연산자를 적용할 수도 있다.
    // Java program to illustrate
    // == operator for compatible data
    // types
     
    class Test {
        public static void main(String[] args)
        {
            // integer-type
            System.out.println(10 == 20);
     
            // char-type
            System.out.println('a' == 'b');
     
            // char and double type
            System.out.println('a' == 97.0);
     
            // boolean type
            System.out.println(true == true);
        }
    }
    false 다른 주솟값을 가짐
    false 다른 주솟값을 가짐
    true 같은 주솟값을 가짐 //ASCCI 10진수로 97
    true 같은 주솟값을 가짐

     

    객체타입에 == 을 적용하는 경우 인자 타입(자녀에서 부모 또는 부모에서 자식 또는 동일한 타입) 간에 호환성(? compatibility)이 있어야 한다. 그렇지 않으면 컴파일 타임 에러가 발생한다.

     

    예제 3

    // Java program to illustrate
    // == operator for incompatible data types
     
    class Test {
        public static void main(String[] args)
        {
            Thread t = new Thread();
            Object o = new Object();
            String s = new String("GEEKS");
     
            System.out.println(t == o);
            System.out.println(o == s);
     
           // Uncomment to see error
           System.out.println(t==s);
        }
    }
    false
    false
    // error: incomparable types: Thread and String

    예제 4

    public class Test {
        public static void main(String[] args)
        {
            Thread t1 = new Thread();
            Thread t2 = new Thread();
            Thread t3 = t1;
     
            String s1 = new String("GEEKS");
            String s2 = new String("GEEKS");
     
            System.out.println(t1 == t3);
            System.out.println(t1 == t2);
            System.out.println(s1 == s2);
     
            System.out.println(t1.equals(t2));
            System.out.println(s1.equals(s2));
        }
    }
    true
    false
    false
    false
    true

    스레드의 값이 언제 생성되는지(?) 런타임때 정해지나

    스레드는 객체타입인거임? 자료형이 뭐임

    'spring.project.log' 카테고리의 다른 글

    문자열 계산기 javascript.ver  (0) 2022.04.10
    [JAVA] 접근제어자, getter/setter  (0) 2022.03.26
    오버라이딩(overriding)과 오버로딩(overloading)  (0) 2022.03.18
    이넘(enum)  (0) 2022.03.17
    인터페이스(interface)  (0) 2022.03.17
Designed by Tistory.