문자열이란 문자들로 구성된 문장을 뜻합니다. 예를 들어 다음과 같은 것들이 문자열입니다.
"Happy Java"
"a"
"123"
자바에서 문자열을 나타내는 자료형은 String 입니다.
즉, 위의 문자열을 자바에서 표현하려면 다음과 같이 사용해야 합니다.
String a = "Happy Java";
String b = "a";
String c = "123";
또는 다음과 같이 표현할수도 있습니다.
String a = new String("Happy Java");
String b = new String("a");
String c = new String("123");
new 키워드는 객체를 만들 때 사용합니다.
하지만 보통 문자열을 표현할 때는 가급적 첫번째 방식(리터럴 표기)을 사용하는 것이 좋습니다. 첫 번째 처럼 사용하면 가독성에 이점이 있고 컴파일 시 최적화에 도움을 주기 때문입니다.
리터럴을 이용한 방식 vs new 연산자를 이용한 방식
첫번째 방식은 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말합니다. 리터럴을 사용하게 되면string constant pool이라는 영역에 존재하게 되고 new를 통해 String을 생성하면 Heap 영역에 존재하게 됩니다.
String을 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출되게 되고 intern() 메서드는 주어진 문자열이 string constant pool에 존재하는지 검색하고 있다면 그 주소값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값을 반환합니다.
int, long, double, float, boolean, char 와 같은 원시(primitive) 자료형은 new 키워드로 그 값을 생성할 수 없습니다.
primitive 자료형은 리터럴(literal)로만 값을 세팅할 수 있습니다. 하지만 String 은 "Java"와 같이 리터럴로 표기가 가능하지만 primitive 자료형은 아닙니다. String은 리터럴 표현식을 사용할 수 있도록 자바에서 특별 대우 해 주는 자료형입니다.
==연산자와 equals()메소드의 가장 큰 차이점은 == 연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데 반해 String클래스의 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다는 것입니다.
기본 타입의 int형, char형등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용됩니다. 하지만 String은 일반적인 타입이 아니라 클래스입니다. 클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이 부여됩니다. 그렇기에 String타입을 선언했을때는 같은 값을 부여하더라도 서로간의 주소값이 다릅니다.
== 연산자의 경우 참조 타입 변수들 간의 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용됩니다.
equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 비교를 할 수 있습니다.
| 코드 | 설명 |
|---|---|
| %s | 문자열(String) |
| %c | 문자 1개(character) |
| %d | 정수(Integer) |
| %f | 부동소수(floating-point) |
| %o | 8진수 |
| %x | 16진수 |
| %% | Literal % (문자 % 자체) |
참조 :
https://wikidocs.net/205
https://coding-factory.tistory.com/536
https://sudo-minz.tistory.com/93