java.lang패키지3 : String 클래스, StringBuffer와 StringBuilder 클래스의 메서드

java.lang패키지3 : String 클래스, StringBuffer와 StringBuilder 클래스의 메서드

String 클래스의 특징과 객체 생성

  • 가장 많이 사용되는 클래스 1위!
  • 기본특징
    1. final 클래스 -> 상속을 받아서 수정불가
    2. 내부적으로 char[]배열을 만들어서 데이터를 저장함.
    3. 생성자를 사용하지 않고 바로 “”로 둘러싼 문자열을 할당가능. -> String Pool사용.
    4. 불변성(Immutable)클래스 : 무심코 +로 연결한 문자열이 메모리를 심각하게 낭비할 수 있음.
      • 이 불변성때문에 equals()와 ==연산자차이가 생긴다.




객체생성방법 2가지

  1. new 키워드 : heap메모리공간에 새로운 문자열을 저장
  2. “”문자열할당 : 상수저장공간(Constant Pool)에 새로운 문자열을 저장.
    • 중복된 값 무시.
    • 메모리절약에 유리(아래 이미지 참조).
  3. 참고링크 : equals()와 ==연산자차이점, String Pool

https://www.javaguides.net/2018/07/guide-to-java-string-constant-pool.html

https://hyeran-story.tistory.com/123




String 주요 메서드

선언부 설명
public int length() 주어진 문자열의 길이를 리턴
public char charAt(int index) index에 해당하는 문자를 리턴. 없는경우 IndexOutOfBoundsException
public int indexOf(int ch) 문자열내에서 ch의 index를 리턴. 없을경우 -1
public boolean equals(Object o) o의 문자열의 내용을 비교해서 결과를 boolean타입으로 리턴
public boolean equalsIgnoreCase(String s) 대소문자 구별없이 s의 문자열의 내용이 같은지 boolean타입으로 리턴
public String replace(char oldChar, char newChar) 문자열에서 oldChar를 찾아서 newChar로 변경된 새로운 문자열을 리턴
public String substring(int beginIdx, int endIdx) 문자열의 beginIdx에서 endIdx앞까지 잘라서 리턴
public String trim() 문자열 좌우 공백을 없앤 결과를 리턴
public boolean matches(String regex) 문자열이 정규표현식 regex에 부합되는지 여부를 boolean타입으로 리턴
public String[] split(String regex) 문자열을 주어진 정규표현식으로 나눈 후 배열에 담아서 리턴




charAt() 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String ssn = "000101-4111111";
char gender = ssn.charAt(7);
if(gender == '4'){
System.out.println("여");
}else if(gender == '3'){
System.out.println("남");
}else{
System.out.println("주민번호형식오류");
}
System.out.println(gender);

//출력값

4




equalsIgnoreCase()예시

1
2
3
4
5
6
String s = "HI";
System.out.println("hi".equals(s));
System.out.println("hi".equalsIgnoreCase(s));
//출력값
false
true




replace() 예시

  • 전화번호의 뒷자리를 별표표시하는 방법
1
2
3
4
5
6
7
String hp = "010-1234-5678";
String last4 = hp.substring(9, hp.length());
System.out.println("추출된 문자열 : "+last4);
System.out.println("마킹된 폰번 : "+hp.replace(last4, "****"));
//출력값
추출된 문자열 : 5678
마킹 폰번 : 010-1234-****
  • 전화번호의 하이픈을 없애는 방법
1
2
3
System.out.println("하이픈제거 폰번호 :"+hp.replace("-", ""));
//출력값
하이픈제거 폰번호 :01012345678




split()과 matches() 예시

1
2
3
4
5
6
7
String str = "Hi java world";
String[] result = str.split(" ");
for(String s : result){ System.out.println(s); }
//출력값
Hi
java
world
  • split()과 matches()예시
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
    String str = "Hi java world";
    String[] sResult = str.split("[a ]");
    for(int i=0; i<sResult.length;i++){
    System.out.println(i+" : "+sResult[i]);
    }
    String nameRule = "[a-zA-Z가-힣]{2,5}";
    System.out.println(str.matches(nameRule));
    System.out.println("Hi".matches(nameRule));
    System.out.println("Hijavaworld2".matches(nameRule));
    }




StringBuffer와 StringBuilder 클래스의 메서드

  • String클래스는 불변성 클래스이기때문에 문자열 연산에 제약이 많음

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sql = "abc";  //"abc"
    sql.toUpperCase(); //"ABC"
    sql; //"abc"

    //대문자 ABC가 sql에 저장되지 않는다. String은 불변성 클래스이다.
    //따라서 새로운 변수에 담아쓰는 수 밖에 없다.

    str = sql.toUpperCase(); //"ABC"
    str //"ABC"
    sql //"abc"
    • 따라서 문자열 연산에 적합한 StringBuffer와 StringBuilder 클래스 사용가능.
  • Buffer(버퍼) : 배열형태. 데이터를 임시로 저장하는 공간.




StringBuffer와 String의 차이점

  • 여러 차이점 중에 불변성유무가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//String
sql = "abc"; //"abc"
sql.toUpperCase(); //"ABC"
sql; //"abc"

//대문자 ABC가 sql에 저장되지 않는다. String은 불변성 클래스이다.
//따라서 새로운 변수에 담아쓰는 수 밖에 없다.

str = sql.toUpperCase(); //"ABC"
str //"ABC"
sql //"abc"

//StringBuffer
sql2 = "abc"; //"abc"
sql2.substring(1); //"bc"
sql2 = "bc" //"bc"
  • 따라서 문자열 연산에 적합한 StringBuffer와 StringBuilder 클래스 사용가능.




주요 메서드

  • 여기서 P는 Object, String, StringBuffer, charSequence, Char[], Boolean, char, int, long, float, double이 올 수 있다.
선언부 설명
public StringBuilder append(P param) 현재 버퍼의 맨 뒤에 param을 추가한 후 StringBuilder타입으로 리턴
public String toString() 버터의 내용을 문자열로 리턴




append()와 toString()예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
StringBuilder b = new StringBuilder("서면-대연-광안-수영");
b.append("-장산");
System.out.println(b);
b.insert(0, "부암-");
System.out.println(b);
b.delete(5, 8); //대연-삭제
System.out.println(b);
b.replace(0, 1, "푸"); //부 -> 푸
System.out.println(b);

//출력값
서면-대연-광안-수영-장산
부암-서면-대연-광안-수영-장산
부암-서면-광안-수영-장산
푸암-서면-광안-수영-장산