yeoseon / tip-archive

트러블 슈팅 및 팁을 모아두는 레포 (Today I Learned)
29 stars 2 forks source link

[Java] charAt, equals의 사용 #245

Closed yeoseon closed 4 years ago

yeoseon commented 4 years ago

개요

알고리즘을 풀다보니 기본적인 API 도 잘 모른다는 것을 느꼈다.
어떤 상황에서 equals를 사용하는지, 그 이유를 알면 자료형마다 ==를 써도 될지 고민을 안해도 될 것이다.

영어끝말잇기 문제를 푸는데, String의 가장 끝 문자열과 첫번째 문자열을 다뤘다.

lastWord.substring(lastWord.length() - 1);

다음과 같이 subString을 썼는데, charAt으로 가볍게 해결될 문제였다.

lastWord.chatAt(0)            // 맨 첫 글자  
lastWord.charAt(lastWord.length() - 1)         // 맨 끝 글자

이 것을 비교할 때, 당연히 equals로 할 줄 알았는데, Char형은 equals API가 기본적으로 제공되고 있지 않았다.
그냥 문자열은 무조건 equals로 사용해야 한다고 생각했는데, equals를 사용하는 이유는 다음과 같다.

equals를 사용하는 이유 :: 주소값 비교(==)와 값 비교(equals)

==연산자와 String 클래스의 equals()메소드의 가장 큰 차이점은 == 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데 반해 String클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다.
일반적인 타입들 int형, char형등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용된다.
하지만 String은 일반적인 타입이 아니라 클래스이다.
클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이 부여된다.
그렇기에 String타입을 선언했을때는 같은 값을 부여하더라도 서로간의 주소값이 다를 수가 있다.

Reference

https://coding-factory.tistory.com/536