JAVA String 클래스 정리

동현·2021년 3월 7일
0

JAVA String 클래스 정리

String 클래스

  • 스트링은 자바에서 Char 타입의 불편함을 해소 시켜주는 매우 편리한 존재이다. 그럼 이 편리한 클래스가 어떤 형식으로 구현되어있는지 살펴보자.

  • 위처럼 스트링 클래스 내부를 까보면 결국은 Char 배열로 생성된 불변 객체 값이다.

스트링 클래스 선언

  • 스트링은 원시 타입처럼 보여서 원시타입으로 착각 할 수 있다. 하지만 스트링은 원시타입이 아니며 참조형 객체 클래스이다. 또한 불변 객체로 동일한 객체가 공유되면서 사용된다 이는 뒤에 예시로 확인 해보겠다.
  • 스트링 클래스는 2가지의 선언 방법이 있다.
    1. 리터럴
    2. new 를 사용한 선언

리터럴

String text = "text";

New


String text = new String("text");

둘다 print 를 해보면 값은 똑같이 나온다 하지만 둘은 분명한 차이가 있다.

☝️ 리터럴로 선언된 String 클래스는 선언시 객체가 String constant pool 에 저장이되는 반면 new 는 Heap 영역에 저장이 된다. 다음 예를 보자


String text = new String("text");
String text2 = "text";

System.out.print(text == text2); // false

💁 false 가 나오는 이유가 뭘까?
위에서 언급한 리터럴과 new 의 선언 시 저장되는 객체의 위치 때문이다. texttext2 의 값은 모두 text 라는 값을 가지고 있다. 하지만 객체가 다르다 text String constant pool 에 저장된 객체를 갖고 있고 text2Heap 영역에 저장되어있는 객체이다 따라서 1차적으로 객체가 다르기 때문에 단순비교인 == 로는 두 객체의 값을 비교할수는 없다.


String text = "text";
String text2 = "text";

System.out.print(text == text2); // true

💁 true 가 나오는 이유가 뭘까?
이는 text 생성시 string constant pool에 "text" 값을 지닌 String 객체 하나가 생성된다. 이후 text2 생성시 String 클래스는 불변 객체이기 때문에 미리 intern() 메서드에서 탐색이 되어 미리 생성된 객체가 공유되어 단순 비교인 == 에 true 값이 나오게 된다.

🤔 intern() 은 뭐지?

간단하게 설명하면 String constant pool 에서 문자열을 조회하여 존재시 그 객체를 반환, 아닐 경우 등록 하는 메서드다 = 이를 통해 불변객체가 가지는 동일한 객체를 공유할 수 있는 특징을 사용할수 있고 동일한 객체가 하나만 생기게 할수도 있다.


equals

  • 위에서 단순 비교를 통해 비교를 값을 비교시 원하는 결과가 안나오는 경우가 많았다. String 객체를 비교시 == 보다는 equals 를 많이 사용한다.
  • equals 의 코드를 보면 equals 는 String 객체의 Value 값 자체를 비교하는 것을 볼수있다. 이점이 단순 비교와 가장 큰 차이점이고 String 객체 비교시 equals 를 많이 사용하는 이유이다.

String text = new String("text");
String text2 = "text";

System.out.print(text == text2); // false
System.out.print(text.equals(text2); // true
  • 다음과 같은 비교에서 단순비교는 false 값이 반환되고 equals 를 사용한 비교시는 true 값이 반환되는 이유가 Value 값을 비교하냐 객체의 주소값을 비교하냐 차이이다.

이 외의 메소드 들

length();

  • 문자열의 길이 반환 (int)

String text = new String("text");

System.out.print(text.length()); // 4

isEmpty();

  • 객체의 value가 비어있는지 아닌지 반환 (boolean) (string = ""; 시 비어있다고 판단)

String text = new String("text");

System.out.print(text.isEmpty()); // false

indexOf();

  • 해당 문자의 위치를 int 로 반환 (존재 X 경우 -1 반환)

String text = new String("text");

System.out.print(text.indexOf(t))); // 1

substring();

  • 인덱스를 자를때 사용한다

String text = new String("text");

System.out.print(text.substring(0,2)); // te

replaceAll();

  • 문자열 교체

String text = new String("text");

System.out.print(text.replaceAll("text", "word"); // word

split();

  • 문자열을 파라미터 기준으로 찢어 String 형 배열로 반환
	String str2 = "apple,banana,orange";
	String[] array1 = str2.split(","); 
	System.out.println(Arrays.toString(array1));

	[apple, banana, orange]

reference

https://kutar37.tistory.com/entry/자바-String-클래스의-메소드
https://www.latera.kr/blog/2019-02-09-java-string-intern/

profile
여긴 어디 나는 누구?

0개의 댓글