ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 문자열 클래스
    프로그래밍/JAVA 2020. 9. 7. 21:54

    String 클래스

    java.lang 패키지에 포함된 클래스로 문자열을 나타냄

    String을 선언하는 방법은 크게 다음과 같이 두가지가 존재

     

    // 리터털
    String str2 = "JAVA"; 
    
    // new 연산자
    char data[] = {'J', 'A', 'V', 'A'};
    String str2 = new String(data);
    String str3 = new String("JAVA"); // str2, str3 모두 "JAVA" 문자열

     

    여기서 String을 리터럴로 선언하는 것과 new 연산자를 이용해 선언하는 것과 굉장히 중요한 차이점이 존재!

     

    String str1 = "JAVA";
    String str2 = "JAVA";
    
    if(str==str2) { // 두 객체의 메모리 주소를 비교
    	System.out.println("TRUE");	
    } else {
    	System.out.println("FALSE");
    }
    
    // 실행 결과
    // TRUE

     

    위의 예제에서 각각의 스트링 객체는 따로 선언되었으므로 str1의 메모리 주소와 str2 메모리 주소를 비교했을 때 다른 값이 나올 것으로 예상됐지만 결과는 같은 주소를 가지고있다고 나옴

    이러한 결과가 나온 이유는?   String Constant Pool!

     

    String 객체는 내부적으로 intern() 메소드를 호출

    intern 메소드는 String Constant Pool 에서 해당 문자열이 존재하는지 검색

    존재하면 해당 문자열의 주소값을 반환 (위의 예시는 이에 해당)

    존재하지 않으면 새로운 주소값을 할당하여 반환

     

    예제

    public class StringEx {
    	public static void main(String[] args) {
        
        	String a = new String(" C#");
            String b = new String(",C++ ");
    
            System.out.println(a + "의 길이는 " + a.length()); // 문자열의 길이(문자 개수)
            System.out.println(a.contains("#")); // 해당 문자열을 가지고 있는지 확인
    
            a = a.concat(b); // 문자열 연결
            System.out.println(a);
    
            a = a.trim(); // 문자열 앞 뒤 공백 제거
            System.out.println(a);
    
            a = a.replace("C#", "JAVA"); // 문자열 대치
            System.out.println(a);
    
            String s[] = a.split(","); // 문자열 분리
            for (int i = 0; i < s.length; i++) {
                System.out.println("분리된 문자열 " + i+1 + " : " + s[i]);
            }
    
            a = a.substring(5); // 인덱스 5번부터 끝까지 서브 스트링 리턴
            System.out.println(a);
    
            char c = a.charAt(2); // 인덱스 2의 문자 리턴
            System.out.println(c);
        }
    }
    
    // 실행 결과
    // C#의 길이는 3
    // true
    //  C#,C++ 
    // C#,C++
    // JAVA,C++
    // 분리된 문자열 01 : JAVA
    // 분리된 문자열 11 : C++
    // C++
    // +

     

    StringBuffer, StringBuilder 클래스

    String 객체의 문자열을 수정할 수 없다는 점, 메모리 낭비가 있다는 점을 보완하기 위해 사용

    메모리 낭비에 대한 내용은 다음 예시를 나타냄

     

      String str = new String("JAVA");
      str = str + "_8"; 
      // 문자열이 변경되면 기존의 객체를 버리고 새로운 객체를 메모리에 생성, 기존 객체는 GC에 의해 회수됨
    

     

    따라서 간단한 문자열 처리를 할 때는 String 클래스를 이용하고, 문자열의 길이가 길거나 문자열이 수시로 변하는 경우는 StringBuffer 혹은 StringBuilder 클래스를 사용하면 좋음

     

    예제

    public class StringBufferBuilderEx {
    	public static void main(String[] args) {
        
    	 // StringBuffer : 속도가 더 빠름
         StringBuffer sf = new StringBuffer("I Love");
         
         sf.append(" JAVA"); // 문자열 덧붙이기
         System.out.println(sf);
    
         sf.insert(6, " C++ And"); // 6번 인덱스에 문자열을 삽입
         System.out.println(sf);
    
         sf.replace(2, 6, "Hate"); // 2번 인덱스 ~ 6번 인덱스 전까지 문자열을 변경
         System.out.println(sf);
    
         sf.delete(15, 19); // 15번 인덱스 ~ 19번 인덱스 전까지 문자열을 삭제
         System.out.println(sf);
    
         sf.setLength(6); // 스트링 버퍼 내 문자열 길이 수정
         System.out.println(sf);
    
         // StringBuilder : 안정성이 더 좋음 (더 많이 사용 한다고 함)
         StringBuilder sb = new StringBuilder("String Builder!");
         
         System.out.println("sb = " + sb);
          
    	}
    }
    
    // 출력 결과
    // I Love JAVA
    // I Love C++ And JAVA
    // I Hate C++ And JAVA
    // I Hate C++ And 
    // I Hate
    // sb = String Builder!

     

    StringTokenizer 클래스

    java.util 패키지에 포함된 클래스로 하나의 클래스를 여러 개의 문자열로 분리할 때 사용

    구분문자 : 문자열을 분리할 때 사용되는 기준 문자

    토큰 : 구분 문자로 분리된 문자열

    오라클에서는 String 클래스의 split() 메소드 사용을 권장하지만, 사용법이 편해 여전히 많이 사용된다고 함

     

    예제

    public class StringTokenizerEx {
    	public static void main(String[] args) {
    		
            StringTokenizer st = new StringTokenizer("홍길동/장화/홍련/콩쥐/팥쥐", "/");
            
            System.out.println("st.countTokens() = " + st.countTokens()); // 토큰의 개수
            
            while(st.hasMoreTokens()) { // 토큰이 있는 동안
            	System.out.println(st.nextToken());
            }
        }
    }
    
    // 출력 결과
    // st.countTokens() = 5
    // 홍길동
    // 장화
    // 홍련
    // 콩쥐
    // 팥쥐

     

     

    출처 : http://www.yes24.com/Product/Goods/61269276
     

    명품 JAVA Programming

    자바(Java)는 그 이전 시대에 있었던 프로그래밍 언어에서 한 차원 진화된 개념으로 개발된 가히 혁명적 언어이며 플랫폼이다. 한 번 작성된 자바 프로그램은 어느 컴퓨터, 어떤 운영체제에서도 �

    www.yes24.com

    댓글

Designed by Tistory.