본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/9. 기본 API 클래스

7. Java 자바 [API]- String 클래스

String 클래스

문자열 생성, 추출, 비교, 찾기, 분리, 변환 등을 제공하는 메소드를 가지고 있다.

 

 

 

1. String 생성자

 

자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리된다.

 

문자열 리터럴은 String 객체로 자동 생성되지만,

String 클래스의 다양한 생성자를 통해 직접 String 객체를 생성할 수도 있다.

 

String 클래스는 Deprecated(비권장) 된 생성자를 제외하고 약 13개의 생성자를 제공한다.

 

String 객체를 생성할지는 제공되는 매개값의 타입에 달려있다.

 

사용 빈도가 높은 생성자들

 

// 배열 전체를 String 객체로 생성

String str = new String(byte[] bytes);

 

// 지정한 문자셋으로 디코딩

String str = new String(byte[] bytes, String charsetName);

 

// 배열의 offset 인덱스 위치부터 length 만큼 String 객체로 생성

String str = new String(byte[] bytes, int offset, int length);

 

// 지정한 문자셋으로 디코딩

String str = new String(byte[] bytes, int offset, int length, String charsetName);

 

예) 바이트 배열을 문자열로 변환 ByteToStringExample.java

 

public class ByteToStringExample {
    public static void main(String[] args) {
        byte[] bytes = {72, 101, 108, 108, 111, 32, 74, 97, 118, 97};

        String str1 = new String(bytes);
        System.out.println(str1);     // Hello Java

        String str2 = new String(bytes, 6, 4);   // 74번 위치, 4개
        System.out.println(str2);    // Java
    }
}

 

 

2. 키보드로부터 읽은 바이트 배열을 문자열로 변환

 

System.in.read() 메소드는 키보드에서 입력한 내용을 매개값으로 주어진 바이트 배열에 저장하고

읽은 바이트 수를 리턴한다.

 

Hello 입력 후 엔터를 누르면, Hello + 캐리지리턴(\r) + 라인피드(\n) 의 코드 값이 바이트 배열에 저장되고,

바이트 배열에 총 7 개의 바이트를 읽었기 때문에 7이 리턴된다.

 

인덱스

0

1

2

3

4

5

6

H

e

l

l

o

\r

\n

키 코드

72

101

108

108

111

13

10

 

영어는 알파벳 한 글자가 1byte 로 표현되지만,

한글은 2byte로 표현되기 때문에 입력된 문자 수와 읽은 바이트 수가 다를 수 있다.

 

바이트 배열을 문자열로 변환하기 위해 String(byte[] bytes, int offset, int length) 사용한다.

 

배열 길이에서 2를 뺀 이유는 캐리지리턴 + 라인피드는 문자열로 만들 필요가 없기 때문이다.

 

예) KeyboardToStringExample.java : 바이트 배열을 문자열로 변환

 

public class KeyboardToStringExample {
    public static void main(String[] args) throws IOException {
        byte[] bytes = new byte[100];   // 읽은 바이트 저장을 위한 배열 생성

        System.out,print(“입력 : ”);
        int readByteNo = System.in.read(bytes);  // 배열에 읽은 바이트 저장, 읽은 바이트 리턴

        String str = new String(bytes, 0, readByteNo-2); // 배열을 문자열로 변환
        System.out.print(str);
    }
}

 

 

String 클래스의 메소드들


자주 사용되는 메소드들

 

리턴 타입

메소드명(매개 변수)

설명

char

charAt(int index)

특정 위치의 문자 리턴

boolean

equals(Object anObject)

두 문자열을 비교

byte[ ]

getBytes()

byte[ ] 로 리턴

byte[ ]

getBytes(Charset charset)

주어진 문자셋으로 인코딩한 byte[ ] 리턴

int

indexOf(String str)

문자열 내에서 주어진 문자열 위치 리턴

int

length()

총 문자의 수를 리턴

String

replace(CharSequence target, CharSequence replacement)

target 부분을 replacement로 대치한 새로운 문자열 리턴

String

