ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 자바 기본 API(String 클래스)
    IT/개발(자바, 서블릿, 스프링 등) 2020. 1. 18. 14:13

     

    이번에는 자바 API 중에서 java.lang 패키지에 있는 기본 API 중 Object, String, StringBuffer, StringBuilder, Math 클래스에 대해 자주 사용하는 기능 위주로 살펴보겠다. Object 클래스에 이어 String 클래스에 대해 알아보겠다. 문자열 처리는 어떤 프로그램을 개발하든 필요한 기능이다. 이러한 문자열 처리 기능을 돕는 API는 String 클래스다.

     

    자바에서 객체를 생성할 때 new 명령문으로 생성하는데, 유일하게 String 클래스만 큰따옴표로도 객체를 생성할 수 있다. 그러나 new로 생성했는지, 큰따옴표로 생성했는지에 따라 다르게 동작하는 부분이 있다.

     

    public class Test{
    	public static void main(String[] args){
        	String s1 = new String("java");
            String s2 = "java";
            
            String s3 = new String("java");
            String s4 = "java";
            
            if(s1 == s3) {
            	System.out.println("동일 객체이다.");
            } else {
            	System.out.println("다른 객체이다.");
            }
            
            if(s2 == s4) {
            	System.out.println("동일 객체이다.");
            } else {
            	System.out.println("다른 객체이다.");
            }
            
        }
    }
    
    [실행결과]
    다른 객체이다.
    동일 객체이다.

     

    큰따옴표로 생성하면 힙 메모리에 String 인스턴스를 무조건 생성하는 것은 아니다. s1, s3와 같이 new 명령문으로 생성하면 무조건 힙 메모리에 인스턴스가 새로 생성된다. 그러나 s2, s4와 같이 큰따옴표로 생성하면 무조건 인스턴스를 생성하는 것이 아니고 힙 메모리에 고유한 영역인 String Pool을 찾아간다. String Pool은 큰따옴표로 생성된 String 인스턴스들이 위치하는 논리적으로 구분된 영역이다.

     

    String Pool에서 생성하려는 문자열과 똑같은 문자열을 가진 String 인스턴스가 있다면 새로 생성하지 않고 기존 인스턴스의 주솟값을 반환한다. 없다면 String Pool에 새로운 String 인스턴스를 생성한다. 결국 s2, s4는 똑같은 인스턴스 주솟값을 참조하게 된다.

     

    문자열 비교

    String 클래스는 Object 클래스로부터 상속받은 equals() 메서드를 오버라이딩했다. String의 equals() 메서드는 String 인스턴스의 문자열을 비교하여 같으면 true, 다르면 false를 반환한다. 또다른 문자열 비교 메서드는 equalsIgnoreCase() 메서드다. 메서드명과 같이 대소문자 상관 없이 철자만 같은지 비교한다.

     

    문자열 출력

    String 클래스는 Object 클래스로부터 상속받은 toString() 메서드를 오버라이딩했다. toString() 메서드는 참조변수를 출력할 때 자동으로 호출되며 문자열을 반환하도록 재정의하였다.

     

    public class Test {
    	public static void main(String[] args){
        	String str = "test";
            
            // 참조변수로 출력을 시도하면 자동으로 toString() 메서드가 호출된다.
            // Object 클래스의 toString() 메서드를 오버라이딩하여 문자열이 출력되도록 했다.
            System.out.println(str);
            
        }
    }
    
    [실행결과]
    test

     

    문자열 정보

    String의 length() 메서드는 문자열 전체 길이를 반환하고, charAt() 메서드는 인자값으로 전달 받은 인덱스의 문자를 반환한다. "have a good day!" 문자열을 가진 String 인스턴스는 문자열을 내부적으로 char 타입의 배열로 처리한다. 문자열의 위치에 따라서 인덱스가 지정된다. 위의 문자열은 인덱스가 0부터 15까지가 될 것이고 길이는 16이 될 것이다.

     

    문자열 공백

    String의 trim() 메서드는 문자열의 양끝에 있는 공백을 제거한다. isEmpty() 메서드는 문자열의 길이가 0인지 판단한다. 즉, String에 지정된 문자열이 있는지 판단하다. 

     

    문자열 검색

    [프로토타입]

    int indexOf(int ch)

    int indexOf​(int ch, int fromIndex)

    int indexOf(String str)

    int indexOf(String str, int fromIndex)

    int lastIndexOf(int ch)

    int lastIndexOf​(int ch, int fromIndex)

    int lastIndexOf(String str)

    int lastIndexOf(String str, int fromIndex)

     

    indexOf() 메서드와 lastIndexOf() 메서드는 인자로 지정된 문자 또는 문자열이 시작되는 인덱스를 구할 때 사용한다. 두 메서드는 검색의 시작점이 다르다. indexOf()는 문자열이 시작되는 인덱스를 구할 때 사용한다. lastIndexOf() 메서드는 문자열의 끝에서부터 검색한다. 만약 검색할 문자열이 없으면(null 문자열) -1을 반환한다.

     

    [프로토타입]

    boolean startsWith(String prefix)

    boolean startsWith(String prefix, int toffset)

    boolean endsWith(String suffix)

     

    startsWith() endsWith() 메서드는 인자로 전달받은 문자열이 대상 문자열의 시작 부분 또는 끝 부분에 포함되었는 지를 판단할 때 사용한다. 

     

    public class Test{
    	public static void main(String[] args){
        	String address[] = {"경기도 남양주 별내동", "서울시 영등포구 여의동", 
            					"경기도 화성시 병점동", "서울시 동작구 상도동"}
            
            System.out.println("indexOf() 예시");
            
            for(int i=0; i<address.length; i++) {
            	if(address[i].indexOf("서울시") != -1) {
                	System.out.println(address[i]);
                }
            }
            
            System.out.println("lastIndexOf() 예시");
            
            for(int i=0; i<address.length; i++) {
            	if(address[i].lastIndexOf("별내동") != -1) {
                	System.out.println(address[i]);
                }
            }
            
            System.out.println("startsWith() 예시");
            
            for(int i=0; i<address.length; i++) {
            	if(address[i].startsWith("서울시") != -1) {
                	System.out.println(address[i]);
                }
            }
            
            System.out.println("endsWith() 예시");
            
            for(int i=0; i<address.length; i++) {
            	if(address[i].endsWith("병점동") != -1) {
                	System.out.println(address[i];
                }
            }
        }
    }
    
    [실행결과]
    indexOf() 예시
    서울시 영등포구 여의동
    서울시 동작구 상도동
    lastIndexOf() 예시
    경기도 남양주 별내동
    startsWith() 예시
    서울시 영등포구 여의동
    서울시 동작구 상도동
    endsWith() 예시
    경기도 화성시 병점동
    
    

     

    문자열 편집

    String은 '원본변경불가'라는 원칙이 있다. 따라서 문자열을 수정할 때마다 새로운 문자열이 만들어진다. String의 문자열 편집 메서드를 사용해 문자열을 편집한 후 계속 유지하려면 편집한 문자열을 참조변수에 저장해야 한다. 따라서 문자열은 편집 전의 문자열이 메모리에 남아있어서 편집 작업이 많을수록 메모리 낭비를 초래하기도 한다. String 문자열을 편집하는 메서드는 대표적으로 다음과 같다.

     

    [프로토타입]

    String concat(String str)

    String ㅓㅁㅍㅁ(char oldChar, char newChar)

    String replaceAll(String regex, String replacement)

    String replaceFirst(String regex, String replacement)

    String toLowerCase()

    String toUpperCase()

     

    concat() 메서드는 새로운 문자열을 추가한다.

    replace() 메서드는 기존 문자열을 변경한다.

    toLowerCase() 메서드는 대문자를 소문자로,

    toUpperCase() 메서드는 소문자를 대문자로 변경한다.

     

    public class Test {
    
    	public static void main(String[] args) {
    		String s = "Everything in your world is created";
    
    		String s2 = s.concat(" by what you think.");
    
    		System.out.println(s2);
    
    		String s3 = s2.replaceAll("by what you think.", "by your thoughts.");
    
    		System.out.println(s3);
    
    		String s4 = s3.toLowerCase();
    		String s5 = s3.toUpperCase();
    
    		System.out.println(s4);
    		System.out.println(s5);
    
    	}
    
    }
    
    [실행결과]
    Everything in your world is created by what you think.
    Everything in your world is created by your thoughts.
    everything in your world is created by your thoughts.
    EVERYTHING IN YOUR WORLD IS CREATED BY YOUR THOUGHTS.

     

    문자열 추출

    split() 메서드는 인자로 구분자를 지정하면 지정된 구분자로 문자열을 자른 후 String[] 배열로 반환한다. split() 메서드에 인자값을 하나만 지정하면 문자열 전체를 지정된 구분자로 분리하여 String[] 배열로 반환한다. split() 메서드에 인자가 두 개 있을 때, 첫 번째 인자는 분리하는 구분자이고, 두 번째 인자는 분리하는 문자열의 개수이다. 만약 두 번째 인자값에 2를 지정하면 분리되는 전체 문자열 개수는 2개로 한정된다.

     

    subString() 메서드는 문자열에 원하는 문자열 일부분만 추출할 때 사용한다. subString()는 인자값으로 추출할 문자열의 인덱스를 전달하는데, 하나의 인자값만 지정하면 지정된 위치부터 마지막까지 문자열을 추출하여 반환한다. 문자열의 중간 부분을 추출할 땐 시작과 끝 인덱스를 전달한다. 주의 사항은 두 번 째 인자로 전달한 인덱스 바로 앞까지만 추출하므로 +1만큼 더해서 지정해야 한다. 1~5 인덱스의 문자열이 필요하다면, subString(1, 6) 이렇게 호출해야 한다.

     

    [프로토타입]

    String[] split(String regex)

    String[] split(String regex, int limit)

    String subString(int beginIndex)

    String subString(int beginIndex, int endIndex)

     

    public class Test {
    	public static void main(String[] args) {
    		String s = "한국,일본,중국,미국,독일,프랑스";
    
    		String[] list = s.split(",");
    		String[] list2 = s.split(",", 2);
    
    		for (String item : list) {
    			System.out.println(item);
    		}
    		System.out.println("=====================");
    		for (String item : list2) {
    			System.out.println(item);
    		}
    		System.out.println("=====================");
    
    		String email = "test@test.co.kr";
    		int i = email.indexOf("@");
    		String id = email.substring(0, i);
    		String company = email.substring(i + 1);
    		System.out.println(id);
    		System.out.println(company);
    
    	}
    }
    
    [실행결과]
    한국
    일본
    중국
    미국
    독일
    프랑스
    =====================
    한국
    일본,중국,미국,독일,프랑스
    =====================
    test
    test.co.kr

     

    문자열 반환

    데이터 타입은 기본 타입과 참조 타입이 있다. valueOf() 메서드는 이러한 타입의 데이터를 String으로 변환해준다. 자바의 대부분 타입을 인자로 받을 수 있게 오버로딩되어 있고 static으로 선언되어 있어서 String.valueOf() 형태로 사용할 수 있다.

    'IT > 개발(자바, 서블릿, 스프링 등)' 카테고리의 다른 글

    [Java] Math 클래스  (0) 2020.01.18
    [Java] StringBuffer/StringBuilder 클래스  (0) 2020.01.18
    [Java] 자바 기본 API(Object 클래스)  (0) 2020.01.18
    [Java] 자바 API 문서  (0) 2020.01.18
    [Java] interface  (0) 2019.12.10
Designed by Tistory.