생활코딩

Coding Everybody

문자의 비교 : ==과 equals의 차이점

토픽 생활코딩 > 언어 > JAVA 입문 수업 > JAVA - 제어문

수업소개

자바에서 문자나 객체를 비교할 때는 ==가 아닌 equals를 사용해야 합니다. 그 이유와 equals의 의미를 살펴봅시다. 

 

 

 

강의

소스코드

public class AuthApp2 {

    public static void main(String[] args) {
		
		String id = "egoing";
		String inputId = args[0];
		
		String pass = "1111";
		String pass2 = "2222";
		String inputPass = args[1];
		
		System.out.println("Hi.");
		boolean isRightPass = (inputPass.equals(pass) || inputPass.equals(pass2));
		if(inputId.equals(id) && isRightPass ) {
			System.out.println("Master!");
		} else {
			System.out.println("Who are you?");
		}		

	}

}

 

 

 

 

댓글

댓글 본문
  1. 항해자
    20240707
  2. 240527
  3. 코딩앤수학
    2024-05-08
  4. 당당
    2023.04.13
  5. 자바뿌시기
    22.01.03
  6. Min Jupiter
    221222
  7. 코딩드림
    221106
  8. 보통사람 박코딩
    할수있다
  9. 후토마끼
    22.10.10
  10. 원시 데이터 타입(primitive) 7가지
    --> boolean, int, double, short, long, float, char

    원시 데이터 타입이 아닌 것: String,. Array, Date, File, ...


    기본적으로 원시 데이터 타입들은 같은 데이터라면 heap 안에서 같은 메모리 공간을 가리키게 된다.

    int p1 = 1 ---> 같은 매모리 공간을 가리킴 (p1 == p2 는 true)
    int p2 = 1

    이렇게 되면 == 연사자를 사용하면 p1과 p2는 같다고 인식하게 됨.
    p1 == p2 ---> true


    하지만 String은 특혜를 받고있어서,
    primitive가 아님에도 같은 데이터면 같은 메모리 공간을 가리킨다. (원시 데이터 타입처럼 동작한다)

    String o3 = "java2" ---> 같은 메모리 공간을 가리킴 (o3 == o4 는 true)
    String o4 = "java2"


    그래도 쉽게말하면, 원시 데이터 타입은 == 사용하면 된다. equals를 가지고있지도 않다.(오류남)
    원시 데이터 타입이 아닌 객체들에겐 equals를 사용하는게 편하다.

    ################추가################

    같은 데이터를 heap 안에서 다른 메모리 공간에 할당하고 싶으면 new 연산자를 사용하면 된다.

    String ex1 = new String ("java") ---> 각각의 메모리 공간을 할당받음 (ex1 == ex2 는 false)
    String ex2 = new String ("java")
  11. 코리니
    912
  12. economin
    1. ==는 같은 값이 같은 위치에 있나?? quals는 내용이 같나?물어보는 것.
    2. 원시데이터 타입은 equals 사용x(애초에 method로 가지고 있지도 않음)
    3. 비원시데이터 타입은 equals 사용
    4. 특수하게 String의 경우는 원시데이터타입으로 취급
  13. primitive 원시데이터타입, non primitive 비원시데이터타입 에따라서
    ==동등비교연산자, equals() 메소드 사용이 나뉜다.

    ==동등비교연산자의 경우, 원시데이터타입처럼 같은값이 같은위치에저장된경우 사용

    equals()메소드의 경우, 비원시데이터타입처럼 새로운 다른위치에 저장되었지만 같은내용인지를 비교하는경우 사용
  14. 육도
    202.05.12 완료
  15. 열정jk
    220220 감사합니다
  16. 나연
    2022년 2월 5일 (토) 완료

    자바 데이터 타입
    - Primitive (원시): boolean, int, double, short, long, float, char
    -- 더 이상 쪼갤 수 없는 데이터
    - Non-primitive: String, Array, Date, File, ...

    원시 데이터 타입
    ```java
    int p1 = 1;
    int p2 = 1;

    /*
    * name | value
    * p1------> 1
    * p2-----↗
    * p1 == p2 // true
    */

    String java = new String("java");
    String java2 = new String("java");

    /*
    * name | value
    * java ------> "java"
    * java2 ----> "java"
    * java == java2 // false
    * java.equals(java2) // true
    */

    // 문자열은 특혜를 받음
    String java3 = "java2";
    String java4 = "java2"; // 이 방식은 문자열을 원시 데이터 타입처럼 동작하게 함

    /*
    * name | value
    * java3 ------> "java2"
    * java4 -----↗
    * java3 == java4 // true
    */
    ```

    원시 데이터 타입이 아닌 객체들은 모두 `equals()`라는 메소드를 가지고 있음
    동등 비교 연산자 (`=`)는 같은 곳에 있는지, `equals()`는 내용이 같은 지 확인

    원시 데이터 타입이 아닌 것들에는 `equals()` 사용하기
  17. 김나루
    2022.01.21
  18. 초보자바
    2021-12-23 완료
    동등비교연산자를 이용하여 비교를 할 때는 데이터 타입이 무엇인지 봐야한다.
    원시데이터타입인 int, char, boolean, ,,,일 때는 동등비교연산자를 사용
    위의 것이 아닌 String, Array, Date ,,,일 때는 equals()를 이용한다.
  19. 주간식당메뉴
    21.10.28.
  20. won4175
    2021.10.17
  21. 20210829 완료
  22. labis98
    20210810 완료!!!
  23. 이마누
    완료
  24. super1Nova
    210805
  25. Jaemin Lim
    21.07.24
  26. B=loom
    2021.07.17
  27. 걸어가는신사
    2021-07-05
  28. 초딩 개발자
    2021/06/18
  29. 도공우승9
    완료
  30. 쓰느이이
    210520
  31. 이준상
    2021_05_11 "== equals 차이"
  32. jeisyoon
    2021.05.01 문자비교의 차이점 - OK
  33. anya422
    done!
  34. 레이
    2021.04.10
  35. Sunho Kim
    완료(2021.04.08.목)
  36. chimhyangmoo
    21.04.08
  37. 김우중
    감사합니다
  38. boat
    감사합니다!!
  39. baeroro
    20210211

    primitive(원시) : 더 이상 쪼갤 수 없는 데이터 (int, double, float, long, char...)
    non primitive : string, file, data, class...

    == : 같은 위치를 가리키고 있는지? => 원시데이터 사용
    equals : 내용이 같은지? => 원시데이터 아닌 데이터에 사용


    예외> String
  40. artmaker
    자바의 데이터 타입 구분

    primitive (원시의) : char, boolean, int, double, float, short, long ...
    non primitive(비원시의) : String, File, Date, class ..

    자바에서 ==은 같은위치에 있냐는 것을 물어보는 동등비교연산자이다.

    int p1 = 1
    int p2 = 1 을 예시로 들어보자 자바에서는 같은 값을 가지는 변수는 같은 곳을 가리키고 있게한다. 쉽게말하면 메모리 어딘가에 1이라는 값이 넣어졌고 p1 p2모두 그 곳을 가리키고 있게 되는것이다. 원시데이터 타입들은 모두 이런식으로 동작한다.

    자바에서는,
    String o1 ="java"
    String o2 = new String("java"); 이 둘을 다르게 취급한다. 밑에 String은 자바라는 값을 가진 객체로 취급한다.
    그리고 객체는 값이 같더라도 같은위치에 존재하지 않게된다. 그래서 o1 == o2 라고하면 다른 위치에 있기 때문에 false라는 값이 출력된다. 원시데이터 타입이 아닌 객체들은 equals라는 메소드를 가진다.
    따라서 원시데이터타입에는 동등비교연산자를 쓰면되고 객체나 비원시데이터타입에는 equals를 쓰면된다.

    그러나, String의 경우 특혜를 받고있다. 같은값을 집어넣었을때 변수가 같은 곳을 가리킨다.(허나 예외로 전시간에 입력값을 똑같이 줬는데 false가 떨어졌었다. 이는 내부적으로 입력값이 다른곳에 저장되었다는 뜻이다. )마치 원시데이터타입처럼 동작한다.

    원시데이터인경우 == 을쓰고 원시데이터 타입이아니면 equals를 쓰거나 검색해서 확인해보셔야한다고 말씀하셨는데 일단은 저두가지로 알고있는게 편할것같다.
  41. 아츄
    201230
  42. 청담늑대
    자료형 혹은 Boolean형 데이터 타입 - Primitive (원시형 데이터)
    그 외 String, Array, Data, File 등 - Non Primitive(비 원시형 데이터)

    동등 비교연산자 '=='는 두 비교 대상의 데이터의 저장된 위치가 같은가
    .equals(Objecct args)는 두 비교 대상의 데이터 내용이 같은가

    원시형 데이터는 전달받은 값의 저장된 데이터 위치 기준, 비 원시형 데이터는 전달 받은 값의 내용 기준
    그렇기에 비 원시형 데이터에게 '=='비교는 false가 반환 된다.
    단, string의 문자열은 예외로 동등 비교 연산자를 통해 true/flase 반환이 가능

    하지만, main 함수를 통해 입력 받은 임의 문자열 값을 동등 비교 연산자로 비교 했을 시, 같은 값임에도
    false가 반환 되었다면, 두 비교 데이터의 위치가 다르기에 false가 반환
    그렇기에, 문자열 또한 equlas 함수를 통한 비교를 하는게 가장 적합한 방법
  43. oyuiw
    20201213
  44. 자바가 무섭지 않은 예솔
    감사합니다. 더 노력할게요!
  45. 안광민
    [equals]
    primitive = 쪼갤 수 없는 데이터(boolean, int, double, short, long, float, char)
    non primitive = 그 외의 데이터(String, Array, Date, File, ...)
    자바가 이 둘을 차별한다.

    String o1 = new String("java")
    String o2 = new String("java")
    o1 == o2 는 false가 나오게 된다. 둘은 다른 데이터를 가리키고 있기 때문이다.

    non primitive 데이터만 모두 equals라는 method를 갖고 있다. 이를 통해 내용이 같다면 같다고 할 수 있게 된다.

    new 없이 그냥 String o3 = "java" 이렇게 하면 서로 같다고 할 수 있다. 입력값이 같은 곳에 저장되었다는 것이다.

    그렇다면 같다고 할 때 true가 나오지 않는 경우는, 서로 내용이 같더라도 입력값이 다른 곳에 저장되어있기에 false가 나오는 것이다.

    완료
  46. 뱅글이
    원시데이터와 비원시데이터가 있다.
    원시데이터는 값이 같다면 같은 곳에 저장이 되어있기 때문에 비교연산자 사용이 가능하다
    > a = 1, b = 1, a==b (true)
    비원시 데이터, 객체나 문자를 비교할 때는 값이 같아도 저장된 장소가 다르기 때문에 다른 곳을 가리키고 있다.

    String a= new String("Pass");
    String b = new String("Pass");
    System.out.println(a==b); // false값 반환
    System.out.println(a.equals(b)); //true값 반환

    --? 논리 연산자에 대한 내용은 이곳엔 소스코드만 있고 영상은 유튜브에만 올라가 있나봅니다.

    // AND
    (true)&&(true) - true
    (true)&&(false) - false
    (false)&&(true) - false
    (false)&&(false) -false

    //OR
    (true)||(true) - true
    (true)||(false) - true
    (false)||(true) - true
    (false)||(false) - false

    // not
    (!true) = false
    (!false) = true


    Boolean isRightpass = (inputPass.equals(pass)||inputPass.equals(pass2));
    if(inputId.equals(id)&& isRightpass )
  47. 준서
    0. 변수의 선언
    -원시 데이터 타입
    ->한 저장소에 매칭
    -비원시 데이터 타입
    ->다른 저장소에 매칭
    -new
    ->다른 저장소에 매칭
    1. 원시 데이터 타입의 비교
    a==b
    2. 비원시 데이터 타입의 비교
    a.equals(b)
  48. 이정왓
    아하~ 저번시간에 저장했던 id = "egoing" ; 이랑 InpuId = args[0];은 각자의 egoing이 다른 저장소에 저장이 되어있으니 == 을 했을때 같은곳을 가리키지 않아서 false가 떴던 거군요!
  49. 헤딩코딩
    @원시 자료형(더이상 쪼갤수없는 자료형) 은 같은값이면 같은주소를 가리킨다
    그러므로 == 연산자로 비교를하면 true가 나온다.

    @비원시 자료형은 new를 선언해 서로다른 주소를 사용하기때문에
    ==가 아닌 .equals()를 사용하자.
  50. Gyeong Min Lee
    ㅇㄹ