[자바] String 클래스

Gammi·2022년 11월 15일
0

JAVA

목록 보기
28/35

📂 String 클래스


  • 문자열 데이터 처리

  • 리터럴 사용하여 직접 문자열 생성하거나 new 연산자 사용한 인스턴스 생성 시 생성자에 문자열 전달하여 생성

    -> 리터럴 사용 시 해당 문자열 존재 여부 상수 풀에서 검사 후 중복되는 문자열 없으면 생성, 중복일 경우 주소값 리턴하므로 메모리 공간 낭비 줄어듦

    -> new 연산자 사용 시 문자열 중복 여부와 무관하게 문자열 객체 생성


  • 문자열 내용 비교시 동등비교 연산자보다 equals() 메서드 사용

  • 문자열 생성하면 String 클래스 내부적으로 char[]로 관리됨

    -> 개발자의 편의 위해 별도의 String 클래스 만들어서 제공

    -> 배열 형태이므로 배열 인덱스와 동일한 인덱스 번호 사용





📁 String 클래스 메서드


  • 문자열 수정, 검색, 치환 등 다양한 작업 수행하는 메서드 제공

  • String 객체는 불변 객체이므로 원본 문자열 수정X, 각종 작업 수행할 경우 수정된 데이터를 문자열로 새로 생성

    -> 문자열 수정이 빈번할 경우 메모리 낭비 심하므로 StringBuilder 또는 StringBuffer 클래스 활용





toString() : 저장된 문자열 리턴

⭐ 입력

String s1 = "Java Programming";

System.out.println(s1.toString());
System.out.println(s1); // toString() 메서드는 출력문에서 생략 가능함

📌 출력

Java Programming
Java Programming



length() : 문자열 길이(문자열을 분리해놓은 배열 크기)리턴

  • 공백도 길이에 포함됨

⭐ 입력

System.out.println(s1.length());

📌 출력

16



equals() : 문자열 비교(대소문자 구별)

⭐ 입력

System.out.println(s1.equals("JAVA PROGRAMMING"));

📌 출력

false



equals() : 문자열 비교(대소문자 구별)

⭐ 입력

System.out.println(s1.equals("JAVA PROGRAMMING"));

📌 출력

false



equalsIgnoreCase() : 문자열 비교(대소문자 구별X)

⭐ 입력

System.out.println(s1.equals("JAVA PROGRAMMING"));

📌 출력

true



equalsIgnoreCase() : 문자열 비교(대소문자 구별X)

⭐ 입력

System.out.println(s1.equals("JAVA PROGRAMMING"));

📌 출력

true



charAt() : 특정 인덱스에 위치한 문자 1개 리턴

⭐ 입력

System.out.println(s1.charAt(5));
// 인덱스는 0번부터 시작함

📌 출력

P



< 특정 범위 문자열 추출>

subString(int beginIndex) : 시작 인덱스부터 끝까지 문자열 추출
subString(int beginInex, int endIndex) : 시작 인덱스 ~ 끝 인덱스 -1 까지 추출

⭐ 입력

System.out.println(s1.charAt(5));
System.out.println(s1.substring(5, 11));

📌 출력

Programming
Progra



concat() : 문자열 결합

  • 연결 연산자보다 연산 속도 빠름

⭐ 입력

System.out.println(s1.concat("!"));

📌 출력

Java Programming!



indexOf() : 특정 문자 또는 문자열의 인덱스 리턴

  • 문자열의 앞쪽부터 탐색
  • 탐색할 문자 또는 문자열 존재하지 않을 경우 -1 리턴

lastIndexOf() : 문자열 탐색 시 뒤에서부터 탐색하여 인덱스 리턴

⭐ 입력

System.out.println(s1.indexOf('a'));
System.out.println(s1.indexOf('x'));
System.out.println(s1.indexOf("Program"));
System.out.println( s1.lastIndexOf('a'));

📌 출력

1 // 1번 인덱스에 위치
-1 // 없어서 -1 리턴
5 // 시직인덱스인 5 리턴
10 // 뒤에서부터 탐색하므로 인덱스 10 리턴됨