substring(int beginIndex)

beginIndex 위치에서 끝까지 잘라낸 새로운 문자열 리턴

String

subString(int beginIndex int endIndex)

beginIndex 위치에서 endIndex 까지 잘라낸 새로운 문자열 리턴

String

toLowerCase()

알파벳 소문자로 변환한 새로운 문자열 리턴

String

toUpperCase()

알파벳 대문자로 변환한 새로운 문자열 리턴

String

trim()

앞 뒤 공백을 제거한 새로운 문자열 리턴

String

valueOf(int i)

valueOf(double d)

기본 타입값을 문자열로 리턴

 

 


1. 문자 추출 : charAt()

 

매개값으로 주어진 인덱스의 문자를 리턴한다. (인덱스 : 0 ~ 문자열 길이 - 1 까지의 번호)

 

예) StringCharAtExample.java : 주민등록번호로 성별 구분

 

public class StringCharAtExample {
    public static void main(String[] args) {
        String ssn = “010624-1230123”;
        char sex = ssn.charAt(7);
        switch(sex) {
            case ‘1’:
            case ‘3’:
                System.out.println(“남자 입니다.”);
                break;
            case ‘2’:
            case ‘4’:
                System.out.println(“여자 입니다.”);
                break;
        }
    }
}

 

 


2. 문자열 비교 : equals()

 

기본 타입(byte, char, short, int, long, float, double, boolean) 변수의 값을 비교할 때는

== 연산자를 사용한다.

 

하지만 문자열을 비교할 때 == 연산자를 사용한다면 원하지 않는 결과가 나올 수 있다.

 

String strVar1 = new String(“Kephi”);

String strVar2 = “Kephi”;

String strVar3 = “Kephi”;

 

자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어있다.

strVar2 와 strVar3 는 동일한 String 객체를 참조한다.

 

하지만 new 연산자로 생성된 strVar1 은 생성된 다른 String 객체를 참조한다.

 

strVar1 == strVar2; // false 서로 다른 객체

strVar2 == strVar3; // true 서로 같은 객체

 

객체 번지수 값을 비교하기 때문에 strVar1 == strVar2 는 false 가 출력된다.

 

두 String 객체의 문자열만 비교하려면 == 연산자 대신 equals() 메소드를 사용해야 한다.

 

strVar1.equals(strVar2); // true

strVar2.equals(strVar3); // true

 

equals() 는 Object의 번지 비교 메소드이지만, String 클래스가 오버로딩해서 문자열을 비교하도록 변경한다.

 

StringEqualsExample.java : 문자열 비교

 

public class StringEqualsExample {
    public static void main(String[] args) {
        String strVar1 = new String(“Kephi”);
        String strVar2 = “Kephi”;

        if(strVar1 == strVar2) {
            System.out.println(“같은 String 객체를 참조합니다.”);
        } else {
            System.out.println(“다른 String 객체를 참조합니다.”);   // 다른 String 객체 출력
        }

        if(strVar.equals(strVar2)) {
            System.out.println(“같은 문자열을 가짐”);  // 같은 문자열 출력
        } else {
            System.out.println(“다른 문자열을 가짐”);
        }
    }
}        

 

 


3. 바이트 배열로 변환 : getBytes()

 

문자열을 바이트 배열로 변환하는 경우가 있다.

예) 네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 문자열을 바이트 배열로 변환한다.

 

문자열을 바이트 배열로 변환하는 메소드는 두 가지가 있다. (오버로딩 되어 있다.)

 

byte[] bytes = “문자열”.getBytes();

byte[] bytes = “문자열”.getBytes(Charset charset);

 

getBytes() 메소드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열을 리턴한다.

 

만약 특정 문자셋으로 인코딩된 바이트 배열을 얻으려면

두 번째 메소드 getBytes(Charset charset) 를 사용한다.

 

try {

    byte[] bytes = “문자열”.getBytes(“EUC-KR”);

    byte[] bytes = “문자열”.getBytes(“UTF-8”);

} catch(UnsupportedEncodingException e) {

}

 

