String은 문자열이라고 불리는 클래스이다. 그렇다면 문자열은 무엇일까?
String name = "김동우";
String address = "서울시";
이와같이 char형 변수가 이어진 형태를 의미한다.
또한 자바에서 String은 클래스이기때문에 자바의 기본 자료형에 속하지 않는다.
불변성 : 자바에서 String은 불변하는 특징이 있다. 처음 만들어진 String은 그 자체로 어딘가에 저장되고, 거기에 추가될떄는 새로운 String값으로 새로운 곳에 저장된다. 즉, 변화하지 않고 새로운 값이 저장되고 그 값을 가리키게 되는 것이다 .
공유성 : 같은 값을 가진 String 변수들은 같은 값을 바라보고, 공유한다. 그렇기 떄문에 1번인 불변성도 유지가 된다.
String a = "*";
String b = "*";
이 코드에서 a와 b는 둘 다 동일한 주소에 있는 “*”를 바라보고 있고, a에 값을 더하거나 바꾼다고 하면 새로운 값을 만들고 a는 그 값을 가리키게 되는 것이다.
근데 이렇게 하면 자바 입장에선 효율적인 메모리 관리가 안될 것이다. 그렇기에 떄문에 추천하는것이
StringBuilder sb = new StringBuilder();
StringBuilder는 내부적으로 큰 칸을 하나 만들고 거기에 추가하는 느낌으로, 메모리를 아낄 수 있고 속도가 빠르다 .
객체 : String은 객체이다. 객체이기에 ==에 대한 비교를 통해 하지말고 .equls()메소드를 사용하자.
그렇다면 객체를 가끔 직접적으로 호출할때 사용하는 toString()은 뭘까?
우선 코드를 보자.
```java
public class Main {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p);
// 출력 : 메롱
Lion l = new Lion();
System.out.println(l);
// 출력 : 멋쟁이사자처럼
}
}
class Lion extends Object {
private String name = "멋쟁이사자처럼";
@Override
public String toString() {
return "Lion{" +
"name='" + name + '\'' +
'}';
}
}
class Person extends Object {
public String toString() {
return "메롱";
}
}
```
여기서 Main 함수에서 각각의 클래스의 객체를 만들고 호출했다.
p를 출력하면 메롱, l은 멋쟁이사자처럼이 나온다. 어떻게 이런 결과가 나올까?
우선 System.out.println()에 대해서 알아야한다.
우리는 흔히들 출력문이라고 하는데, 이 출력문은 문자열화 시켜서 콘솔창에 띄어주는 전통? 방식?을 사용한다. 즉 우리가 숫자 5를 출력했다하더라도 콘솔창에서는 “5”(문자화)되어 사용된다.
그렇기에 System.out.println()을 사용해서 객체 리모콘을 그대로 출력한다고 하면 어떻게 할까?
출력문은 문자열화한다 했기에 객체로 문자열화시켜서 출력시킨다.
이 때 사용되는 것이 toString()이다. 모든 클래스는 Object에 상속을 받아 사용하고 있고, 이 클래스엔 toString()이란 메소드가 있는데, 객체 자체를 출력하고 오버라이딩되어 있으면 커스터마이징하여 객체를 출력할 수 있다.
[출처] : 개인공부저장소