본문 바로가기

Java/Chapter 11. 메소드 오버로딩과 String 클래스

[Java] 11.03 - String 클래스의 메소드(1)

들어가며

 String 클래스에는 문자열
처리에 부족함이 없을 정도로

 많은 메소드가 정의되어 있다.

 그리고 대부분의 메소드들이
사용하는데 어려움이 없다.

 

자바 문자를 참고해야 한다.

 이어서 String 클래스에서 주로
사용하는 기본적인 메소드들을
소개할 예정이다.

 그러나 어떠한 책에서도 String
클래스의 모든 메소드를 소개하지는
않는다.

 그리고 자바의 모든 클래스를
설명한다는 것은 더더욱 불가능한
일이다.

 때문에 자바 사용자들은 JDK
문서를 참고하는 습관을
들여야 한다.

 지금까지 한 번도 JDK 문서를
참고하지 않았다면 지금을
기회로 삼자.

 본서에서 설명하는 String
클래스의 메소드들을

 문서를 통해서 다시 한번
확인하자.


 

 조금 더 조언하자면, 저자도
90년대 후반에

 자바의 기본 문법은 책을
통해서 익혔다.

 그러나 이를 제외한 나머지는
JDK 문서를 통해 학습하였다.

 자바를 잘 다루는 개발자와
그렇지 못한 개발자의 차이점은
문법의 이해 수준에 있지 않다.

 문법의 이해도는 대부분 높은
편이다.

 그러나 문서를 참고하는 수준
에서는 차이를 보인다.

 따라서 자바 개발자가 되고
싶다면 문서를 자주 참고해야
한다.

 JDK 문서를 보는 방법은 별도의
설명이 필요하지 않다.

 이 문서는 화려하지 않지만 잘
구성되어 있어서

 원하는 내용을 쉽게 찾을 수
있다.

 그럼 간단히 String 클래스에
대한 정보를 찾아보자.

 이를 위해 먼저 JDK 문서를 열자.

그림 52 - 자바 JDK 문서(14 기준)

 그리고 검색창에 'all classes'라고
치면 다음으로 이동한다.

그림 53 - All Classes로 이동

 다음은 String 클래스를
선택했을 때의 내용이다.

그림 54 - API 문서의 String 클래스

 위의 상태에서 페이지를 아래로
내리면

 String 클래스의 생성자, 클래스
메소드, 인스턴스메소드를 구분하여
볼 수 있다.

 

문자열 연결시키기 : Concatenating

 String 클래스의 다음 메소드를
이용하면

 두 문자열을 연결시킨 문자열을
결과로 얻을 수 있다.

public String concat(String str)

 이 메소드의 사용 방법은
다음과 같다.

String1.concat(String2);    // String1과 String2를 연결한 결과를 반환

 위와 같이 메소드가 호출되면
String1과 String2가 갖는
문자열을 연결한

 새로운 문자열이 만들어진다.

 물론 새로운 문자열은 String
인스턴스의 형태로 만들어지고

 이렇게 만들어진 인스턴스의
참조 값이 반환된다.

class StringConcat{
    public static void main(String[] args){
        String str1 = "Red";
        String str2 = "Potion";

        String str3 = str1.concat(str2);
        System.out.println(str3);

        String str4 = "Drink".concat(str3);
        System.out.println(str4);
    }
}

/*
실행 결과
RedPotion
DrinkRedPotion
*/

 위의 예제에서 다음과 같이
메소드 호출이 가능한 이유는
전에 한번 설명하였다.

String str4 = "Drink".concat(str3);

 큰따옴표를 이용한 문자열의
표현은 String 인스턴스의
생성으로 이어지고,

 이 문자열의 위치에, 생성된
인스턴스의 참조 값이
반환된다.

 따라서 위와 같은 형태의
문장 구성이 가능하다.

 

문자열의 일부를 추출하기 : Substring

 String 클래스의 다음 메소드를
이용하면

 문자열의 뒷부분을 별도의
문자열로 추출할 수 있다.

public String substring(int beginIndex)    // beginIndex ~ 끝까지 추출

 이 메소드의 사용 방법은
다음과 같다.

