[Java] 기본 API 클래스 ④

kiteB·2022년 2월 3일
0

Java

목록 보기
31/35
post-thumbnail

[ String 클래스 ]

1. String 생성자

자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리된다. 소스상에서 문자열 리터럴은 String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String 객체를 생성할 수도 있다. String 클래스는 Deprecated(비권장; 예전 자바 버전에서는 사용되었으나 현재 버전과 차후 버전에서는 사용하지 말라는 뜻)된 생성자를 제외하고 약 13개의 생성자를 제공한다.

어떤 생성자를 이용해서 String 객체를 생성할지는 제공되는 매개값의 타입에 달려 있다. 다음은 사용 빈도수가 높은 생성자들이다.
파일의 내용을 읽거나, 네트워크를 통해 받은 데이터는 보통 byte[] 배열이므로 이것을 문자열로 변환하기 위해 사용된다.

//배열 전체를 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);

에제 | 바이트 배열을 문자열로 변환하는 예제

public class ByteToStrongExample {
    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);
        
        String str2 = new String(bytes, 6, 4);
        System.out.printlnt(str2);
    }
}

실행 결과

Hello Java
Java

2. String 메소드

String은 문자열의 추출, 비교, 찾기, 분리, 변환 등과 같은 다양한 메소드를 가지고 있다. 그중에서 사용 빈도수가 높은 메소드는 다음과 같다.

📌 문자 추출 ( charAt() )

charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다.
만약 해당 문자열의 길이보다 큰 인덱스나 음수를 전달하면, IndexOutOfBoundsException 오류가 발생한다.

String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);

"자바 프로그래밍" 문자열은 다음과 같이 인덱스를 매길 수 있다.

charAt(3)3 인덱스 위치에 있는 문자, 즉 "프" 문자가 해당된다.


📌 문자열 비교 ( equals() )

기본 타입 (byte, char, short, int, long, float, double, boolean) 변수의 값을 비교할 때에는 == 연산자를 사용한다. 그러나 문자열을 비교할 때에는 == 연산자를 사용하면 원하지 않는 결과가 나올 수 있다.

String strVar1 = new String("자바");
String strVar2 = "자바";
String strVar3 = "자바";

자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어 있다. 그래서 strVar2strVar3은 동일한 객체를 참조한다. 그러나 strVar1new 연산자로 생성된 다른 String 객체를 참조한다.

이 경우 변수 strVar1strVar2== 연산은 false를 산출하고 strVar2strVar3== 연산은 true를 산출한다. == 연산자는 각 변수에 저장된 번지를 비교하기 때문에 이러한 결과가 나온다.

strVar1 == strVar2 -> false
strVar2 == strVar3 -> true

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

strVar1.equals(strVar2) -> true
strVar2.equals(strVar3) -> true

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


📌 바이트 배열로 변환 ( getBytes() )

문자열을 바이트 배열로 변환하는 메소드는 다음 두 가지가 있다.

Byte[] bytes = "문자열".getBytes();
Byte[] bytes = "문자열".getBytes(Charset charset);

getBytes() 메소드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열을 리턴한다. 만약 특정 문자셋으로 인코딩된 바이트 배열을 얻으려면 두 번째 메소드를 사용하면 된다.

바이트 배열을 다시 문자열로 변환(디코딩)할 때에는 어떤 문자셋으로 인코딩된 바이트 배열이냐에 따라서 디코딩 방법이 다르다.

  • 단순하게 String(byte[] bytes) 생성자를 이용해서 디코딩하면 시스템의 기본 문자셋을 이용한다.
  • 시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열의 경우 다음 String 생성자를 이용해서 디코딩해야 한다
String str = new String(byte[] bytes, String charsetName);

📌 문자열 찾기 ( indexOf() )

indexOf() 메소드는 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴한다. 만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴한다.

String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");

index 변수에는 3이 저장된다.

indexOf() 메소드는 if문의 조건식에서 특정 문자열이 포함되어 있는지 여부에 따라서 실행 코드를 달리할 때 주로 사용된다.

if(문자열.indexOf("찾는 문자열") != -1) {
    //포함되어 있는 경우
} else {
    //포함되어 있지 않은 경우
}

📌 문자열 길이 ( length() )

length() 메소드는 문자열의 길이(문자의 수)를 리턴한다.

String subject = "자바 프로그래밍";
int length = subject.length();


length 변수에는 8이 저장된다.


📌 문자열 대치 ( replace() )

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

String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "Java");

String 객체의 문자열은 변경이 불가한 특성을 갖기 때문에 replace() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열이다.


📌 문자열 잘라내기 ( substring() )

substring() 메소드는 주어진 인덱스에서 문자열을 추출한다.

substring() 메소드는 매개값의 수에 따라 두 가지 형태로 사용된다.

  • substring(int beginIndex): 주어진 인덱스부터 끝까지 문자열 추출
  • substring(int beginIndex, int endIndex): 주어진 시작과 끝 인덱스 사이의 문자열 추출
String ssn = "880815-1234567";
String firstNum = ssn.substring(0, 6);	//"880815"
String secondNum = ssn.substring(7);	//"1234567"

📌 알파벳 소/대문자 변경 ( toLowerCase(), toUpperCase() )

toLowerCase() 메소드는 문자열을 모두 소문자로 바꾼 새로운 문자열을 생성한 후 리턴한다.
toUpperCase() 메소드는 문자열을 모두 대문자로 바꾼 새로운 문자열을 생성한 후 리턴한다.

String original = "Java Programming";
String lowerCase = original.toLowerCase();	//"java programming"
String upperCase = original.toUpperCase();	//"JAVA PROGRAMMING"

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

trim() 메소드는 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴한다. (중간의 공백은 제거하지 않는다.)

String oldStr = "     자바 프로그래밍     ";
String newStr = oldStr.trim();

trim() 메소드를 사용한다고 해서 원래 문자열의 공백이 제거되는 것은 아니다.


📌 문자열 변환 ( valueOf() )

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)

[ 참고자료 ]

이것이 자바다 책
http://tcpschool.com/java/java_api_string

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글