버글버글

Java 수업 기록 (6) Java API - String(문자열) 본문

java/java 수업 기록

Java 수업 기록 (6) Java API - String(문자열)

Bugle 2022. 7. 25. 15:02
반응형

- Java API -

▶ String(문자열)   

1. 문자열 동등 비교

 - 같을 때 비교

    String str1 = "hello";
    String str2 = "hello";
    boolean result1 = str1.equals(str2);
    System.out.println(result1);
  Console    true

- 다를 때 비교

    if(str1.equals(str2)) {
        System.out.println("str1, str2는 같아요");
    } else {
        System.out.println("str1, str2는 달라요");
    }
  Console    str1, str2는 같아요

** 문자열을 비교할때 비교연산 ( == )을 등호로 쓰면 안된다.

 

2. 대소문자를 무시한 문자열 동등 비교

 - 예를 들면 ID 같은거의 대 소문자 무시

    String str5 = "Hello World";
    String str6 = "hELLO wORLD";
    boolean result3 = str5.equalsIgnoreCase(str6); 
    System.out.println(result3);
  Console    true

* case 는 대소문자를 의미함

 

3. 문자열 길이 반환

    String name = "홍길동";
    int length = name.length();
   System.out.println("글자수 : " + length);
  Console    글자수 : 3

* 공백도 글자수에 포함이 된다.

* 아스키 코드에도 32번으로 등록되어 있다.

 

4. 특정 위치의 문자만 반환

  1) 특정위치
  2) 인덱스(Index)라고 한다.
  3) 글자마다 부여된 정수값.
  4) 0으로 시작 (첫번째 글자는 인덱스가 0이다.)

    String name = "홍길동";
    System.out.println(name.charAt(0));
    System.out.println(name.charAt(1));
    System.out.println(name.charAt(2));
  Console    홍
  길
  동

 

5. 문자열의 일부 문자열(String)을 반환

  1) substring(begin) : 인덱스 begin(인덱스 포함)부터 끝까지 반환
  2) substring(begin, end) : 인덱스 begin(인덱스 포함)부터 인덱스 end(불포함)까지 반환

    String name = "홍길동";
    System.out.println(name.substirng(0,1));
    System.out.println(name.substring(1));
  Console    홍
  길동

 

6. 특정 문자열을 찾아서 해당 인덱스(int)를 반환

  *변수 이름을 idx 또는 i를 쓴다. (과장해서 거의 모든 개발자가)

  1) indexOf

      (1) 발견된 첫 번째 문자열의 인덱스를 반환

      (2) 발견된 문자열이 없는 경우 -1을 반환

    int idx1 = name.indexOf("홍"); 
    int idx2 = name.indexOf("길동"); 
    System
.out.println(idx1);
    System
.out.println(idx2);
  Console    0
  1

 2) lastIndexOf

      (1) 발견된 마지막 문자열의 인덱스를 반환

      (2) 발견된 문자열이 없는 경우 -1을 반환

    int idx3 = name.lastIndexOf("동"); 
    int idx4 = name.lastIndexOf("길동"); 
    System
.out.println(idx3);
    System
.out.println(idx4);
  Console    2
  1

 

7.  문자열이 특정 패턴으로 시작하는지 여부를 boolean(true, false) 반환

  startWith(문자열)

    if(name.startsWith("이")) {
        System.out.println("이씨입니다.");
    } else {
        System.out.println("이씨가 아닙니다.");
    }
  Console    이씨가 아닙니다.

 

8. 문자열이 특정 패턴으로 끝나는지 여부를 boolean(true, false) 반환

  startWith(문자열)

 예시) jpg, png로 끝나면 이미지로 가정

    String filename = "image.jpg";
    if(filename.endsWith("jpg") || filename.endsWith("png")) {
        System.out.println("이미지입니다.");
    } else {
        System.out.println("이미지가 아닙니다.");
    }
  Console    이미지입니다.

 

9. 문자열이 특정 패턴을 포함하는지 여부를 boolean(true, false) 반환

  endWith(문자열)

    String email = "hoh1011@naver.com";
    if(email.contains("@") && email.contains(".")) {
        System.out.println("이메일입니다.");
    } else {
        System.out.println("이메일이 아닙니다.");
    }
  Console    이메일입니다.

 

