# String

### String

Java에는 기본적으로 원시형, 참조형 두 가지 자료형이 존재한다.

원시형에 유일하게 `문자`를 표시하는 char가 존재하지만, 길이 1의 문자밖에 표현하지 못한다. 코딩을 하다보면 쭉 이어진 문자를 제어 해야되는데, 그럴경우 String을 사용한다.

### 모든 객체는 타입이 될 수 있다.

객체는 클래스의 인스턴스이고, 클래스는 타입을 정의한다. 그러므로 객체는 그 클래스의 타입이 될 수 있다.

```java
class Book {
    private String publisher;
    private String name;
}
```

예를들어, 위와 같은 코드가 있다. 모두가 알지만 Book Class이다. 이 자체로 Book이란 타입이 생성이 된 것이다.

### 조금 이상하고 특별한(?) 타입

Java에서 원시 타입을 제외하면 전부 참조 타입이다. String은 참조 타입이다.

* String은 <mark style="color:red;">`불변 객체(Immutable Class)`</mark>이다.

```java
// 1. 보통 인스턴스 생성 방식
Type type = new Type();

// 2. String
String str = "스트링 생성"
```

* 그럼 String은 왜 new로 생성하지 않을까.
* 왜 우리는 2번 방식과 같이 String을 원시 타입을 정의하듯이 사용할까.

정답은 간단하다. 2번 방식이 편하다.

앞에서도 얘기했지만, 참조 타입은 Stack 메모리 영역이 아닌 <mark style="color:red;">**`Heap 메모리`**</mark>에 저장 된다.\
그런데 String은 또, 힙 영역 안에 <mark style="color:red;">**`String Constant Pool(상수풀) 영역`**</mark>에 저장이 된다. (Java 7 이상)

```java
// 1.
String str1 = "난 Heap 영역";

// 2.
String compare1 = new String("난 Heap 영역")

System.out.print(System.identityHashCode(str1));
System.out.print(System.identityHashCode(compare1));

// 출력
str1 : 12345678
compare1 : 1234
```

두 객체의 hash값이 다르다. 그럼 두 객체는 다른 객체다.

<img src="https://2051848637-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F6cHNFpreE0wZTNbZrVFb%2Fuploads%2F5ez1Yc5JK8vOcoDnbTBt%2Ffile.excalidraw.svg?alt=media&#x26;token=f2e6f053-20e9-4d0a-9c34-4bd773bac96d" alt="" class="gitbook-drawing">

* str1은 <mark style="color:red;">**`String Constant Pool`**</mark>에 할당되는 <mark style="color:red;">**리터럴(literal)**</mark> 방식이다.
  * 만약 str2 = "난 Heap 영역"을 선언하게 되면 str1의 주소를 가르키게 된다.
* compare1은 new 연산자를 이용해서, Heap 영역에 생성되고 그 주소를 반환한다.