어떤 문자셋으로 인코딩하느냐에 따라 바이트 배열의 크기가 달라진다.

 

EUC-KR 은 getBytes() 와 마찬가지로 알파벳은 1byte, 한글은 2byte로 변환하고,

UTF-8 은 알파벳은 1byte, 한글은 3byte로 변환한다.

 

getBytes(Charset charset) 메소드는 잘못된 문자셋을 매개 값으로 줄 경우,

java.io.UnsupportedEncodingException 예외가 발생하므로 예외 처리가 필요하다.

 

바이트 배열을 다시 문자열로 변환(디코딩)할 때는

어떤 문자셋으로 인코딩된 바이트 배열인지에 따라 디코딩 방법이 다르다.

 

단순하게 String(byte[] bytes) 생성자를 이용해서 디코딩하면, 시스템의 기본 문자셋을 이용한다.

시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열일 경우,

아래 String 생성자를 이용해서 디코딩해야 한다.

 

String str = new String(byte[] bytes, String CharsetName);

 

예) StringGetBytesExample.java : 바이트 배열로 변환

 

public class StringGetBytesExample {
    public static void main(String[] args) {
        String str = “안녕하세요”;

        // 기본 문자셋으로 인코딩과 디코딩
        byte[] bytes1 = str.getBytes();   // 인코딩
        System.out.println(“byte1.length: ” + bytes1.length);
        String str1 = new String(bytes1);  // 디코딩
        System.out.println(“bytes1 -> String : ” + str1);

        try {
        // EUC-KR 을 이용해서 인코딩 및 디코딩
        byte[] bytes2 = str.getBytes(“EUC-KR”);   // EUC-KR 인코딩
        System.out.println(“byte2.length: ” + bytes2.length);
        String str2 = new String(bytes2, “EUC-KR”);  // 디코딩
        System.out.println(“bytes2 -> String : ” + str2);
        
        // UTF-8 을 이용해서 인코딩 및 디코딩
        byte[] bytes3 = str.getBytes(“UTF-8);   // UTF-8 인코딩
        System.out.println(“byte3.length: ” + bytes3.length);
        String str3 = new String(bytes3, “UTF-8”);  // 디코딩
        System.out.println(“bytes3 -> String : ” + str3);
    } catch(UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

 

 


4. 문자열 찾기 indexOf()

 

매개값으로 주어진 문자열이 시작되는 인덱스를 리턴한다.

만약 주어진 문자열이 포함되어 있지 않으면 –1을 리턴한다.

 

String subject = “자바 프로그래밍”;

int index = subject.indexOf(“프로그래밍”);

 

index 변수에는 3이 저장된다 (“프로그래밍” 문자열의 인덱스 위치가 3이기 때문이다.)

 

0

1

2

3

4

5

6

7

 

 

ndexOf() 메소드는 if 문의 조건식에서 특정 문자열이 포함되어 있는지 여부에 따라

실행 코드를 달리할 때 자주 사용된다. (-1을 리턴하면 특정 문자열이 포함되어 있지 않다.)

 

if(문자열.indexOf(“찾는문자열”) != -1) {

    // 포함되어 있는 경우

} else {

    // 포함되어 있지 않은 경우

}

 

예) StringIndexOfExample.java : 문자열 포함 여부 조사

 

public class StringIndexOfExample {
    public static void main(String[] args) {
        String subject = “자바 프로그래밍”;

        int location = subject.indexOf(“프로그래밍”);
        System.out.println(location);

        if(subject.indexOf(“자바”) != -1) {
            System.out.println(“자바와 관련된 책이군요”);
        } else {
            System.out.println(“자바와 관련 없는 책이군요”);
        }
    }
}

 

 


5. 문자열 길이 length()

 

문자열의 길이(문자의 수)를 리턴 한다.

 

예) StringLengthExample.java : 문자열의 문자 수 얻기

 

public class StringLengthExample {
    public static void main(String[] args) {
        String ssn = “7306241230123”;
        int length = ssn.length();    // 13 저장됨
        if(length == 13) {
            System.out.println(“주민번호 자리수가 맞습니다.”);
        } else {
            System.out.println(“주민번호 자리수가 틀립니다.”);
        }
    }
}

 

 


6. 문자열 대치 replace()

 

첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴한다.

 

String 객체의 문자열은 변경이 불가능한 특성을 가지기 때문에

replace() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아닌, 완전히 새로운 문자열이다.

 

예)StringReplaceExample.java : 문자열 대치하기

 

