# equals
[Java] equals랑 ==는 달라요
파이썬으로 백준을 주구장창 풀다가.. 자바로 프로그래머스를 풀고 있는 요즘 파이썬은 거의 다 직관적으로 쓰면 맞는데, 자바는 다른 경우가 많아서 골치가 아프다. 이번에도 문제를 풀다가 이상한 점을 발견했다. 분명히 인텔리제이에서 디버깅을 돌려보아도 답이 맞게 나오는데, 프로그래머스에서 테스트 케이스를 돌리면 틀린 것이었다. 문제 프로그래머스 문제는 다음과 같았고, https://school.programmers.co.kr/learn/courses/30/lessons/67256 코드는 아래와 같이 작성을 하였다. 여기서 바로 이 부분이 문제였던 것이다. 습관처럼 == 로 표시를 하였는데, 자바에서는 문자열을 equals로 비교하여야 한다. 간단하게 이유를 말하자면,

equals() 와 == 연산자의 차이
equals >equals() 는 메소드로 객체의 내용을 비교한다. 기존 equals()의 경우 Object 클래스의 메서드로, ==연산자와 동일하게 주소값을 비교한다. 하지만 흔히 문자열 비교를 위해 사용하는 equals()의 경우 String 클래스에서 오버라이딩을 함으로써 문자열 간의 비교가 가능해졌다 ==연산자 >==는 주소값을 비교한다 연산자의 경우 객체의 주소값을 비교한다. 그래서 비교하는 객체가 동일한 객체인지를 판별한다. Primitive Type의 객체에서는 값 비교, Reference Type에서는 주소비교를 수행한다. 참고로 Primitive Type 객체는 Constant Pool의 특정한 값을 참조하는 변수이기 때문에, 결국 Constant Pool 내의 동일한 주소를 비교한다. 📌리터럴을 이용한 방식 & new 연산자를 이용한 방식 String 변수를 생성하는 방법 중 하나로 리터럴을 사용하게 되면

[EFFECTIVE JAVA] equals는 일반 규약을 지켜 재정의하라
equals 를 재정의해야하는 이유에 대해서 알아보자 😃 equals() 란 Object 의 equals() 는 다음과 같이 재정의하지 않으면 해당 클래스를 통해 생성한 인스턴스는 오직 자기 자신과만 같게 된다. 보면 알 수 있듯이 Object.equals()는 결국 == 연산자를 이용하여 비교하기 때문에 해당 인스턴스가 저장된 메모리의 주소값으로 비교하게 되고 결국 자기 자신 외에는 모두 false 를 반환하게 된다. 쉽게 말해 기본적으로 동일성을 검사하기 때문에 별도의 재정의 없이는 같은 인스턴스가 아닌 경우에 모두 false를 반환한다. 모든 상황에서 equals() 재정의하는게 아니다. 아래와 같은 상황중 하나에 해당된다면 재정의하지 않는게 최선이다. 📌 재정의

