티스토리 뷰

주의 사항!

  • 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.


어떤 프로그램이든 문자열은 데이터로서 아주 많이 사용됩니다. 그렇기 때문에 문자열을 생성하는 방법과 추출, 비교, 찾기, 분리, 변환 등을 제공하는 메서드를 잘 익혀두어야 합니다.

 

1. String 생성자

자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리됩니다. 소스상에서 문자열 리터럴은 String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String 객체를 생성할 수도 있습니다. String 클래스는 Deprecated(권장하지 않는) 생성자를 제외하고 약 13개의 생성자를 제공합니다. Deprecated는 예전 자바 버전에서는 사용되었으나, 현재 버전과 차후 버전에서는 사용하지 말라는 뜻입니다. 어떤 생성자를 이용해서 String 객체를 생성할지는 매개 값의 타입에 달려 있습니다. 다음은 사용 빈도수가 높은 생성자들입니다. 파일의 내용을 읽거나, 네트워크를 통해 받은 데이터는 보통 byte [] 배열이므로 이것을 문자열로 변환하기 위해 사용됩니다.

//배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);
//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, Stirng charsetName);

//배열의 offset 인덱스 위치부터 length만큼 객체로 생성
String str = new String(byte[] bytes, int offset, int length);
//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, int offset, int lenth, String charsetName);

다음은 바이트 배열을 문자열로 변환하는 예제입니다.

//Main.java
package Example;

public class Main {
	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.println(str2);
	}
}

/*
실행결과

Hello Java
Java

*/

다음 예제는 키보드로부터 읽은 바이트 배열을 문자열로 변환하는 방법을 보여줍니다. System.in.read() 메서드는 키보드에서 입력한 내용을 매개 값으로 주어진 바이트 배열에 저장하고 읽은 바이트 수를 리턴합니다. 예를 들어 Hello를 입력하고 엔터를 눌렀다면 Hello+캐리지 리턴(\r)+라인피드(\n)의 코드 값이 바이트 배열에 저장되고 총 7개의 바이트를 읽었기 때문에 7을 리턴합니다.

 

영어는 알파벳 한 자가 1바이트로 표현되지만, 한글과 기타 다른 나라의 언어는 2바이트로 표현되기 때문에 입력된 문자 수와 읽은 바이트 수가 다를 수 있습니다. 바이트 배열을 문자열로 변환하기 위해 다음 예제는 String(byte [] bytes, int offset, int length)를 사용했는데, length 매개 값으로 배열 길이에서 2를 빼준 이유는 캐리지 리턴(\r)+라인피드(\n) 부분은 문자열로 만들 필요가 없기 때문입니다.

//Main.java
package Example;

import java.io.IOException;