10. 불필요한 공백 제거(좌우 공백)

  - 중간 공백은 제거하지 않는다. 앞 뒤만 제거함.

    String message = "  안녕  하세요  ";
        System.out.println(message.trim();
        System.out.println(message.trim()).length());
    }
  Console    안녕  하세요
  7

 

11. 대소문자 변환하기

  1) toUpperCase() : 대문자로 변환하기

  2) toLowerCase() : 소문자로 변환하기

    String source = "best of best";
    System.out.println(source.toUpperCase());
    System.out.println(source.toLowerCase());
  Console    BEST OF BEST
  best of best

 * 소스가 변하는게 아니라, 이 메소드를 사용했을때 이렇게 나옵니다. 를 알려줌

 

12. 찾아바꾸기

  1) replace(old, new) : old를 찾아서 new로 변환하기

    String source = "best of best";
    String replaced = source.replace("best", "worst");
    System.out.println(source);
    System.out.println(replaced);
  Console    best of best
  worst of worst

 * 소스는 그대로 인것을 확인할 수 있다.

 

 

주의) replaceAll() 메소드는 특정 문자열을 찾아서 변환하는 것이 아님.

 - 아래 예시는  192_168_10_101_91로 변화하는 것을 기대 할 수 있지만, 출력은 ______________ 로 된다.

 - 착각해서 사용하면 된통 당한다.

 - 아직은 왜 이렇게 되는지 이해를 하지 않아도 된다. 문자열을 의미하는게 아니라는 것만 알고 있으면 된다.

    String ip = "192.168.101.91";
    String replacedIp = ip.replaceAll(".", "_"); 
    System.out.println(replacedIp);
  Console    ______________

 

13. 빈 문자열인지 여부를 검사한 뒤 boolean(true, false) 반환

    String id = " ";
    if(id.isEmpty()) {
        System.out.println("빈 문자열");
    } else {
        System.out.println("빈 문자열 아님");
    }

     if(id.trim().isEmpty()) {
        System.out.println("빈 문자열");
    } else {
        System.out.println("빈 문자열 아님");
    }

    if(id.isBlank()) {
        System.out.println("빈 문자열");
    } else {
    System.out.println("빈 문자열 아님");
    }
  Console    빈 문자열 아님
  빈 문자열
  빈 문자열

 * is.Blank는 자바11 버전 이후 추가 된 것이다.

 * 대중화 된 버전은 1.8 버전이여서, 이 메소드를 쓴다면 낭패를 볼 것이다.

 * 사용 안하는 것을 추천한다.

 * 최신 코드는 항상 조심하여야 한다.

 

 

String 클래스의 메소드는 상당이 많으며, 아직도 더 남아있다.....

 

 

▶ StringBuilder   

1. java.lang.StringBuilder 클래스

 - StringBuilder를 쓰는 이유는 단순히 성능이 좋기 때문이다.

    StringBuilder sb = new StringBuilder();
    sb.append(1);
    sb.append(true);
    sb.append('T');
    sb.append(3.14);
    sb.append("hello");

    System.out.println(sb);
    System.out.println(sb.equals("1trueT3.14hello"));
  Console    1trueT3.14hello
  false
    String result = sb.toString();
    System.out.println(result);
    System.out.println(result.equals("1trueT3.14hello"));
  Console    1trueT3.14hello
  true

* 중요 포인트 : append 한다음에 toString만 하면 된다.

 

StringBuilder가 쓰이는 이유에 대한 예시)

 - String과 StringBuilder의 성능 테스트

 - 아래의 코드는 공부 해야 할 게 아니라, 성능차이를 눈으로 비교해보라는 의미이다.

* String

    String alphabet1 = "";
    long begin1 = System.nanoTime();
    for(char ch = 'a'ch <= 'z'; ch++) {
        alphabet1 += ch;
    }
    long end1 = System.nanoTime();
    System.out.println((end1 - begin1) + alphabet1);
  Console    21800abcdefghijklmnopqrstuvwxyz

* StringBuilder

    StringBuilder sb2 = new StringBuilder();
    long begin2 = System.nanoTime();
    for(char ch = 'a'ch <= 'z'ch++) {
        sb2.append(ch);
    }
    long end2 = System.nanoTime();
    String alphabet2 = sb2.toString();
    System.out.println((end2 - begin2) + alphabet2);
  Console    1800abcdefghijklmnopqrstuvwxyz

* 걸린 시간이 12배나 줄어든다.

 

반응형