[JAVA] A.equals("B") 와 A == B의 차이
개요 개발을 하던 중 평소와 다름없이 조건에 map에 들어있는 값과 String 값을 비교하기 위해 equals를 썼는데 java.lang.NullPointerException에러가 발생하는 것이다! 오잉? 나는 객체나 문자열을 비교할때는 equals를 쓰고 문자나 숫자를 비교할때는 ==를 사용해서 비교하는것으로만 기억하고있는데 왜 오류가 나는거지? 해서 내가 실수한 부분을 찾아보고 정리하는 것이다. 자 그럼 알아보자! _여담이지만 이번에 봤던 정보처리기사 2023년 2회 실기 시험문제에서도 equals와 ==의 결과값을 쓰는 문제가 나왔다. 문제로 낼 수 있을만큼 헷갈리기 쉬운것이다. 잘 알아보자!_ equals와 == 는 뭘까? A.equals("B")와 A == B 은 기본적으로 양쪽에 있는 A,B를 비교하기 위해서 사용한다. 그렇담 차이점은 뭘까? 하나씩 알아보자 1. == == 은 비교를 위한 연산자 이
자바 - Object 클래스 , equals , toString
[ Object 클래스 ] Java.lang.Object 클래스 (클래스 이름 앞에 붙는 이름은 패키지이다.) ' Java.lang ' = 패키지 이름, Object = 클래스 1. 모든 클래스의 최상위 슈퍼 클래스이다. 2. 별도의 슈퍼 클래스를 명시하지 않은 클래스들은(extends가 없는 클래스) 모두 Object 클래스의 서브 클래스이다. 3. 모든 것을 저장할 수 있는 Java의 만능 타입이다. 4. Object 타입으로 저장하면 Object 클래스의 메소드만 호출할 수 있다. 이를 해결하기 위해서 "반드시" 다운캐스팅을 해야 한다. (object 클래스 코드를 건들지 못하기 때문에 Override는 불가능) [ 사람 클래스 ] equals() : 모든 객체 비교는 equals()를 사용. 이클립스 메뉴 - Source - Generate hashcode() and equals()... 클릭
[item 11] equals를 재정의 하려거든 hashCode도 재정의하라.
equals를 재정의한 클래스 모두에서 hashcode도 재정의해야 한다. 그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다. 🔽 hashcode 재정의의 필요성 다음은 Object 명세의 일부이다. > - equals 비교에서 사용되는 정보가 "변경되지 않았다면", 어플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 "일관된 값을 반환"해야함. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 같은 값을 반환해야한다. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다. > h
자바 7차시 오브젝트 클래스
Object 클래스 모든 클래스의 최상위 클래스 toString() Object의 toString은 참조값을 문자열 형태로 출력한다. (클래스의 경로와 이름@16진수로 변환된(해시코드) 참조변수를 print()등의 출력메소드로 출력하면 항상 toString()이 사용된다. -> 참조값이 출력된 이유 toString()을 통해 출력되는 문자열을 바꾸고 싶으면 재정의해서 사용하면 된다. equals() Object의 equals()는 ==과 같다. (참조값 비교) String의 equals()는 재정의되어 값을 비교한다. -> 문자열의 비교는 equals()를 사용해야 한다. 우리가 만든 클래스 객체를 비교하고 싶다면 비교 기준을 재정의하여 사용할 수 있다. hashCode() object의 hashCode()는 객체의 주소값을 특정 알고리즘을 거쳐서 정수 값으로 반환한다. 자바에서는 euquals()를 재정의하면 hashC

[JAVA/프로그래머스] 배열의 유사도
문제 >### 답안 코드 >### 코드 풀이 equals와 ==의 차이점을 알 수 있는 문제. 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데, String클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다는 점이다.

자바 equals()와 hashCode() 같이 재정의 해야 하는 이유
자바 개발자로 취업을 준비하면서 모의 면접을 보게 되면 가장 많이 받는 질문 중 하나가 equals()와 hashCode()를 같이 재정의하는 이유일 것입니다. 솔직히, 이제는 이 질문이 너무 유명해져서 면접 때는 잘 안 나올 것 같지만 반드시 짚고 넘어가야 하는 개념이기 때문에 포스팅을 해봤습니다! 특히, Object 클래스와 String 클래스에서의 equals() 메소드의 작동 원리가 조금 다리기 때문에 이 부분도 공부해보겠습니다. Object 클래스의 equals() 먼저 Object 클래스의 equals 메소드의 내부 먼저 보겠습니다 Object.java Object 클래스의 equals는 객체의 메모리 주소가 같은지의 여부를 확인합니다. 따라서 만약에 새로운 객체를 만들고 객체의 내용이 같은지 판단하기 위해서는 equals() 메소드를 재정의해야 합니다. new() 키워드로 객체를 생성할 때 메모리의
자바 toString(), equals(), hashCode()의 연관성
toString() 자바에서 toString() 메소드는 Object 클래스에 정의된 메소드로 모든 객체가 상속받는 기본 메소드입니다. 이 메소드는 객체를 문자열로 표현하는 데 사용됩니다. 하지만 어떤 객체를 출력을 할 때 클래스이름@a65b32c <- 이런식의 출력결과를 봤을겁니다. 일부 사람들은 클래스 뒤의 문자열이 그 객체의 메모리주소값이라고 착각하실 순 있지만 사실은 메모리주소가 아닌 객체의 해쉬코드(hashcode)입니다. 빠르게 먼저 예시코드를 보여드리겠습니다. 결과 이렇게 기본적으로 Object 클래스에서 상속받은 toString() 메소드를 그대로 사용하면 클래스 이름과 16진수로 표시된 해쉬코드를 반환하게 됩니다. 하지만 이 문자열은 객체의 내부 상태를 잘 표현하지 못해 toStrin

TIL- do~while문 | next()와 nextLine() | equals() | Set
문제1 - do~while 이해 부족 1) 문제 무슨 소리일까 ..? while도 for도 이해가 되었는데, do ~ while은 정확하게 어떤 상황에 사용하면 좋을 지에 대한 감이 잡히지 않았다 do~while: 최초 1회 연산 수행 수 조건문을 확인해 더 반복할지 결정한다는데 ,, 그럼 일단 조건이 무엇이든지 (조건이 true인지 false인지 확인하지 않고) 우선은 do 문 안에 있는 코드를 한 번 실행한 뒤에, while문 안에 있는 조건을 파악하여 맞으면 반복하고, 불만족이면 반복을 멈춘다는 의미로 이해했다. 2) 시도 그렇다면 .. 코드를 만들어보자 ! 이렇게 되면, 우선은 do문에 있는 print문을 시행해 결과창에는 5가 뜨게 된다. 그 후에 while문 조건을 만족하지 못하므로 반복을 멈추게 된다. 만약, 반복이 되는 경우라면 ..? while문에 들어가는 조건이 num > 4 이기만 해도, 조건을 만족하기 때문에 무한 반복이 되