String str = "abcdefg";
str.substring(2);    // 인덱스 2 이후의 내용으로 이뤄진 문자열 "cdefg" 반환

 메소드 substing의 인자로
전달되는 숫자는

 문자열의 '인덱스 값'이다.

 그리고 참조변수 str이
참조하는 문자열의

 문자별 인덱스 값은 다음과
같다.

인덱스 값은 맨 앞에서 얼마나 떨어졌는지를 나타내는 값이다. 그래서 맨 앞 문자의 인덱스 값은 0이다.

그림 55 - 인덱스 값

 따라서 위의 메소드 호출을
통해 문자열 "cdefg"가 담긴
인스턴스가 생성되고,

 이 인스턴스의 참조 값이
반환된다.

 그리고 substring 메소드는
오버로딩 되어 있다.

 즉 다음과 같이 두 개의
인자를 전달받는 메소드가
정의되어 있으며,

 이 메소드를 호출하여 문자열의
중간 부분을 추출할 수 있다.

public String substring(int beginIndex, int endIndex)    // beginIndex ~ endIndex 사이 추출

 이 메소드의 사용 방법은
다음과 같다.

String str = "abcdefg";
str.substring(2, 4);    // 인덱스 2 ~ 3에 위치한 내용의 문자열 반환

 위의 메소드 호출을 통해서
얻게 되는 문자열은 "cd"이다.

 여기서 주의할 점은 두 번째
인자로 전달된,

 인덱스 4에 위치한 문자는
반환되는 문자열에 포함이
안 된다는 점이다.

class SubString{
    public static void main(String[] args){
        String str1 = "abcdefg";
        String str2 = str1.substring(2);
        System.out.println(str2);

        String str3 = str1.substring(2, 4);
        System.out.println(str3);
    }
}

/*
실행 결과
cdefg
cd
*/

 

문자열의 내용 비교 : comparing

 String 클래스의 다음 메소드를
이용하면

 2개의 String 인스턴스가 지니는
문자열의 내용을 비교할 수 있다.

public boolean equals(Object anObject)

 이 메소드의 사용 방법은
다음과 같다.

 그리고 메소드 equals의
호출 결과는

 두 인스턴스가 지니는 문자
열이 같으면 true,

 다르면 false를 반환한다.

메소드의 매개변수 선언이 Object형으로 되어 있지만 String 인스턴스의 참조 값을 전달할 수 있다.
이유는 상속을 공부하면서 알게 된다.
String str = "My House";
boolean isSame = str.equals("My House");

 두 문자열의 내용 비교를
'사전 편찬 순서'를 기준으로,

 조금 더 구체적으로 진행하고
싶다면 다음 메소드의 호출을
고려할 수 있다.

public int compareTo(String anotherString)

 이 메소드는 두 문자열의 '사전
편찬 상' 순서를 비교한다.

Lexicographically: 사전적으로

 즉 비교 결과에 따른 반환
값은 다음과 같다.

여기서 말하는 '앞서다'와 '뒤서다'는 사전 편찬 상 순서를 의미한다.
사전의 뒷편에 위치하면 '뒤서다'라고 표현한다.
  • 두 문자열의 내용이 일치하면 0을 반환
        →    str1.compareTo(str2) 에서 str1과 str2의 문자열 내용이 일치하는 상황
  • 호출된 인스턴스의 문자열이 인자로 전달된 문자열보다 앞서면 0보다 작은 값 반환
        →    str1.compareTo(str2) 에서 str1의 문자열이 앞서는 경우
  • 호출된 인스턴스의 문자열이 인자로 전달된 문자열보다 뒤서면 0보다 큰 값 반환
        →    str1.compareTo(str2) 에서 str1의 문자열이 뒤서는 경우

 위의 내용에서 0보다 큰 값은
1이 될 수도 있고 99가 될 수도
있다.

 JDK 문서에서 이 값이 정확히
얼마가 되어야 한다고는 언급하지
않고 있다.

 따라서 코드를 작성할 때에도,

 인자로 전달된 문자열이 사전
편찬 순서상 뒤에 위치하면

 '0보다 큰 값'이 반환된다는
