ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL #8-3][JAVA] 문자열 String
    CodeStates_Backend/TIL (Today I Learned) 2022. 5. 12. 16:39

    코드스테이츠 백엔드 부트캠프 39기 10일차

     

     

    문자열 String

    자바는 String 클래스를 사용하여 문자열을 다룬다. 클래스가 마치 타입처럼 사용되는 것이다. String 클래스에는 여러가지 연관된 메소드들이 있다. (사실, String 클래스 내부에서 char형 배열을 통해 처리한다. 속닥속닥..)

     

    알고 있어야 할 점을 ordered list 로 정리한다. (난 이게 기억이 잘 난다.)

     

    1. 큰따옴표(" ")로 감싼다.

    2. 선언, 초기화 방법

    String 변수;
    변수 = "문자열";      // 문자열 리터럴을 대입하는 방식
    
    String 변수 = "문자열";
    
    String 변수 = new String("문자열");   // new 연산자를 사용해서 객체를 생성하고 문자열을 대입하는 방식

    3. 참조타입

    기본타입이 아니므로 당연히 주소값이 저장되는 참조변수가 된다. 생성된 String 클래스의 객체주소를 가진다. 객체가 아닌 리터럴을 대입한 경우에는 동일한 문자열 리터럴을 공유하므로 비교연산자(==)로 연산 시 true가 된다.

    String name1 = "최코딩";
    String name2 = "최코딩";
    String name3 = new String("최코딩");
    
    //case 1
    System.out.println(name1 == name2); // -> true
    //case 2
    System.out.println(name1 == name3); // -> false

    4. String 클래스의 주요 메소드

     

    🔘 charAt()

    문자열의 인덱스에 해당하는 문자를 반환한다. 인덱스로 길이보다 크거나 음수를 전달하면 오류가 발생한다.

    String str = new String("Java");
    System.out.println("문자열 : " + str); // "문자열 : Java"
    
    System.out.println(str.charAt(0)); // 'J'
    System.out.println(str.charAt(1)); // 'a'
    System.out.println(str.charAt(2)); // 'v'
    System.out.println(str.charAt(3)); // 'a'
    
    System.out.println("\ncharAt() 메서드 호출 후 문자열 : " + str);

     

    🔘 compareTo()   <공식문서 확인완료> 

    compareTo() 는 "숫자 비교" 와 "문자열 비교" 두 가지 방식이 존재한다.

    - int compareTo(NumberSubClass referenceName)

    - int compareTo(String anotherString)

    compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수인 것이다.

     

    1) 숫자 비교

    단순히 같으면 0, 작으면 -1, 크면 1 을 출력한다.

    public class CompareToMethod{
    public static void main(String[] args){ 
            Integer x = 4; 
            Integer y = 5; 
            Double z = 2.0; 
            
            System.out.println( x.compareTo(y) ); // -1 
            System.out.println( x.compareTo(4) ); // 0 
            System.out.println( x.compareTo(2) ); // 1 
            System.out.println( z.compareTo(2.7) ); // -1 
    	} 
    }

    기본 타입인 int형으로 비교하고 싶다면 Integer.compareTo()를 사용하면 된다.

     

    2) 문자열 비교

    자바 공식 문서를 찾아보니, 두 경우가 있다.

     

    🥎 어떠한 인덱스에서 문자가 다른 경우

    이 경우는 두 문자열을 char형 배열로 두고 한 문자씩 유니코드값을 비교한다고 한다. (사전순은 유니코드값의 오름차순과 같다.) 첫 문자부터 찾기 시작하여 최초로 다른 문자를 찾았을 때, 그 두 문자의 유니코드값의 차이값을 결과로 반환한다. 즉, 음수이면 사전순에서 더 빠른 것이다.

     

    🥎 위 경우가 아니며 길이가 다른 경우

    문자열이 짧을 수록 사전순에서 빠르므로, 두 문자열의 길이 차이를 반환한다.

    public class Main {
        public static void main(String[] args) {
            String str = "abcd";
            // 1) 어떠한 인덱스에서 문자가 다른 경우
            System.out.println( str.compareTo("c") ); // -2
            System.out.println( str.compareTo("zefd") ); // -25
            System.out.println( str.compareTo("zEFd") ); // -25
            System.out.println( str.compareTo("ABCD") ); // 32
            // 2) 위 경우가 아니며 문자열의 길이가 다른 경우
            System.out.println( str.compareTo("ab") ); // 2
            System.out.println( str.compareTo("a") ); // 3
            System.out.println( "".compareTo(str) ); // -4
            // 3) 동일한 경우
            System.out.println( str.compareTo("abcd") ); // 0
    
        }
    }
    

    [참고] 대소문자를 무시하려면 compareToIgnoreCase() 를 쓰면 된다. 정확한 사용법은 공식문서로..

     

    🔘 concat()

    concatenate의 약자로, 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환한다. 만약 인수로 전달된 문자열의 길이가 0이면, 해당 문자열을 그대로 반환한다.

    String str = new String("Java");
    System.out.println("문자열 : " + str);
    System.out.println(str.concat("수업"));
    System.out.println("concat() 메서드 호출 후 문자열 : " + str);

     

    🔘 indexOf()

    특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다. 찾아봐도 없으면 -1을 반환한다.

    String str = new String("Oracle Java");
    System.out.println("문자열 : " + str);
    System.out.println(str.indexOf('o'));
    System.out.println(str.indexOf('a'));
    System.out.println(str.indexOf("Java"));
    System.out.println("indexOf() 메서드 호출 후 원본 문자열 : " + str);

     

    🔘 trim()

    문자열의 맨 앞, 맨 뒤에 있는 모든 공백문자(띄어쓰기, 탭, 줄바꿈 등)를 제거해준다.

    String str = new String(" Java     ");
    System.out.println("문자열 : " + str);
    System.out.println(str + '|');
    System.out.println(str.trim() + '|');
    System.out.println("trim() 메서드 호출 후 문자열 : " + str);

     

    🔘 toLowerCase()toUpperCase()

    문자열의 모든 문자를 소문자 혹은 대문자로 변환해준다.

    String str = new String("Java");
    System.out.println("문자열 : " + str);
    System.out.println(str.toLowerCase());
    System.out.println(str.toUpperCase());
    System.out.println("두 메서드 호출 후 문자열 : " + str);

     


    StringTokenizer 클래스

    문자열을 지정한 구분자로 쪼개주는 클래스이다. 쪼개진 문자열을 '토큰(token)'이라고 부른다. java.util.StringTokenizer 를 import 해야 한다.

    import java.util.StringTokenizer;
    
    public static void main(String[] args){
    	String str = "This is a string example using StringTokenizer";
    	StringTokenizer tokenizer = new StringTokenizer(str);
    	System.out.println(str);
    	System.out.println();
    		
    	System.out.println("total tokens:"+tokenizer.countTokens());
    	// 아래의 while 코드는 반복문의 한 종류인데 어떻게 작동하는지 추후 반복문 챕터에서 공부할 예정이니 걱정하지 않으셔도 됩니다.
    	while(tokenizer.hasMoreTokens()){
    		System.out.println(tokenizer.nextToken());
    	}
    	System.out.println("total tokens:"+tokenizer.countTokens());
    }
    
    // 출력 결과
    /*
    
    This is a string example using StringTokenizer
    
    total tokens:7
    This
    is
    a
    string
    example
    using
    StringTokenizer
    total tokens:0
    
    */

    주요 메서드

    🔘 int countTokens()

    남아있는 토큰의 개수를 반환한다. 전체 토큰의 개수가 아닌 현재 남아있는 토큰 개수이다.

     

    🔘 boolean hasMoreElements() , boolean hasMoreTokens()

    현재 위치 뒤에 있는 문자열에서, 하나 이상의 토큰을 사용할 수 있는 경우 True, 아니면 False 를 반환한다. 두 메소드의 성능적인 차이는 없다.

     

    🔘 Object nextElement() , String nextToken()

    다음 토큰을 반환한다. 단, 두 메소드의 반환타입만 다르다.

     

     


    StringBuilder

    String 클래스의 인스턴스는 문자열을 붙이려면 매번 다른 인스턴스가 필요하다. 만약 100만개의 문자열을 연결하려면..?

    StringBuilder 클래스는 append()로 문자열을 연결할 수 있다. 출력 시에는 toString()을 써야한다.

    더 상세한 내용은 공식 문서를 확인하자.

    ublic class Main {
        public static void main(String[] args) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("문자열 ").append("연결");
            String str = stringBuilder.toString();
            System.out.println(stringBuilder);
            System.out.println(str);
        }
    }
    
    // 결과
    /*
    문자열 연결
    문자열 연결
    */

     


    StringBuffer

    String 클래스의 인스턴스는 한 번 생성되면 값을 읽기만 할 수 있고, 변경할 수 없다. 이에 반해 StringBuffer클래스의 인스턴스는 값을 변경할 수 있다. StringBuffer클래스는 내부적으로 '버퍼'라고 하는 독립적인 공간을 가진다. 이 버퍼는 기본 크기값을 가지는데 '16개의 문자를 저장할 수 있는 크기'이고 생성자를 통해 그 크기를 별도로 설정할 수 있다. (실제로는 크기를 별도로 설정하더라도 '기본 크기값' 만큼의 여유공간이 자동으로 할당된다.)

    덧셈(+) 연산자를 이용해 String 인스턴스의 문자열을 연결하면, 새로운 String 인스턴스를 생성한다. 따라서 문자열을 결합할수록 공간이 낭비되고 속도도 느려진다. 하지만 StringBuffer를 사용하면 공간의 낭비도 없어지고 속도도 빨라진다.

     

    주요 메서드

    🔘 append()

    인수로 전달된 값을 문자열로 변환한 후, 마지막에 추가한다. 이 메서드는 String 클래스의 concat() 과 같은 결과를 반환하지만 내부적인 처리속도가 훨씬 빠르다.

    StringBuffer str = new StringBuffer("Java");
    System.out.println("문자열 : " + str);
    System.out.println(str.append(" programming"));
    System.out.println("append() 메서드 호출 후 문자열 : " + str);

     

    🔘 capacity()

    StringBuffer 인스턴스의 현재 버퍼 크기를 반환한다.

    StringBuffer str01 = new StringBuffer();
    StringBuffer str02 = new StringBuffer("Java");
    System.out.println(str01.capacity());
    System.out.println(str02.capacity());

    위의 예제처럼 길이가 4인 문자열로 StringBuffer 인스턴스를 생성하면, 기본 버퍼 크기인 16 만큼 더 생성되어 총 20개의 문자를 저장할 수 있는 버퍼가 생성되는 것을 확인할 수 있다.

     

     

    🔘 delete() , deleteCharAt()

    delete() 는 전달된 인덱스에 해당하는 부분문자열을 제거한다. deleteCharAt() 는 특정 위치의 문자 한 개만을 제거한다.

    StringBuffer str = new StringBuffer("Java Oracle");
    System.out.println("문자열 : " + str);
    System.out.println(str.delete(4, 8));
    System.out.println(str.deleteCharAt(1));
    System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + str);

     

    🔘 insert()

    인수로 전달된 값을 문자열로 변환한 후, 지정된 인덱스 위치에 추가한다. 이때 전달된 인덱스가 해당 문자열의 길이와 같으면, append() 메소드와 같은 결과를 반환하게 된다.

    StringBuffer str = new StringBuffer("Java Programming!!");
    System.out.println("문자열 : " + str);
    System.out.println(str.insert(4, "Script"));
    System.out.println("insert() 메서드 호출 후 문자열 : " + str);

     

     

     

    사용해본 메소드

    String.isEmpty()

    String.replace()

    String.substring()

    String.split()

    String.toCharArray()

    Integer.toString()

Designed by Tistory.