public class StringReplaceExample {
    public static void main(String[] args) {
        String oldStr = “자바는 객체지향언어 입니다. 자바는 풍부한 API를 지원합니다.”);
        String newStr = oldStr.replace(“자바”, “JAVA”);   // 자바 -> JAVA
        System.out.println(oldStr);
        System.out.println(newStr);
    }
}

 

 


7. 문자열 잘라내기 substring()

 

메소드에 주어진 인덱스에서 문자열을 추출한다. 매개 값의 수에 따라 두 가지 형태로 사용된다.

 

substring(int beginIndex, int endIndex)

주어진 시작과 끝 인덱스 사이의 문자열을 추출한다.

 

substring(int beginIndex)

주어진 인덱스 이후부터 끝까지 문자열을 추출한다.

 

예) StringSubstringExample.java

 

public class StringSubstringExample {
    public static void main(String[] args) {
        String ssn = “880815-1234567”;

        String firstNum = ssn.substring(0, 6);   // 880815
        System.out.println(firstNum);

        String secondNum = ssn.substring(7);     // 1234567
        System.out.println(secondNum);
    }
}

 

 


8. 알파벳 소ㆍ대문자 변경 toLowerCase(), toUpperCase()

 

각각의 메소드는 문자열을 모두 소문자, 대문자로 바꾼 새로운 문자열을 생성한 후 리턴한다.

(원래의 문자열 객체가 수정되지 않고 새로운 문자열이 생성된다.)

 

영어로 된 두 문자열을 대소문자 관계없이 비교할 때 주로 사용된다.

equals() 메소드를 사용하기 전에 사전에 toLowerCase(), toUpperCase() 로 대소문자를 맞추어야 하지만, equalsIsIgnoreCase() 메소드를 사용하면 이 작업이 생략된다.

 

예) StringToLowerUpperCaseExample.java

 

public class StringToLowerUpperCaseExample {
    public static void main(String[] args) {
        String str1 = “Java Programming”;
        String str2 = “JAVA Programming”;

        System.out.println(str1.equals(str2));

        String lowerStr1 = str1.toLowerCase();
        String lowerStr2 = str2.toLowerCase();
        System.out.println(lowerStr1.equals(lowerStr2));

        System.out.println(str1.equalsIgnoreCase(str2));
    }
}

 

 


9. 문자열 앞 뒤 공백 잘라내기 trim()

 

문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴한다.

(원래의 문자열의 공백이 제거되지 않는다.)

 

예) StringTrimExample.java : 앞뒤 공백 제거

 

public class StringTrimExample {
    public static void main(String[] args) {
        String tel1 = “   02”;
        String tel2 = “123   ”;
        String tel3 = “   1234   ”;

        String tel = tel1.trim() + tel2.trim() + tel3.trim();   // 021231234
        System.out.println(tel);
    }
}

 

 


10. 문자열 변환 valueOf()

 

기본 타입의 값을 문자열로 변환하는 기능

String 클래스에는 매개 변수의 타입별로 valueOf() 메소드가 아래와 같이 오버로딩되어 있다.

 

static String valueOf(boolean b)

static String valueOf(char c)

static String valueOf(int i)

static String valueOf(long l)

static String valueOf(double d)

static String valueOf(float f)

 

예) StringValueExample.java : 기본 타입 값을 문자열로 변환

 

public class StringValueOfExample {
    public static void main(String[] args) {
        String str1 = String.valueOf(10);
        String str2 = String.valueOf(10.5);
        String str3 = String.valueOf(true);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }
}