public class Main {
	public static void main(String[] args) {
		byte[] bytes = new byte[10];
		
		System.out.print("입력 : ");
		try {
			int readByteNum = System.in.read(bytes);
			String str = new String(bytes, 0, readByteNum - 2);
			System.out.println(str);
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}

/*
실행결과

입력 : Hello 
Hello 

*/

 

2. String 메서드

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

리턴 타입 메서드(매개 변수) 설명
char charAr(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 위치에서 끝까지 잘라낸 새로운 문자열을 리턴
Stirng substring(int beginIndex, int endIndex) beginIndex 위치에서 endIndex 전까지 잘라낸 새로운 문자열을 리턴
String toLowerCase() 알파벳 소문자로 변환한 새로운 문자열을 리턴
String toUpperCase() 알파벳 대문자로 변환한 새로운 문자열을 리턴
String trim() 앞뒤 공백을 제거한 새로문 문자열을 리턴
String valueOf(int i)
valueOf(double d)
기본 타입값을 문자열로 리턴

 

2. 1. 문자 추출 : charAt()

charAt() 메서드는 매개 값으로 주어진 인덱스의 문자를 리턴합니다.

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

다음 에제는 주민등록번호에서 인덱스 7번 문자를 읽어 남자와 여자를 구별합니다.

//Main.java
package Example;

public class Main {
	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. 2. 문자열 비교 : equals()

기본 타입 변수의 값을 비교할 때는 ==연산자를 사용합니다. 그러나 문자열을 비교할 때 ==연산자를 사용하면 원하지 않는 결과가 나올 수 있습니다.

//Main.java
package Example;

public class Main {
	public static void main(String[] args) {
		String str1 = "KOEY";
		String str2 = "KOEY";
		String str3 = new String("KOEY");
		
		System.out.println(str1 == str2);
		System.out.println(str1 == str3);
	}
}

/*
실행결과

true
false

*/

객체를 대상으로 ==연산자를 사용하게 되면 객체의 주소를 비교하게 됩니다. 문자열도 객체이므로 문자열의 데이터를 비교하기 위해서는 equals() 메서드를 사용해야 합니다. 사실 equals()는 Object의 주소 비교 메서드지만, String 클래스가 오버 라이딩해서 문자열을 비교하도록 변경했습니다.

//Main.java
package Example;

public class Main {
	public static void main(String[] args) {
		String str1 = new String("KOEY");
		String str2 = "KOEY";
		
		if(str1 == str2) {
			System.out.println("같은 String 객체를 참조");
		} else {
			System.out.println("다른 String 객체를 참조");
		}
		
		if(str1.equals(str2)) {
			System.out.println("같은 문자열을 가짐");
		} else {
			System.out.println("다른 문자열을 가짐");			
		}
	}
}

/*
실행결과

다른 String 객체를 참조
같은 문자열을 가짐

*/

 

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

종종 문자열을 바이트 배열로 변환하는 경우가 있습니다. 대표적인 예로 네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 문자열을 바이트 배열로 변환합니다. 문자열을 바이트 배열로 변환하는 메서드는 다음 두 가지가 있습니다.

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

getBytes() 메서드는 시스템의 기본 문자셋으로 인코딩 된 바이트 배열을 리턴합니다. 만약 특정 문자셋으로 인코딩 된 바이트 배열을 얻으려면 두 번째 메서드를 사용하면 됩니다. 다음은 EUC-KR과 UTF-8로 각각 인코딩 된 바이트 배열을 리턴합니다.

try {
	byte[] bytes = "문자열".getBytes("EUC_KR");
	byte[] bytes = "문자열".getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
}

어떤 문자셋으로 인코딩하느냐에 따라 바이트 배열의 크기가 달라집니다. EUC-KR은 getBytes()와 마찬가지로 알파벳은 1바이트, 한글은 2바이트로 변환하고, UTF-8은 알파벳은 1바이트, 한글은 3바이트로 변환합니다. 

 

getBytes(Charset charset) 메서드는 잘못된 문자셋을 매개 값으로 줄 경우, java.io.UnsupportedEncodingException 예외가 발생하므로 예외 처리가 필요합니다.

 

바이트 배열을 다시 문자열로 변환(디코딩)할 때는 어떤 문자셋으로 인코딩 된 바이트 배열이냐에 따라서 디코딩 방법이 다릅니다. 단순하게 String(byte [] bytes) 생성자를 이용해서 디코딩하면 시스템의 기본 문자셋을 이용합니다. 시스템 기본 문자셋과 다른 문자셋으로 인코딩 된 바이트 배열일 경우 다음 String 생성자를 이용해서 디코딩해야 합니다.

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

다음 예제에서는 문자열을 바이트 배열로 인코딩하고 길이를 출력해 보았습니다. 그리고 다시 String 생성자를 이용해서 문자열로 디코딩했습니다.

//Main.java
package Example;

import java.io.UnsupportedEncodingException;

public class Main {
	public static void main(String[] args) {
		String str = "안녕하세요";
		
		byte[] bytes1 = str.getBytes();
		System.out.println("bytes1.length : " + bytes1.length);
		String str1 = new String(bytes1);
		System.out.println("bytes1 -> String : " + str1);
		
		try {
			byte[] bytes2 = str.getBytes("EUC_KR");
			System.out.println("bytes2.lenth : " + bytes2.length);
			String str2 = new String(bytes2, "EUC-KR");
			System.out.println("bytes2 -> String : " + str2);
			
			byte[] bytes3 = str.getBytes("UTF-8");
			System.out.println("bytes3.lenth : " + bytes3.length);
			String str3 = new String(bytes3, "UTF-8");
			System.out.println("bytes3 -> String : " + str3);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

/*
실행결과

bytes1.length : 10
bytes1 -> String : 안녕하세요
bytes2.lenth : 10
bytes2 -> String : 안녕하세요
bytes3.lenth : 15
bytes3 -> String : 안녕하세요

*/

 

2. 4. 문자열 길이 : length()

length() 메서드는 문자열의 길이를 리턴합니다.

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

length 변수에는 8이 저장됩니다.

//Main.java
package Example;

public class Main {
	public static void main(String[] args) {
		String ssn = "7306241230123";
		int length = ssn.length();
		
		if(length == 13) {
			System.out.println("주민번호 자리수가 맞습니다.");
		}
		else {
			System.out.println("주민번호 자리수가 맞지 않습니다.");
		}
	}
}

/*
실행결과

주민번호 자리수가 맞습니다.

*/

 

2. 5. 문자열 대치 : replace()

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

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

String 객체의 문자열은 변경이 불가능한 특성을 갖기 때문에 replace() 메서드가 리턴하는 문자열을 원래 문자열의 수정본이 아니라 완전히 새로운 문자열입니다. 따라서 newStr 변수는 다음 그림과 같이 새로 생성된 "JAVA 프로그래밍" 문자열을 참조합니다.

//Main.java
package Example;

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

/*
실행결과

자바는 객체지향언어입니다. 자바는 풍부한 API를 지원합니다.
JAVA는 객체지향언어입니다. JAVA는 풍부한 API를 지원합니다.

*/

 

2. 6. 문자열 잘라내기 : substring()

substring() 메서드는 매개 값의 수에 따라 두 가지 형태로 사용됩니다. substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열을 추출하고, substring(int beginIndex)는 주어진 인덱스부터 끝까지 문자열을 추출합니다.

//Main.java
package Example;

public class Main {
	public static void main(String[] args) {
		String ssn = "880815-1234567";
		
		String firstNum = ssn.substring(0, 6);
		System.out.println(firstNum);
		
		String secondNum = ssn.substring(7);
		System.out.println(secondNum);
	}
}

/*
실행결과

880815
1234567

*/

 

2. 7. 알파벳 소/대문자 변경 : toLowerCase(), toUpperCase()

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

 

다음 예제에서는 두 문자열이 대소문자가 다를 경우 어떻게 비교하는지를 보여줍니다. equals() 메서드를 사용하려면 사전에 toLowerCase()와 toUpperCase()로 대소문자를 맞추어야 하지만, equalsIgnoreCase() 메서드를 사용하면 이 작업이 생략됩니다.

//Main.java
package Example;

public class Main {
	public static void main(String[] args) {
		String str1 = "Java Programing 공부 일지";
		String str2 = "JAVA Programing 공부 일지";
		
		System.out.println(str1.equals(str2));
		
		String lowerStr1 = str1.toLowerCase();
		String lowerStr2 = str2.toLowerCase();
		
		System.out.println(lowerStr2);
		
		System.out.println(lowerStr1.equals(lowerStr2));
		
		System.out.println(str1.equalsIgnoreCase(str2));
	}
}

/*
실행결과

false
java programing 공부 일지
true
true

*/

 

2. 8. 문자열 앞뒤 공백 잘라내기 : trim()

trim() 메서드는 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴합니다. 단, 앞뒤의 공백만 제거할 뿐 중간의 공백은 제거하지 않습니다.

//Main.java
package Example;

public class Main {
	public static void main(String[] args) {
		String tel1 = "  02";
		String tel2 = "123   ";
		String tel3 = "   12 34   ";
		
		String tel4 = tel1 + tel2 + tel3;
		System.out.println(tel4);
		
		String tel5 = tel1.trim() + tel2.trim() + tel3.trim();
		System.out.println(tel5);
	}
}

/*
실행결과

  02123      12 34   
0212312 34

*/

 

2. 9. 문자열 변환 : 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(float f)
static String valueOf(double d)
//Main.java
package Example;

public class Main {
	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);
	}
}

/*
실행결과

10
10.5
true

*/

 

'공부 일지 > JAVA 공부 일지' 카테고리의 다른 글

자바, StringBuffer, StringBuilder 클래스  (0) 2021.04.21
자바, StringTokenizer 클래스  (0) 2021.04.21
자바, Class 클래스  (0) 2021.04.20
자바, System 클래스  (0) 2021.04.20
자바, Objects 클래스  (0) 2021.04.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함