프로그램을 개발할 때 문자열을 많이 사용하지만, 앞서 배운 연산은 문자열에 사용하지 못한다. 문자열은 연산을 위한 별도의 method들이 존재한다.
프로그래밍 언어 중 문자열을 받아주는 data type이 따로 존재하는 언어는 없기 때문에 언어마다 문자열을 어떻게 처리하는지 알아야 한다.
※ 어떤 프로그래밍 언어든지, 문자열은 "상수"이기 때문에 값을 변경할 수 없다.
① 문자열
String str = "JAVA";
String은 클래스이므로 str은 reference 변수, 따라서 주솟값을 저장해야 한다. 주솟값을 가져오려면 메모리에 올라가 있어야 하는데, 우변은 문자열 "JAVA"이다.
자바 진영에서 static 변수에 이어 문자열은 new 연산자 없이 스스로 메모리에 올라간다. 자바에서는 double quotation mark("")로 만들어진 문자열을 인스턴스로 본다.
JAVA에서 문자열을 생성하는 두 가지 방법은 1) ""로 생성하는 방법과 2) new String()을 사용해서 생성하는 방법이 있다.
String str1 = "JAVA";
String str2 = "JAVA";
String str3 = new String(str2);
if (str1 == str2) System.out.println("str1과 str2는 동일 인스턴스 참조");
else System.out.println("str1과 str2는 다른 인스턴스 참조");
if (str2 == str3) System.out.println("str2과 str3는 동일 인스턴스 참조");
else System.out.println("str2과 str3는 다른 인스턴스 참조");
위 코드의 실행 결과는 “str1과 str2는 동일, str2와 str3은 다른 인스턴스를 참조”이다.
원래는 str2=“JAVA”에서 인스턴스를 생성해 주어야 하지만, 문자열은 상수이므로 데이터가 변하지 않는다. 따라서 기존에 생성된 인스턴스와 똑같은 내용의 문자열을 만들어달라는 요청이 들어오면, 기존 문자열 인스턴스의 주소를 돌려준다.
str3에서는 new 연산자를 사용했기 때문에 명시적으로 인스턴스가 생성되어 새로운 주솟값을 할당해 준다.
관계 연산자(==)로 물어볼 때는 주소가 같은지를 묻는 것이고, 인스턴스가 가지고 있는 문자열의 내용을 물어볼 때는 equals method를 사용한다.
그런데, 왜 system.out.println(str3) 하면 주솟값이 아니라 그 안에 있는 값이 출력되는걸까? 추후에 VO Class에서 언급하겠지만 toString() method가 자동으로 호출되어 주솟값이 아닌 내용이 출력되는 것이다.
② String Method
concat(String str) | 메서드 앞에 나오는 문자열과 파라미터로 전달된 문자열을 결합 ex) "ABCD".concat("EF") → "ABCDEF" |
substring(int beginIndex) | beginIndex부터 문자열의 끝까지 잘라옴 ex) "ABCD".substring(2) → "CD" |
substring(int beginIndex, int endIndex) | beginIndex부터 endIndex - 1까지 잘라옴 ex) "ABCD".substring(1, 3) → "BC" |
replace(ctring old, ctring new) | 주어진 문자열에서 old 한 글자를 new 한 글자로 교체 ex) "ABCD".replace(‘B’,. ‘X’) → "AKCD" |
replace(String old, String new) | 주어진 문자열에서 old 문자열을 new 문자열로 교체 ex) "ABCD".replace("AB", "KK") → "KKCD" |
toLowerCase() | 문자열을 모두 소문자로 교체 ex) "ABCD".toLowerCase() → "abcd" |
toUpperCase() | 문자열을 모두 대문자로 교체 ex) "abcd".toLowerCase() → "ABCD" |
equals(Object obj) | 주어진 인스턴스의 내용과 파라미터로 전달된 인스턴스의 내용이 같은가? ex) "abcd".equals("abc") → false |
equalsIgnoreCase(String s) | 대소문자 구분 없이 내용이 같은가? ex) "abcd".equalsIgnoreCase("aBcd") → true |
startWith(String s) | 주어진 문자열이 파라미터로 주어진 문자열로 시작하는가? ex) "abcd".startWith("abc") → true |
endWith(String s) | 주어진 문자열이 파라미터로 주어진 문자열로 끝나는가? ex) "abcd".endWith("bc") → false |
indexOf(String s) | 주어진 문자열에서 파라미터로 전달된 문자열을 앞에서부터 찾아 처음 나오는 인덱스를 반환 ex) "abcd".indexOf(‘c’) → 2 |
lastIndexOf(String s) | 주어진 문자열에서 파라미터로 전달된 문자열을 뒤에서부터 찾아 처음 나오는 인덱스를 반환 ex) "abcdabc".indexOf('a') → 4 |
valueOf(기본 데이터 타입) | 파라미터로 전달된 기본 데이터 타입을 문자열로 변환 ex) num = 12, String.valueOf(num) → "12" |
'JAVA' 카테고리의 다른 글
[JAVA] Chapter 11. Inheritance (1) (0) | 2023.07.13 |
---|---|
[JAVA] Chapter 10. Array (0) | 2023.07.12 |
[JAVA] Chapter 8. Class Variable & Class Method (0) | 2023.07.10 |
[JAVA] Chapter 7. Class (3) (0) | 2023.07.09 |
[JAVA] Chapter 7. Class (2) (0) | 2023.07.08 |
댓글