JAVA 제어문

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

수업소개

자바에서 문자나 객체를 비교할 때는 ==가 아닌 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. jeisyoon
    2021.05.01 문자비교의 차이점 - OK
  2. anya422
    done!
  3. 레이
    2021.04.10
  4. Sunho Kim
    완료(2021.04.08.목)
  5. chimhyangmoo
    21.04.08
  6. 김우중
    감사합니다
  7. 감사합니다!!
  8. baeroro
    20210211

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

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


    예외> String
  9. 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를 쓰거나 검색해서 확인해보셔야한다고 말씀하셨는데 일단은 저두가지로 알고있는게 편할것같다.
  10. 아츄
    201230
  11. 청담늑대
    자료형 혹은 Boolean형 데이터 타입 - Primitive (원시형 데이터)
    그 외 String, Array, Data, File 등 - Non Primitive(비 원시형 데이터)

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

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

    하지만, main 함수를 통해 입력 받은 임의 문자열 값을 동등 비교 연산자로 비교 했을 시, 같은 값임에도
    false가 반환 되었다면, 두 비교 데이터의 위치가 다르기에 false가 반환
    그렇기에, 문자열 또한 equlas 함수를 통한 비교를 하는게 가장 적합한 방법
  12. 20201213
  13. 자바가 무섭지 않은 예솔
    감사합니다. 더 노력할게요!
  14. 안광민
    [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가 나오는 것이다.

    완료
  15. 뱅글이
    원시데이터와 비원시데이터가 있다.
    원시데이터는 값이 같다면 같은 곳에 저장이 되어있기 때문에 비교연산자 사용이 가능하다
    > 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 )
  16. 준서
    0. 변수의 선언
    -원시 데이터 타입
    ->한 저장소에 매칭
    -비원시 데이터 타입
    ->다른 저장소에 매칭
    -new
    ->다른 저장소에 매칭
    1. 원시 데이터 타입의 비교
    a==b
    2. 비원시 데이터 타입의 비교
    a.equals(b)
  17. 이정왓
    아하~ 저번시간에 저장했던 id = "egoing" ; 이랑 InpuId = args[0];은 각자의 egoing이 다른 저장소에 저장이 되어있으니 == 을 했을때 같은곳을 가리키지 않아서 false가 떴던 거군요!
  18. 헤딩코딩
    @원시 자료형(더이상 쪼갤수없는 자료형) 은 같은값이면 같은주소를 가리킨다
    그러므로 == 연산자로 비교를하면 true가 나온다.

    @비원시 자료형은 new를 선언해 서로다른 주소를 사용하기때문에
    ==가 아닌 .equals()를 사용하자.
  19. Gyeong Min Lee
    ㅇㄹ
  20. 선대범
    // 원소 자료형들처럼 "="로만 변수 선언하는 경우 값이 같으면 변수이름이 다르더라도 같은 메모리 주소를 가르키지만
    // 원소 자료형이 아니면 값이 같더라도 다른 주소를 가르킨다.
    // String은 원소 자료형은 아니지만 원소 자료형 취급을 해준다.
    // String이라 하더라도 new를 이용해 선언한다면 같은 값이라도 다른 주소를 가르키게 되어 false값이 나온다.

    // 그때 비교하는 방법은 비교대상.equals(비교대상) 형식으로 메소드를 사용하는 것이다.
  21. 2020 06 24
  22. Phill
    이해 쏙속!
  23. claire
    좋은 추가 설명 감사합니다
    대화보기
    • 왜 equals를 쓰는가
      자바에는 원시데이터 타입과 비원시데이터 타입이 있는데, 자바는 이 둘을 다루는데 차별이 있다.
      요약하자면, int같은 원시데이터 타입은 ==로, String같은 비원시데이터타입은 equals()를 쓰는 것이 좋다.

      ==(동등연산자)는 '메모리 상에서 같은 주소(위치)를 가리키고 있냐'라는 물음이기 때문에 원시데이터타입의 경우 값이 동일하면 true가 반환된다.

      equals() 메소드는 '값 내용물이 같은가'라는 물음이기 때문에 비원시데이터 타입에서 사용된다.
      (String 같은 경우는 자주 쓰이기 때문에 동등연산자 ==를 사용해줄수도 있으나, 오류가 날 수도 있으므로 그냥 equals를 쓰는게 속편하다.)
    • yyrr
      완료
    • 뉸찡
      2020.03.06 완료
      감사합니다!
    • 감자
      수강 완료
    • 설탕소금
      감사합니다,
    • 임지수
      2020.01.30 완료
    • serina
      감사합니다!
    • 라또마니
      감사합니다. 근데 위에 강의6의 소스코드는 보이나 연결이 없습니다. 참고하세요!!
    • 이기호
      명 강의 감사합니다!
    • 쑤우
      수강완료. 감사합니다.
    • 허공
      감사합니다!
    • 김민호
      정주행중입니다 ㅎㅎ
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기