16. 문자열 String

2023. 3. 28. 09:12Lang/Java

728x90
반응형

1. String

  • 변경이 불가능한 문자열
  • 상수 개념

String str = "java";
String str = new String("java");

  • 문자열을 더하거나 변경하면 새로운 String객체 생성
  • 기존 객체는 버려지며 쓰레기가 된다.
  • 같은 문자열은 하나의 String 인스턴스 공유

String str1 = "hi";
String str2 = "hi";
String str3 = "hello";
String str4 = new String("hi");

  • str1과 str2는 같은 인스턴스 공유
  • str4는 새로 객체를 생성했기 때문에, 인스턴스를 공유하지 않는다.
//equals가 아닌 ==를 통해 주소값 
public class StringTest {

    public static void main(String[] args) {

        String str1 = "Hello";
        String str2 = "Hello";
        String str3 = "Java";
        String str4 = new String("Hello");
        String str5 = new String("Hello");

        if(str1==str2) {//참조형에서는 ==이 주소 비교
            System.out.println("str1, str2는 같은 주소=>동일인스턴스 참조");
        }else {
            System.out.println("다른 인스턴스 참조");
        }
        if(str2==str3) {
            System.out.println("str2, str3는 같은 주소=>동일인스턴스 참조");
        }else {
            System.out.println("다른 인스턴스 참조");
        }

        if(str4==str5) {
            System.out.println("str4, str5는 같은 주소=>동일인스턴스 참조");

        }else {
            System.out.println("다른 인스턴스 참조");

        }
        if(str1==str5) {
            System.out.println("str1, str5는 같은 주소=>동일인스턴스 참조");

        }else {
            System.out.println("다른 인스턴스 참조");

        }
    }
}
  • concat()메서드
    • 두 문자열을 결합
    • 서로 다른 두개의 문자열을 이어서 새로운 String 인스턴스 생성
public class ConcatTest {

    public static void main(String[] args) {
        // concat() - 두 문자열 결합
        String str1 = "Happy";
        String str2 = "and";
        String str3 = "Smile";
        String str4=str1.concat(str2).concat(str3);

        System.out.println(str4);
        }
    }
}

2. StringBuilder, StringBuffer

  • 변경가능한 문자열
  • 내부적으로 문자열 편집을 위한 버퍼를 가지고 있다
  • 인스턴스 생성 시 크기 지정 가능

a. StringBuilder

  • Tgread safe하지 않으며 속도는 더빠름
  • +기호 대신 append()메서드 이용
  • 문자열 저장을 위한 char형 배열의 참조변수를 인스턴스 변수로 선언
  • 생성자
    • StringBuilder()
      • 16개의 문자 저장 버퍼 생성
      • 문자 저장에 따라 자동으로 증가
    • StringBuilder(int a)
      • a개의 문자저장버퍼 생성
    • StringBuilder(String str)
      • str.length()+16개의 문자저장 버퍼 생성
  • 멀티쓰레드 프로그래밍에서는 사용하지 않는다
public class StringBuilderTest1 {

    public static void main(String[] args) {

        StringBuilder sb = new StringBuilder("AB");
        sb.append(25);
        sb.append('y').append(true);
        System.out.println(sb); //AB25ytrue

        sb.insert(2, false);
        sb.insert(sb.length(), 'Z');
        System.out.println(sb); //ABfalse25ytrueZ

    StringBuilder sb = new StringBuilder("ABCDEFG");
        System.out.println(sb.reverse()); //GFEDCBA

        StringBuilder sb2 = new StringBuilder("990101-1112222");
        sb2.deleteCharAt(sb2.lastIndexOf("-"));
        System.out.println(sb2); //9901011112222
    }
}

3. StringTokenizer

  • 문자열을 지정된 구분자를 기준으로 토큰으로 잘라낸다.
  • 구분자로 단 하나의 문자밖에 사용하지 못함
  • split()과 유사