사실에 근거하여 코드를
작성해야 한다.

 그리고 compareTo 메소드와
유사한 다음 메소드도 존재한다.

public in compareToIgnoreCase(String str)

 메소드의 이름이 의미하듯이,

 문자열 비교에 있어서 대소를
구분하지 않는다.

 사전 편찬 수서상 대문자는
소문자보다 앞에 위치한다.

 그러나 이 메소드는 이러한
부분을 고려하지 않는다.

 이러한 부분을 제외하면
메소드의 기능 및 반환 값은
compareTo와 동일하다.

class CompString{
    public static void main(String[] args){
        String str1 = "Lexicographically";
        String str2 = "lexicographically";
        int cmp;

        // 단순 비교
        if (str1.equals(str2))
            System.out.println("두 문자열은 같습니다.");
        else
            System.out.println("두 문자열은 다릅니다.");

        cmp = str1.compareTo(str2);

        // 사전 편찬 상의 비교
        if (cmp == 0)
            System.out.println("두 문자열은 일치합니다.");
        else if (cmp < 0)
            System.out.println("사전의 앞에 위치하는 문자: " + str1);
        else
            System.out.println("사전에 앞에 위치하는 문자: " + str2);

        // 사전 편찬 상 + 대소문자 무시 비교
        if (str1.compareToIgnoreCase(str2) == 0)
            System.out.println("두 문자열은 같습니다.");
        else
            System.out.println("두 문자열은 다릅니다.");
    }
}

/*
실행 결과
두 문자열은 다릅니다.
사전의 앞에 위치하는 문자: Lexicographically
두 문자열은 같습니다.
*/

 

기본 자료형의 값을 문자열로 바꾸기

 String 클래스에 정의되어 있는
다음 메소드들을 호출하면

 기본 자료형의 값을 문자열로
바꿀 수 있다.

static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(double d)
static String valueOf(float f)
static String valueOf(int i)
static String valueOf(long l)

 이 메소드의 사용 방법은
다음과 같다.

 클래스 메소드이므로 사용
방법도 간단하다.

double e = 2.718281;
String se = String.valueOf(e);

 문자열은 사람에게 정보를
전달하는 가장 기본적인
수단이므로,

 기본 자료형의 값을 문자열의
형태로 나타내야 하는 경우가
종종 등장한다.

 

문자열을 대상으로 하는 + 연산과 += 연산

 지금까지 예제를 작성하면서
다음과 같은 형태로

 빈번히 문자열을 연결하여
출력하였다.

System.out.println("Red" + "Potion");    // 문자열 + 문자열

 이렇듯 문자열 대상의 + 연산이
가능한 이유는

 컴파일러에 의해서 + 연산이
다음과 같이 concat 메소드의
호출로 바뀌기 때문이다.

System.out.println("Red".concat("Potion"));

 때문에 + 연산은 어디서든
쓸 수 있다.

 다음과 같이 쓸 수도 있다.

String str = "Red" + "Potion";

 뿐만 아니라 다음과 같이
+= 연산도 가능하다.

String str = "Red";
str += "Potion";    // str = str + "Potion"

 그런데 우리는 다음과 같이

 문자열과 기본 자료형의 값을
대상으로도 + 연산을 한 바 있다.

System.out.println("STR: " + 17);

  이것이 가능하다는 것은
다음과 같은 문장 구성도
가능하다는 의미이다.

 물론 실제로 가능하다.

String str = "STR: " + 17;

 그렇다면 위의 문장도
다음과 같이 처리가 될까?

String str = "STR: ".concat(17);    // 컴파일 오류 발생

 어림도 없다.

 위의 문장을 컴파일 하면
오류가 발생한다.

 concat 메소드는 String
인스턴스의 참조 값을
인자로 요구하기 때문이다.

 따라서 위의 문장을 대신해
다음과 같이 처리가 된다.

String str = "STR: ".concat(String.valueOf(17));

 이로써 String.valueOf 메소드가
유용하게 사용되는 상황 하나를
접하였다.

 비록 우리가 직접 호출하는
상황은 아니지만

 이것이 valueOf 메소드 사용의
힌트가 될 수 있다.


참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기