replace() : 특정 문자 또는 문자열 치환

  • 동일한 문자 또는 문자열 존재할 경우 모두 치환

⭐ 입력

System.out.println(s1.replace('a', '@'));
// 'a' 대신 문자열 "a"도 가능

📌 출력

J@v@ Progr@mming



toUpperCase() : 알파벳 대문자 변경
toLowerCase() : 알파벳 소문자 변경

⭐ 입력

System.out.println(s1.toUpperCase());
System.out.println(s1.toLowerCase());

📌 출력

JAVA PROGRAMMING
java programming



trim() : 문자열 앞뒤 불필요한 공백 제거

⭐ 입력

String s2 = "		 	김     경민 		";

System.out.println("이름은 " + s2.trim() + "입니다.");

📌 출력

이름은 김     경민입니다.
// 안타깝게도 문자열 사이의 공백은 안 지워줌... 



contains() : 문자열 포함 여부

⭐ 입력

System.out.println(s2.contains("김"));
System.out.println(s2.contains("이"));

📌 출력

true
false



split() : 특정 기준으로 문자열 분리

⭐ 입력

String s3 = "자바/JSP/안드로이드";
String[] subjectArr = s3.split("/");
for(int i = 0; i < subjectArr.length; i++) {
  System.out.println(subjectArr[i]);
}

📌 출력

자바
JSP
안드로이드

🔗 참고

. 기호를 구분자로 지정하는 경우 모든 문자가 분리 기준이 되어 제거됨

-> \\.를 사용함

String s4 = "안녕하세요. 자바프로그래밍입니다."
String[] subjectArr = s3.split("\\.");



format() : 특정 문자열을 형식 지정문자와 결합하여 형식을 갖춘 문자열로 리턴

⭐ 입력

String name = "홍길동";
int age = 20;
double height = 180.5;
String formatStr = String.format("이름 : %s, 나이 : %d, 키 : %.1f\n", name, age, height);
System.out.println("생성된 회원 정보는 " + formatStr);

📌 출력

생성된 회원 정보는 이름 : 홍길동, 나이 : 20, 키 : 180.5



toCharArray() : 문자열을 char[] 배열로 리턴

⭐ 입력

String s5 = "admin123!";
char[] chArr = s5.toCharArray();
for(int i = 0; i < chArr.length; i++) {
  System.out.println(chArr[i]);
}
System.out.println("==================");
System.out.println(Arrays.toString(chArr));

📌 출력

a
d
m
i
n
1
2
3
4
!
==================
[a, d, m, i, n, 1, 2, 3, 4, !]





📁 StringBuffer / StringBuilder


  • String 클래스는 한번 생성되면 내부의 문자열 변경X

  • String 클래스 사용하여 문자열 계속 연결하거나 변경하는 프로그램 사용 시 메모리 낭비 심함

  • StringBufferStringBuilder 클래스 활용하여 문자열 변경하거나 연결

    -> 두 클래스 크게 차이X


✔ StringBuffer


  • 문자열의 안전한 변경 보장

  • 스레드 동작하는 멀티프레스 환경 프로그램에 사용


✔ StringBuilder


  • 실행 속도가 StringBuffer에 비해 더 빠름

  • 스레드 동작하지 않는 프로그램에 사용


결합 연산자를 사용해서 문자열을 변경했을 때

String str = new String("Java");
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949

str = str + " and";
System.out.println(System.identityHashCode(str)); 
// 연결 후 str 문자열의 주소 : 488970385
// 주소 바뀌었음 -> 메모리 영역 새로 생성됨

str = str + " android";
System.out.println(System.identityHashCode(str));
// 연결 후 str 문자열의 주소 : 1209271652
// 또 바뀜

StringBuilder 사용해서 문자열을 변경했을 때

StringBuilder buffer = new StringBuilder(str);
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949

buffer.append(" and");
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949 
// 바뀌지 않고 그대로임 -> 메모리 영역 그대로

buffer.append(" android");
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 41903949 
// 또 그대로

tr = buffer.toString();
System.out.println(str);
System.out.println(System.identityHashCode(str));
// str 문자열의 주소 : 93122545
// 이제 바뀌었음!
profile
개발자가 되었어요⭐️

0개의 댓글