티스토리 뷰
1. String 클래스 개요
1-1. String 클래스란?
💡 문자열을 나타내는 자료형
문자열 관련된 작업을 할 때 유용하게 사용할 수 있는 다양한 메소드가 포함되어 있다.
String 인스턴스는 한 번 생성되면 그 값을 읽기만 가능하고 변경할 수는 없다. 이러한 객체를 불변 객체(immutable object) 라고 한다.
즉, 자바에서 덧셈(+) 연산자를 이용하여 문자열 결합을 하는 경우
기존 문자열이 변경되는 것이 아닌 문자열이 합쳐진 새로운 String 인스턴스가 생성.
1-2. String 주요 메소드
package com.ohgiraffers.section02.string;
public class Application1 {
public static void main(String[] args) {
/* 수업목표. String 클래스의 자주 사용하는 메소드에 대해 숙지하고 응용할 수 있다. */
/* 필기. 1. charAt(): 해당 문자열의 특정 인덱스에 해당하는 문자를 반환 */
String str1 = "apple";
for (int i = 0; i < str1.length(); i++) { // 0 ~ 4 / length() -> 메소드
System.out.println("charAt(" + i + ") = " + str1.charAt(i));
}
/* 필기. compareTo(): 인자로 전달된 문자열과 사전 순으로 비교 */ // 첫글자만 비교?? no! 같으면 다음 글자 비교
String str2 = "java";
String str3 = "java";
String str4 = "JAVA";
String str5 = "mariaDB";
// String str6 = "mariaDBaa";
System.out.println(str2.compareTo(str3)); // 0
System.out.println("(int)'j': " +(int)'j' + ", (int)'J': " + (int)'J'
+ ", 차이는 " + ((int)'j' - (int)'J'));
System.out.println(str2.compareTo(str4)); // 32
System.out.println(str4.compareTo(str2)); // -32
System.out.println(str2.compareTo(str5)); // -3
System.out.println(str5.compareTo(str2)); // 3
// System.out.println(str5.compareTo(str6)); // 길이 차이 리턴
/* 필기. concat(); 문자열에 인자로 전달된 문자열을 합쳐서 새로운 문자열 반환 */
System.out.println("concat(): " + str2.concat(str5));
/* 필기. indexOf(): 문자열에서 특정 문자를 탐색하여 처음 일치하는 인덱스 위치를 정수형으로 반환 */
String indexOf = "java mariaDB";
System.out.println("indexOf('a'); " + indexOf.indexOf('a'));
System.out.println("indexOf('z'); " + indexOf.indexOf('z')); // 없을 경우 -1
/* 필기. trim(): 문자열의 앞 뒤에 공백을 제거한 문자열을 반환한다. */
String trimStr = " java ";
System.out.println("trimStr: #" + trimStr + "#");
System.out.println("trim(): #" + trimStr.trim() + "#");
// System.out.println("trim(): #" + trimStr.replaceFirst("^\\s+","") + "#"); // 왼쪽만 지우기
/* 필기.
* toLowerCase(): 모든 문자를 소문자로 변환
* toUpperCase(): 모든 문자를 대문자로 변환
* */
String caseStr = "javamariaDB";
System.out.println("toLowerCase(): " + caseStr.toLowerCase());
System.out.println("toUpperCase(): " + caseStr.toUpperCase());
System.out.println("caseStr: " + caseStr);
/* 필기. substring(): 문자열의 일부분을 잘라내어 새로운 문자열을 반환 */
String javamariaDB = "javamariaDB";
System.out.println("substring(3, 6): " + javamariaDB.substring(3, 6));
System.out.println("substring(3): " + javamariaDB.substring(3));
System.out.println("javamariaDB: " + javamariaDB);
/* 필기. replace(): 문자열에서 대체할 문자열로 기존 문자열을 변경해서 봔환 */
System.out.println("replace(): " + javamariaDB.replace("java", "python"));
System.out.println("javamariaDB: " + javamariaDB);
/* 필기. length(): 문자열의 길이를 정수형으로 반환 */
System.out.println("length(): " + javamariaDB.length());
System.out.println("빈 문자열 길이: " + "".length());
/* 필기. isEmpth(): 문자열의 길이가 0이면 true를 반환, 아니면 false를 반환(null과 다르다.) */
System.out.println("isEmpty(): " + "".isEmpty());
System.out.println("isEmpty(): " + "abc".isEmpty());
}
}
// 실행 결과
charAt(0) = a
charAt(1) = p
charAt(2) = p
charAt(3) = l
charAt(4) = e
0
(int)'j': 106, (int)'J': 74, 차이는 32
32
-32
-3
3
concat(): javamariaDB
indexOf('a'); 1
indexOf('z'); -1
trimStr: # java #
trim(): #java#
toLowerCase(): javamariadb
toUpperCase(): JAVAMARIADB
caseStr: javamariaDB
substring(3, 6): ama
substring(3): amariaDB
javamariaDB: javamariaDB
replace(): pythonmariaDB
javamariaDB: javamariaDB
length(): 11
빈 문자열 길이: 0
isEmpty(): true
isEmpty(): false
package com.ohgiraffers.section02.string;
public class Application2 {
public static void main(String[] args) {
/* 수업목표. 문자열 객체를 생성하는 다양한 방법을 숙지하고 인스턴스가 생성되는 방식을 이해할 수 있다. */
/* 필기.
* 문자열 객체를 만드는 방법
* 1. "" 리터럴 형태: 동일한 값을 가지는 인스턴스(동등(h, e) 객체)를 단일 인스턴스로 관리한다.
* (singleton 개념, 상수풀(constant pool) 활용)
* 2. new String("") 형태: 매번 새로운 인스턴스를 생성한다.(주소값이 매번 다름)
* */
String str1 = "java";
String str2 = "java";
String str3 = new String("java");
String str4 = new String("java");
System.out.println("str1 == str2: " + (str1 == str2)); // true (주소값 같다. 같은 객체) / 이거 쓰지마!
System.out.println("str2 == str3: " + (str2 == str3)); // false
System.out.println("str3 == str4: " + (str3 == str4)); // false
/* 설명. equals와 hashCode 확인 */
System.out.println("str1.equals(str3): " + str1.equals(str3));
System.out.println("str1.hashCode() == str3.hashCode(): " + (str1.hashCode() == str3.hashCode()));
// 오버라이딩 잘해놨네?????어디에 오버라이딩 함????String에 대한 hashCode()
/* 설명. 문자열 비교는(==)쓰지 말고 (.equals()) 사용하자. */
/* 설명. 문자열은 불변객체(immutable object)로 변화를 주면 항상 새로운 객체(인스턴스)를 생성한다. */
String str = "apple";
System.out.println(System.identityHashCode(str));
str += ", banana";
System.out.println(System.identityHashCode(str));
System.out.println("fruit: " + str);
}
}
// 실행 결과
str1 == str2: true
str2 == str3: false
str3 == str4: false
str1.equals(str3): true
str1.hashCode() == str3.hashCode(): true
414493378
205029188
fruit: apple, banana
package com.ohgiraffers.section02.string;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Application3 {
public static void main(String[] args) {
/* 수업목표. 문자열 분리에 대해 이해하고 적용할 수 있다. */
/* 필기.
* 문자열을 특정 구분자로하여 분리한 문자열을 반환하는 기능을 한다.
* 1. split(): 정규표현식을 이용하여 비정형화된 문자열을 분리한다.
* (String을 파싱하여 String[]로 만들어 주고 []를 활용하여 구분자들을 넣을 수 있다.)
* 2. StringTokenizer: 문자열의 모든 문자들을 구분자를 활용하여 문자열이 분리된다.
* (StirngTokenizer가 제공하는 메소드를 활용해야 한다.)
* */
/* 설명. 1. split() 활용 */
String emp1 = "100/홍길동/서울/영업부";
String emp2 = "200/유관순//총무부";
String emp3 = "300/이순신?경기도/"; // 마지막 하나는 결과를 보니 한 칸으로 안쳐주는구나!
String[] empArr1 = emp1.split("/"); // split 구현해보기(반복문, if 사용)
String[] empArr2 = emp2.split("/");
String[] empArr3 = emp3.split("[/?]"); // 정규표현식 형태로 여러 개 넣으면 된다.
System.out.println(Arrays.toString(empArr1));
System.out.println(Arrays.toString(empArr2));
System.out.println(Arrays.toString(empArr3));
/* 설명. 2. StringTokenizer 활용 */
String colors = "red, yellow, green, purple? blue";
StringTokenizer colorStringTokenizer = new StringTokenizer(colors, ", ?");
while(colorStringTokenizer.hasMoreTokens()) {
// System.out.println(colorStringTokenizer.nextToken()); // nextToken은 1. 값을 반환 2. 커서 옆으로 이동
String token = colorStringTokenizer.nextToken(); // nextToken은 반복문에서 한번만 나와야한다. 따라서 여러번 돌릴려면 이렇게 만들어줘야한다.
System.out.println(token);
System.out.println(token);
}
}
}
// 실행 결과
[100, 홍길동, 서울, 영업부]
[200, 유관순, , 총무부]
[300, 이순신, 경기도]
red
red
yellow
yellow
green
green
purple
purple
blue
blue
package com.ohgiraffers.section02.string;
public class Application4 {
public static void main(String[] args) {
/* 수업목표. 이스케이프(escape)문자에 대해 이해하고 적용할 수 있다. */
/* 필기.
* 이스케이프(escape) 문자
* 문자열 내에서 사용하는 특수기능을 위한 문자이다.
*
* 필기.
* \n: 개행
* \t: 탭
* \': 작은 따옴표
* \": 큰 따옴표
* \\: 역슬래쉬 표기
* */
System.out.println("안녕하세요.\n저는 홍길동 입니다.");
System.out.println("안녕하세요.\t저는 홍길동 입니다."); // 탭은 격자무늬를 기준으로 다음 구간으로 가는 것.
System.out.println("안녕하세요. 저는 '홍길동' 입니다."); // 구분이 되서 괜찮다.
System.out.println('\'');
System.out.println("안녕하세요. 저는 \"홍길동\" 입니다.");
System.out.println("역슬래쉬(\\)입니다.");
/* 설명. 이스케이프 문자 외에도 printf 관련 문법도 있으니 참고하자. */
/* 설명. %.2f: 소수점 둘째자리까지 실수를 표현하며 셋째자리에서 반올림, %d: 정수형 표현 */
System.out.printf("원주율은 %.2f입니다. 우린 %d로 하죠", 2.146592, 3);
}
}
// 실행 결과
안녕하세요.
저는 홍길동 입니다.
안녕하세요. 저는 홍길동 입니다.
안녕하세요. 저는 '홍길동' 입니다.
'
안녕하세요. 저는 "홍길동" 입니다.
역슬래쉬(\)입니다.
원주율은 2.15입니다. 우린 3로 하죠
- 두 번째(str2) 만들어질 때 리터럴이므로 (문자열 동등 비교하는)constant pool에서 비교하다 원래 있던 것이 있다.
- 동등 비교(hashCode() → 같은 값, equal() → true) 후 얕은 복사가 된다.
- 이유는? 효율성
- 3,4 번은 각자 객체 생성
'한화시스템 > 백엔드' 카테고리의 다른 글
[BE] JAVA_API_Wrapper (1) | 2024.07.19 |
---|---|
[BE] JAVA_API_StringBuilder & StringBuffer (1) | 2024.07.19 |
[BE] JAVA_API_Object (0) | 2024.07.19 |
[BE] JAVA_인터페이스 (0) | 2024.07.18 |
[BE] JAVA_추상 클래스 (0) | 2024.07.17 |