ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Java] String 클래스의 다양하고 유용한 함수(Method)
    Java/개념 정리 2020. 2. 18. 22:20

    오늘은 String 클래스의 다양한 함수에 대한 포스팅입니다. 

     

    오늘 포스팅에 앞서 String 클래스 뿐만아니라 다른 API에 대해 찾아보고 싶으시다면 https://docs.oracle.com/en/java/ 에 들어가시면 됩니다.

     Java 개발자라고 한다면 https://docs.oracle.com/en/java/ 이라는 웹페이지를 아시는 분이 많을 거라고 생각합니다. 이곳에서 다양한 기술 문서들과 예제 및 최신정보를 접할 수 있습니다. https://docs.oracle.com/en/java/에 접속한 후 Java SE documentation을 선택한 뒤 API documentation을 선택하면 Java에서 사용가능한 API 문서를 찾아 볼 수 있습니다. 

     

    오늘 소개하고자하는 String 클래스의 함수는 다음과 같습니다.

     

    문자열의 길이를 반환하는 length()

    문자열을 합칠 수 있는 concat(String str)

    문자열을 비교하는 compareTo(String str)

     

    문자열의 길이를 반환하는 메소드 - length()

    public int length()

    우선 String 클래스를 사용해봤다면 한번쯤은 사용한 경험이 있는 length() 메소드입니다. 이 메소드는 String 인스턴스가 가지고 있는 문자열의 길이를 반환합니다. 그렇기 때문에 반환형은 당연히 integer입니다. 

     length() 메소드를 보다보면 이전에 문득 봤던 size(), length가 생각 날 수 있다. 이것들은 무슨 차이일까? 

    이들의 차이는 매우 간단합니다. length는 배열의 길이를 반환합니다. 그리고 size() 메소드는 Collection 타입의 길이를 반환합니다. 3가지 각기 다른 요소의 길이를 구하는 방식의 사용법은 아래와 같습니다.

    public class Length () {
    	public static void main (String[] args) {
    		
            int[] arr = new int[10];
            System.out.println( arr.length );  // 10을 출력
            
            String str = "StringLength";
            System.out.println( str.length() );  // 12를 출력
            
            ArrayList<Object> col = new ArrayList<Object>();
            System.out.println( col.size() ); // 0을 출력 
        }
    }

     

     

    문자열을 합치는 메소드 - concat(String str)

    public String concat(String str)

    두 문자열을 합치고 싶을 때 사용하는 메소드입니다. 하지만 여기서 "그러면 concat을 통해 String을 합치는건 모순 아닌가?"라는 의문을 가질 수 있습니다. 이전의 포스팅에서 설명했다시피 Java에서 String 인스턴스는 상수로 취급되기 때문에 값을 변경할 수 없기 때문입니다. (Java에서의 String 인스턴스에 대한 상세한 내용은 이전 포스팅에서 확인할 수 있습니다. https://cameldev.tistory.com/2?category=863943)

     하지만 concat()은 하나의 String 인스턴스에 다른 String 인스턴스를 이어 붙이는 것이 아니라, 서로 다른 2개의 문자열을 이어서 새로운 String 인스턴스를 생성하는 것입니다. 즉, 기존의 String 인스턴스를 변경하는 것이 아닌 새로운 String 인스턴스를 생성하는 것이라고 할 수 있습니다. concat(String str)함수의 사용법은 아래와 같습니다. 

    public class StringConcat {
    	public static void main (String[] args) {
        	String str1 = "Camel";
            String str2 = " is ";
            String str3 = "animal";
            
            String str4 = str1.concat(str2).concat(str3);
            System.out.println(str4); // "Camel is animal" 을 출력한다.
        }
    }

     

    앞서 줄줄이 설명했지만 문자열을 합치는 방법은 단순 + 연산으로도 가능합니다. 이러한 +연산이 가능한 이유는 Java 컴파일러가 +연산자를 메소드 호출문으로 변환해주기 때문입니다. 그렇기 때문에 아래와 같은 방식으로도 문자열을 합칠 수 있습니다. 

    public class StringAdd {
    	public static void main (String[] args) {
        	String str1 = "Camel" + "is animal";
            String str2 = "Camel" + 'M';
            String str3 = "Camel" + 183;
            String str4 = 183 + "Camel" + M;
            str4 += '~';
            
            System.out.println(str1); // "Camel is animal" 을 출력한다.
            System.out.println(str2); // "CamelM" 을 출력한다.
            System.out.println(str3); // "Camel183" 을 출력한다.
            System.out.println(str4); // "183CamelM~" 을 출력한다.
        }
    }

    하지만 여기서 아래와 같은 방식의 문자열 결합은 불가능합니다.

    public class StringAdd2 {
    	public static void main (String[] args) {
        	String str1 = "Camel".concat(183);
            String str2 = "Camel".concat('M');
        }
    }

    이유는 간단합니다. char형이나 integer형 데이터를 인자로 받는 concat 메소드가 정의되어 있지 않기 때문입니다. 혹시나 char형이나 integer형 데이터를 인자로 받아 concat 메소드를 사용하고 싶다면 해결방법이 없는 것은 아닙니다. 

    public class StringAdd3 {
    	public static void main (String[] args) {
        	String str1 = "Camel".concat(String.valueOf(183));
            String str2 = "Camel".concat(String.valueOf('M'));
        }
    }

    위와 같이 사용하면 char형이나 integer형 데이터를 인자로 받아 concat 메소드를 사용하는 것이 가능합니다. 또한 String 클래스 내에는 다양한 인자에 대한 valueOf 메소드가 오버로딩되어 있습니다. 이들은 전달되는 인자를 문자열로 변환해서 해당 인스턴스의 참조 값을 반환하는 static 메소드입니다. 

     

    그렇다면 과연 이러한 방식으로 문자열을 합치는 것이 시스템적으로 효과적일까? 라는 의문을 가질 수 있습니다.

    String str = String.valueOf(1).concat("Lemon").concat(String.valueOf(2));

    위의 문장에서는 valueOf 메소드가 두 번호출 되고 concat() 메소드가 두 번 호출됩니다. 이 과정에서 String 인스턴스는 총 5번 생성되게되는데, 고작 두번의 + 연산으로 인해 발생하는 비용으로는 과하다고 생각되기 때문입니다.

    하지만 다행히도 Java 컴파일러의 문자열 결합연산에 대한 Optimization(최적화) 수행으로 인해 문자열의 +연산에서 앞서 걱정한 과다한 비용이 소모되지 않습니다. 최적화 수행 과정에서 StringBuilder 클래스가 사용되면서 아무리 많은 +연산을 하더라도 추가적인 인스턴스의 생성은 2개로 제한되게 됩니다. 

     

    문자열을 비교하는 메소드 - compareTo(String str)

    compareTo 메소드는 비교하고자 하는 String  인스턴스, String 인스턴스의 참조 값을 인자로 받아 두 문자열을 비교합니다. 비교한 결과 두 문자열이 일치하면 0을 반환하고, 일치하지 않는다면 0이 아닌 값을 반환합니다. 일치하지 않을 때 0이 아닌 값을 반환하게 되는데 인자로 전달된 문자열이 사전상에서 앞에 위치한다면 양수를 반환하고, 사전상에서 뒤에 위치한다면 음수를 반환합니다. compareTo 메소드의 사용법 및 불일치시 반환값 비교는 아래와 같습니다.

    public class StringConpare {
    	public static void main (String[] args) {
        	String str1 = "Camel";
            String str2 = "Animal";
            
            if(str1.compareTo(str2) == 0) {
            	System.out.println("str1과 str2이 일치합니다");
            } else if(str1.compareTo(str2) < 0) {
            	System.out.println("str1이 사전상에서 str2보다 앞에 위치합니다");
            } else {
            	System.out.println("str1이 사전상에서 str2보다 뒤에 위치합니다");
            }
        }
    }

     

    댓글

Camel`s Tistory.