일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AutoConfiguration
- 프록시
- 컴퓨터시스템
- hibernate
- 메이븐
- 토비의스프링3.1
- ApplicationContext
- 토비의스프링
- ORM
- springboot
- DispatcherServlet
- 링킹
- DesignPattern
- gradle
- Spring
- 클린코드
- Kotlin for Java Developers
- exception
- String
- FunctionalInterfaces
- 빌드툴
- beanfactory
- 링커
- java
- 자바
- JPA
- Immutable
- IOC
- lambda
- springwebmvc
- Today
- Total
엔지니어로 가는 길
Java String으로 보는 동일성과 동등성 본문
String literal vs new String()
str1을 String literal이라 말한다. str1과 str2는 어떤 차이가 있을까.
위의 그림대로 문자열을 만들어보자
이때 s3와 s4는 같은 곳을 가리키고 있다. String literal은 같은 문자열인 경우 메모리 전체에서 하나만 존재함을 알 수 있다. 하지만 s1과 s2를 보면 같은 문자열임에도 s3, s4가 가리키는 곳과 다른 곳을 가리키고 있고, 심지어 s1과 s2끼리도 서로 다른 곳을 가리키고 있다. 즉, new 연산자를 통해서 String 객체를 만들면 문자열이 같아도 매번 다른 공간에 문자열이 생기는 것임을 알 수 있다. 테스트해보자.
동일성과 동등성
동일할 때와 동등할 때 모두 '같다'라는 단어를 사용할 수 있지만 그 뜻이 다르다. 동일성에서 말하는 같음은 두 참조변수가 가리키는 곳이 메모리의 같은 부분임을 뜻한다. 동등성에서 말하는 같음은 두 참조변수가 메모리 상에서 어디를 가리키느냐와 관계 없이 특정 기준에 따라 같은 것으로 볼 수 있는지에 달려있다.
위의 예에서 s3와 s4는 메모리의 같은 부분을 가리키고 있다. 따라서 s3과 s4는 동일하다. s1과 s2는 메모리의 다른 부분을 가리키고 있다. 따라서 s1과 s2는 동일하지 않다. 하지만 가지고 있는 문자열이 같은지에 따라 같음을 판단한다는 기준을 가지고 바라본다면 s1과 s2는 동등하다. 동등하지 않으면 절대 동일할 수 없으나, 동일하지 않아도 동등할 수는 있다.
'==' 연산자가 메모리에 위치하는 주소가 같은지를 비교하는 동일성 비교 연산자이고, equals() 메소드가 특정 기준에 따라 같은지를 판단하는 동등성 비교 메소드이다(사용자 정의 객체인 경우 equals() 메소드를 오버라이드하여 어떤 기준으로 바라볼 것인지를 얼마든 수정할 수 있다. String의 equals()는 문자열 값이 같으면 같다고 본다.) 자, s1, s2, s3, s4의 동등성과 동일성을 테스트해보자.
'프로그래밍 > Java' 카테고리의 다른 글
자바 프록시와 데코레이터 패턴(Decorator Pattern)에 대해 알아보자 (0) | 2020.10.23 |
---|---|
Java StringBuilder를 쓰는 이유 (0) | 2020.10.13 |
JPA @Embedded, @Embeddable, @ElementCollection 그리고 FetchType (2) | 2020.10.02 |
Java 9 Modules에 대해 알아보자 (0) | 2020.09.29 |
자바 Type Inference (0) | 2020.09.23 |