String

문자열 객체

 

객체 => 힙 메모리 영역

변수 => 힙 메모리 영역의 주소

String str = "안녕하세요!"; // 문자열 리터럴

"안녕하세요!"라는 값 자체는 힙 메모리 영역에 저장되고 str 변수에는 힙 메모리 영역의 주소가 할당된다.

String의 경우, 자바에서 값 자체를 할당할 수 있도록 지원해주기 때문에 위처럼 사용이 가능하다. 그러나 일반적으로 자바의 객체는 리터럴(Literal), 값 자체를 대입 할 수 없다.

String str_2 = new String(original: "안녕하세요!"); // 생성자

원칙적으로는 new 연산자를 이용하여 새로운 객체를 생성하겠다고 선언한 뒤, 객체의 종류, 파라미터 영역에 어떤 데이터를 만들지 적어야한다.

이전의 변수와 자료형, 그리고 상수 포스팅의 참조형에서 말했다시피 변수에 직접 대입한 값과 생성자를 이용하여 만든 값은 값이 같아도 같은 주소를 공유하지 않는다.

그렇다면 주소가 아니라 값 자체는 동일하다고 받아들일까?

if (str.equals(str_2)) {
    System.out.println("str.equals(str_2)");
}

결과는 참이다. 즉, 주소가 아닌 값 자체를 비교할 때에는 equals 메소드를 통해 비교하면 된다.

 

 

문자열 병합

1. '+' 연산자 활용

String str_1 = "Hello,";
String str_2 = "World!";

System.out.println(str_1 + " " + str_2);

공백은 str_1 변수나 str_2 변수에 넣어도 된다.

'+' 연산자는 하나를 합칠 때마다 임시로 String 객체를 만들어서 붙여서 반환하는 형태이다. 그런데 임시로 객체를 할당한다는 것은 힙 메모리를 사용한다는 것이다. 용량은 작지만 메모리에 영향이 있는 것은 사실이다.

 

2. StringBuilder 활용

StringBuilder strBdr_1 = new StringBuilder("Hello,");

strBdr_1.append(" ");
strBdr_1.append("World!");

String str_new = strBdr_1.toString();
System.out.println(str_new);

'+' 연산자를 사용할 때는 임시 객체를 만들어서 문자열을 붙였다. StringBuilder를 활용하면 임시 객체를 만들지 않고 사용하던 "Hello," 객체를 그대로 "World!" 객체와 붙이는 형식이다. 속도가 빠르고 메모리면에서 조금 더 효율적인 작업이 가능하다.

StringBuilder를 활용하면 데이터를 추가로 붙이거나 일부를 변경하는 작업이 가능하기 때문에 상황에 따라 필요한 방법을 활용하면 된다.

 

 

문자열 슬라이스

String str_1 = "이름: 김자바";

위의 코드에서 "김자바"라는 값만 사용하고 싶다고 가정해보자.

String은 값의 각각 하나하나에 순서, 즉 인덱스(index)를 붙여 관리하고 있다. 아래의 코드를 활용하여 인덱스 값을 확인해보자.

System.out.println(str_1.indexOf("이"));
System.out.println(str_1.indexOf("름"));

각각 0과 1이 나왔다. 이번에는 substring 함수를 통해 원하는 부분만 잘라보자.

String str_name = str_1.substring(4, 7);
System.out.println(str_name);

substring 함수로 인덱스의 시작과 끝(시작, 끝-1)을 정해 원하는 값인 "김자바"를 얻었다.

 

 

문자열 대소문자 변환

String str_1 = "abc";
String str_2 = "ABC";

str_1 = str_1.toUpperCase();
str_2 = str_2.toLowerCase();

System.out.println(str_1);
System.out.println(str_2);

위의 코드는 소문자를 대문자로, 대문자를 소문자로 변환하는 코드이다.

우리가 대소문자를 굳이 맞춰주는 이유는 사용자가 대소문자를 섞어 입력했을 때, 올바르게 판단하기 위함, 혹은 입력된 값에 대해 통일된 형식을 맞춰서 저장해야하는 경우 등이 있다.

자바에는 대소문자를 동일한 값의 데이터로 인식하게 하는 함수가 있다.

if (str_1.equalsIgnoreCase(str_2)) {
    System.out.println("str_1.equalsIgnoreCase(str_2)");
}

우리가 굳이 대문자 또는 소문자로 변환하지 않아도 대소문자를 무시하고 값을 비교한다.

 

 

공백 제거

1. 양쪽 끝에 공백이 있는 경우

trim()

String str_1 = "      Hello   ";
str_1 = str_1.trim();
System.out.println(str_1);

 

2.  문자열 중간에 공백이 있는 경우

replace()

String str_2 = "Hel   lo";
str_2 = str_2.replace(" ", "");
System.out.println(str_2);

 

 

'Back-End > Java' 카테고리의 다른 글

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
형변환  (0) 2023.05.08
변수와 자료형, 그리고 상수  (0) 2023.05.08
Java란?  (0) 2023.05.02

+ Recent posts