import java.util.StringTokenizer;

public class TokenizerTest1 {

    public static void main(String[] args) {

        String str = "100,200,300,400";
        StringTokenizer st = new StringTokenizer(str,",");

        while(st.hasMoreTokens()) {
            String token = st.nextToken();
            System.out.println(token);
        }

        System.out.println();
        String[] arr = str.split(",");
        for(String s : arr) {
            System.out.println(s);
        }

        str = "x=100*(200+300)/2";
        StringTokenizer st2 = new StringTokenizer(str,"+-*/=()",true);
        // 단 한문자의 구분자만 사용할 수 있기 때문에, 전체가 하나의 구분자가 아니라
        // 각각의 문자가 모두 구분자
        // split은 +-*/=() 전체를 하나의 구분자로 
        // true : 구분자도 토큰으로 간주
        System.out.println();
        while(st2.hasMoreTokens()) {
            String token = st2.nextToken();
            System.out.println(token);
        }// true 없을 시, {x,100,200,300,2}만 출력

    }
}
  • split은 빈 문자열도 토큰으로 인식
  • StringTokenizer는 빈 문자열을 토큰으로 인식하지 않는다.
import java.util.StringTokenizer;

public class TokenizerTest3 {

    public static void main(String[] args) {
        String str = "100,,,200,300";

        String[] arr= str.split(",");
        int n=0;
        for(String s: arr) {
            System.out.println(s+"|");
            n++;
        }
        System.out.println("개수 : " +n);

        System.out.println();
        StringTokenizer st = new StringTokenizer(str,",");
        n=0;
        while(st.hasMoreTokens()) {
            String s = st.nextToken();
            System.out.println(s+"|");
            n++;
        }
        System.out.println("개수 : " +n);
    }
}

String클래스의 메서드들

a. equals()

  • 기본자료형에서 등가연산자(==)는 값을 비교한다. (a==b)
  • 참조형에서 등가연산자는 주소값을 비교한다.
  • 문자열 내용 비교는 String 클래스의 equals()메서드 이용
import java.util.*;
class If{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    System.out.println("약관에 동의합니까(Y/N)");
    String agree = sc.nextLine();
    if (agree.equals("Y"){
      System.out.println("동의하셨습니다");
    }
  }
}

b. toString()

  • Object클래스의 toString()메서드
  • 해당 객체가 어떤 객체인지 문자열로 표현하는 값 리턴
    • 클래스명@16진수 해시코드
  • p.toString()과 p를 출력한 결과값 동일
    • 클래스의 멤버가 할당된 주소를 숨기려는 특성=>
    • 직접 주소 칠력시, 자동으로 출력형식의 메서드 (toString)로 연결
  • 자동으로 호출되는 경우
    • System.out.pritnln() 메서드에 매개변수로 들어가는 경우
    • 객체에 대하여 더하기 연산을 하는경우
  • 클래스에서 오버라이딩 후 사용 가능
  • toString 결과값 확인
class Person{
    public void showInfo() {
        System.out.println(this);
    }
}

public class ToStringTest {

    public static void main(String[] args) {
        Person p = new Person();
        p.showInfo();

        System.out.println("p객체 문자열"+p.toString());
        System.out.println("p"+p);
        System.out.println(p);

    }
}
  • toString 오버라이딩
class Person2{
    private String name;
    private int age;

    //object의 toString()메서드를 오버라이딩
    public String toString() {
        return "Person2[name="+name+", age="+age+"]";
    }
}

public class ToStringTest2 {

    public static void main(String[] args) {
        Person2 p =new Person2();
        System.out.println(p);
        System.out.println(p.toString());


    }

}

c. length

  • 변수,length()
  • 문자열의 길이 확인

String a = "가나다라마바";
int b = a.length(); // b=6