java lang/ Object/ StringBuffer/ equals
23.5.2 ~ 23.5.19 사전 캠프 기간의 TIL 기록이다. TIL: Today I Learned java.lang package Object Object class는 모든 클래스의 최고 조상이다. 기본적으로 Object.equals() 는 인스턴스의 주소값으로 비교한다. Strings.equals() 같은 경우는 String class에서 오버라이딩해서 사용하는 것으로 주소값이 아닌 인스턴스의 멤버변수를 비교한다. 비교연산자(==)는 주소값을 비교한다. String String은 immutable 클래스다. String + String은 새로운 String 인스턴스가 생성되는 것으로 문자열을 다루는 작업이 많이 필요하면 StringBuffer 클래스를 활용한다. new String은 새로운 인스턴스를 생성하고 리터럴 지정은 이미 존재하는 것을 재사용한다. String.valueOf(): 기본형 -> 문자열 {Wrapper}.parse{Wrapp

String equals() 와 == 의 차이, String Pool
저번에 String 선언 방법에 따른 차이를 적었었는데, String literal, new String() 이번에 equals()와 == 의 차이를 비교해보려한다. ✅equals() equals()는 문자열의 내용을 비교하여 같으면 true를 반환하고, 다르면 false를 반환한다. 이때 비교하는 것은 문자열이 가지고 있는 값 자체를 비교한다. ✅== 연산자는 두 개의 객체가 동일한 객체인지를 비교한다. 이때 비교하는 것은 객체의 참조값이다. 즉, 두 개의 객체가 동일한 메모리 주소를 가리키고 있는지를 비교한다. String 에는 두가지 선언방식이
국비 6-2
BranchExample do while: while문을 무조건 한 번 실행하고 특정 조건에 종료 break: 반복문을 바로 멈춤 continue: 다음 반복으로 넘어감 String 타입에서 문자열 비교 시 equals 사용 String 빈 값:null Math.random(): 0.0 이상, 1.0 미만의 난수 생성 -사용법: (int)(Math.random() * n +1) -->1부터 n까지 난수 생성하기 BranchRun

[Effective Java] item14 - Comparable을 구현할지 고려하라
코딩을 하면서 값을 비교하는 경우는 굉장히 많다! 다양한 경우가 많은데 새로운 객체를 만들 때는 Comparable을 구현할지 고려해야 할 것이다. Comparable 인터페이스는 다음과 같이 생겼다. equals의 규약과 compareTo의 규약은 비슷하다. 객체의 순서를 비교하는데 객체가 주어진 객체보다 작으면 음의 정수를, 같으면 0을, 크면 양의 정수를 반환한다. 비교할 수 없는 객체가 주어지면 ClassCastException을 던진다. Comparable을 구현한 클래스는 모든 x, y에 대하여 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 여야 한다. Comparable을 구현한 클래스는 추이성을 보장해야 한다. 즉, x.compareTo(y) > 0, y.compareTo(z) > 0, x.compareTo(z) > 0 이다. Comparable을 구현한 클래스는 모든 z에 대해 x.compareTo

[Effective Java] item10 - equals는 일반 규약을 지켜 재정의하라
equals 메소드는 굉장히 중요하다! 대부분의 경우에는 우리가 원하는 비교를 수행해준다. 정 그래도 재정의를 해야겠다면 조심해야 한다. 재정의를 할 때는 아래의 체크리스트를 확인해보자. 각 인스턴스가 본질적으로 고유함: 다른 객체는 절대 같을 수가 없다 (ex. Thread) 논리적 동치성을 검사할 일이 없음: String은 equals로 내용이 같으면(논리적으로) true를 반환하는데 이런식의 비교가 필요 없을 경우 상위 클래스에서 재정의한 equals가 하위 클래스에도 맞음: Collection 같은 경우가 이에 해당함 클래스가 private이거나 package-private이고 equals 메소드를 호출할 일이 없음: 아예 금지를 시키고 싶으면 AssertionError()를 띄우면 된다. 이를 모두 통과했다면 어느정도 재정의를 해도 되는 것이다. 그럼 다음의 조건들을 만족해서 equals 메소드를 구현해야 한다. 규약 반사성(reflex

equals와 hashcode의 재정의
서론 아주 예전에 무턱대고 equals를 정의한적이 있었다. 위와 같이 equals를 구성했을 때 Object 클래스에 정의되어있는 equals를 사용하게된다. 해당 equals는 주소값으로 객체가 동일한지만 비교하기 때문에 동일한 인스턴스가 아니면 무조건 다르다는 결과가 나온다. 다양한 문제상황을 보면서 equals와 hashcode를 재정의 해야하는 이유를 생각해보자. 기대하는 상황 위와 같이 junho라는 객체와 junho2라는 객체가 존재한다고 가정해보자. 이름도 같고, 가지고있는 돈도 같다. 이 경우 논리적으로 같기 때문에 두 객체를 같은 객체로 취급하고자 한다. 현재 Person 객체는 다음과 같이 구성되어있다. 이 상태에서는 위 메소드의 결과가 다음과 같이 나온다. 
Problem String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 solution 구축. 문제 바로가기 What I tried 나의 전략은 아래와 같았다: > 1. String형 배열의 seoul element 중 Kim 의 위치를 찾고 "김서방은 x에 있다" 반환 seoul을 for문을 사용하여 돌린다 for문 안에 if 문을 사용하여 KIM 과 같다면 해당 index 위치 x에 저장 "김서방은 x에 있다" 출력 What was Wrong? 정말 놀랍게도 한번에 답을 찾을 수 있었다. 하지만 IntelliJ에서 돌릴땐 답이 나왔지만, 정작 프로그래머스에서는 자꾸 다른 값이 나왔다. What I Learned 위 코드와 같이 바꾸니 프로그래머스

기본 프로그램에대한 문법 / 문자열 메서드
패키지 문법 package - 패키지 컴파일 방법 import 여러개의 클래스 관계 is ~ a - 상속 has ~ a - 포함 / 부속(객체 변수) 객체지향(중심 : OOP)프로그램에 대한 특성 캡슐화 data은닉 접근제어자로 데이터 접근을 제어한다. setter / getter 생성자 오버로딩(constructor overloading) this - lv와 iv 구별 / this() - 생성자간의 호출 상속성 extends overriding super - 부모의 멤버와 구별할 때 사용 / super() - 부모의 생성자 final 객체 형변환 다형성 추상화 기본 프로그램에 대한 문법 자료 제어 => 소스코딩 Visudal Studio Code IDE eclipse - 전자정부프레임워크 (https://www.egovframe.go.kr/) intellij - 안드로이드 개발