d. charAt

  • 변수.charAt(i)
  • String의 문자열중 한글자만 선택해 char 타입으로 변환
  • i값은 String 문자열 내 index번호
  • index는 0부터 문자길이-1 까지
class cA{
    public static void main(String[] args){
        String str = "가나다라마"
        // index 0번 : 가
        // index 4번 : 마
        char c = str.charAt(0); // c에 '가'가 저장된다.
        char d = str.charAt(3); // d에 '라'가 저장된다.
        System.out.println(c); //가
    }
}

-nextLine 뒤에 붙여 바로 뽑아내는 것도 가능하다.

String a= "가나다라마";
char b = sc.nextLine().charAt(1);

e. indexOf, substring

  • indexOf
    • 문자열을 첫부분부터 검색, 입력한 문자열을 만나는 위치를 int로 반환
  • lastIndexOf
    • 문자열을 마지막 부분부터 검색, 입력한 문자열을 만나는 위치를 int로 반환
  • substring
    • 일부 문자열 추출
public class StringTest {

    public static void main(String[] args) {
                    //012345678901234567890123456789
        String str = "Hello Java, Hi Java!";
        char ch = str.charAt(4); //o
        System.out.println("ch="+ch);

        int idx = str.indexOf("Java");
        System.out.println("앞 Java의 위치 : "+idx); //6
        System.out.println("뒤 Java의 위치 : "+str.lastIndexOf("Java")); //15

        String sub = str.substring(6,10); //6<= x < 10, Java
        System.out.println("sub="+sub);
        System.out.println(str.substring(15)); //15부터 끝까지, Java!

        String s = "www.nate.com";
        if(s.startsWith("www")) {
            System.out.println("www로 시작함");

        }
        if (s.endsWith(".com")) {
            System.out.println(".com으로 끝남");
        }

                    //01234567890123
        String email="hong@gmail.com"; 
                    //
        if(email.indexOf("@") != -1&& email.indexOf(".")!=-1
                && email.indexOf("@")<email.indexOf(".")) {
            System.out.println("이메일 규칙이 올바르다");
        }else {
            System.out.println("이메일 규칙이 올바르지 않다");
        }

        int gol = email.indexOf("@");
        int dot = email.lastIndexOf(".");
        //hong만 추출
        System.out.println(email.substring(0,gol));
        //com
        System.out.println(email.substring(dot+1));
        //gmail
        System.out.println(email.substring(gol+1,dot));
    }
}

. String[] split

  • 특정 문자들을 경계로 하여 문자열을 여러개의 토막으로 분리
  • 인수로 배열을 전달하면, 토막 문자열을 배열형태로 리턴
package com.day23.extra;

public class SplitTest {

    public static void main(String[] args) {
        //String[] split(String regex)
        str = "java,oracle,jsp,spring";
        String[] arr = str.split(",");
        for(String s3 : arr) System.out.println(s3);

        System.out.println("\n\n");
        str="html.css.js.jquery";
        String[] arr2 = str.split("\\.",3); //특정 기호로 잘리지않으면 역슬래시 두개
                        //두번째 매개변수는 limit, 자를 개수
        for(String s3 : arr2) System.out.println(s3);

    }
}

. replace

  • 문자열을 다른 문자열로 교체
public class SplitTest {

    public static void main(String[] args) {
        String str = "123456789";
        String s = str.replace('7', '칠');
        String s2 = str.replace("89", "여덟아홉");
        System.out.println(s);
        System.out.println(s2);
    }
}

. trim

  • 앞위 공백 제거
s="             java spring!!          ";
String s2= s.trim();
System.out.println("s2=["+s2+"]"); // [java spring!!]
728x90
반응형

'Lang > Java' 카테고리의 다른 글

18. 내부클래스  (0) 2023.03.28
17. 오브젝트 클래스  (0) 2023.03.28
15. 컬렉션  (0) 2023.03.28
14. 예외  (0) 2023.03.27
13. 패키지  (0) 2023.03.27