: 문자열은 java.lang 패키지의
String 클래스의 인스턴스로 관리됨
: 소스상에서 문자열 리터럴은 String 객체로 자동 생성되지만
String 클래스의 다양한 생성자를 이용해서
직접 String 객체를 생성할 수도 있음
: 어떤 생성자를 이용해서 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 lenght);
//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, int offset,
int length, String charsetName)
👩💻 바이트 배열을 문자열로 변환
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);
// String(bytes, 6, 4) 74의 인덱스위치, 4개
String str2 = new String(bytes, 6, 4);
System.out.println(str2);
}
}
💻 결과
Hello Java
Java
- 키보드로부터 읽은 바이트 배열을 문자열로 변환하는 방법
System.in.read() 메소드는
키보드에서 입력한 내용을 매개값으로 주어진 바이트 배열에
저장하고 읽은 바이트 수를 리턴함
ex)
Hello를 입력하고 enter키를 눌렀다면
Hello+캐리지리턴(\r)+라인피드(\n)의
코드값이 바이트 배열에 저장되고
총 7개의 바이트를 읽었기 때문에
7을 리턴함
👩💻 바이트 배열을 문자열로 변환
import java.io.IOException;
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.println(str);
}
}
/*
* String(byte[] bytes, int offset, int length)
* 형태로 바이트 배열을 문자열로 변환하였는데,
* length 매개값으로 배열 길이에서 2를 빼준 이유는
* 캐리지리턴(\r)+라인피트(\n)부분은 문자열로 만들 필요가
* 없기 때문
*/
💻 결과
입력: Hello
Hello
- 문자 추출(charAt())
[ 리턴 타입 = char ]
형태- charAt(int index)
: 특정 위치의 문자를 리턴함
: 매개값으로 주어진 인덱스의 문자를 리턴함
+ 인덱스 : 0에서부터 '문자열 길이-1'까지의 번호
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);
→ charAt(3)은 3번 인덱스 위치에 있는 문자를 뜻함
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;
}
}
}
💻 결과
남자 입니다.
- 문자열 비교(equals())
[ 리턴 타입 = boolean ]
형태- equals(Object anObject)
: 두 문자열을 비교함
: 기본 타입(byte, char, short, int, long, float,double, boolean) 변수의 값을
비교할 때에는== 연산자를 사용함
그러나 문자열을 비교할 때에는
== 연산자를 사용하면 원하지 않는 결과가 나올 수 있음
String strVar1 = new String("홍길동");
String strVar2 = "홍길동";
String strVar3 = "홍길동";
: 문자열 리터럴이 동일하다면
동일한 String 객체를 참조하도록 되어 있음
그래서 strVar2와 strVar3은 동일한 String객체를 참조함
그러나 strVar1은 new 연산자로 생성된
다른 String객체를 참조함
== 연산자는 각 변수에 저장된 번지를 비교하기 떄문에
strVar1 == strVar2 //false
strVar2 == strVar3 //true
결과가 나옴
→ 만약 String 객체의 문자열만 비교하고 싶다면
equals() 메소드를 사용하면 됨
strVar1.equals(strVar2) //true
strVar2.equals(strVar3)
: equalse()는 Object 클래스의 번지 비교 메소드지만,
String 클래스가 재정의해서 문자열을 비교하도록 함
👩💻 문자열 비교
public class StringEqualsExample {
public static void main(String[] args) {
String strVar1 = new String("홍길동");
String strVar2 = "홍길동";
if(strVar1 == strVar2) {
System.out.println("같은 String 객체를 참조");
} else {
System.out.println("다른 String 객체를 참조");
}
if(strVar1.equals(strVar2)) {
System.out.println("같은 문자열을 가짐");
} else {
System.out.println("다른 문자열을 가짐");
}
}
}
💻 결과
다른 String 객체를 참조
같은 문자열을 가짐
- 바이트 배열로 변환(getBytes())
[ 리턴 타입 = byte[] ]
형태- getBytes()
: byte[]로 리턴함
: 문자열을 바이트 배열로 변환하는 경우가 있음
ex)
네트워크로 문자열을 전송하거나,
문자열을 암호화할 때 문자열을 바이트 배열로 변환하는 경우
· 문자열을 바이트 배열로 변환하는 메소드
byte[] bytes = "문자열".getBytes();
byte[] bytes = "문자열".getBytes(Charset charset);
: getBytes() 메소드는 시스템의 기본 문자셋으로
인코딩된 바이트 배열을 리턴함
: 만약 특정 문자셋으로 인코딩된 바이트 배열을 얻으려면
두 번째 메소드를 사용하면 됨
: 어떤 문자셋으로 인코딩하느냐에 따라
바이트 배열의 크기가 달라지는데,
EUC-KR은 getBytes()와 마찬가지로
알파벳은 1바이트, 한글은 2바이트로 변환
UTF-8은 알파벳 1바이트, 한글 3바이트로 변환
: getBytes(Charset charset) 메소드는 잘못된 문자셋을
매개값으로 줄 경우,
java.io.UnsupportedEncodeingException이 발생하므로 예외처리가 필요
: 바이트 배열을 다시 문자열로 변환(디코딩)할 때에는
어떤 문자셋으로 인코딩된 바이트 배열이냐에 따라서
디코딩 방법이 다름.
단순하게 String(byte[] bytes) 생성자를 이용해서
디코딩하면 시스템의 기본 문자셋을 이용함
시스템 기본 문자셋과 다른 문자셋으로 인코딩된
바이트 배열일 경우
String str = new String(byte[] bytes, String charsetName);
String 생성자를 이용해서 디코딩해야함
👩💻 바이트 배열로 변환
import java.io.UnsupportedEncodingException;
/*
* 문자열을 바이트 배열로 인코딩하고 길이 출력,
* 다시 String 생성자를 이용해서 문자열로 디코딩하기
*/
public class StringGetBytesExample {
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 {
//EUC-KR을 이용해서 인코딩 및 디코딩
byte[] bytes2 = str.getBytes("EUC-KR");
System.out.println("bytes2.length: " +
bytes2.length);
String str2 = new String(bytes2, "EUC-kR");
System.out.println("bytes2->String: " +
str2);
//UTF-8을 이용해서 인코딩 및 디코딩
byte[] bytes3 = str.getBytes("UTF-8");
System.out.println("bytes3.length: " +
bytes3.length);
String str3 = new String(bytes3, "UTF-8");
System.out.println("bytes3->String: " +
str3);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
💻 결과
bytes1.length: 15
bytes1->String: 안녕하세요
bytes2.length: 10
bytes2->String: 안녕하세요
bytes3.length: 15
bytes3->String: 안녕하세요
- 문자열 찾기(indexOf())
[ 리턴 타입 =int ]
형태- indexOf(String str)
: 문자열 내에서 주어진 문자열의 위치를 리턴함
: 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴
만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴함
String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");
→ index변수에는 3이 저장되는데
"자바 프로그래밍"에서
"프로그래밍" 문자열의 인덱스 위치가 3이기 때문
: indexOf() 메소드는 if문의 조건식에서 특정 문자열이
포함되어 있는지 여부에 따라 실행 코드를 달리할 때 자주 사용됨
-1 값을 리턴하면 특정 문자열이 포함되어 있지 않다는 뜻
if( 문자열.indexOf("찾는문자열") != -1 ) {
//포함되어 있는 경우
} else {
//포함되어 있지 않은 경우
}
👩💻 문자열 포함 여부 조사
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("자바와 관련없는 책이군요");
}
}
}
💻 결과
3
자바와 관련된 책이군요
- 문자열 길이(length())
[ 리턴 타입 =int ]
형태- length()
: 문자열 내에서 주어진 문자열의 위치를 리턴함
: 문자열의 길이(문자의 수)를 리턴
String subject = "자바 프로그래밍";
int length = subject.length();
legnth변수에는 8이 저장됨
공백을 포함해서 8개이기 때문
👩💻 문자열의 문자 수 얻기
public class StringLengthExample {
public static void main(String[] args) {
String ssn = "7306241230123";
int length = ssn.length();
if(length == 13) {
System.out.println("주민번호 자리수가 맞습니다.");
} else {
System.out.println("주민번호 자리수가 틀립니다.");
}
}
}
💻 결과
주민번호 자리수가 맞습니다.
- 문자열 대치(replace())
[ 리턴 타입 = String ]
형태- replace(CharSequence target, CharSequence replacement)
: target 부분을 replacement로 대치한 새로운 문자열을 리턴
: 첫 번째 매개값인 문자열을 찾아
두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");
: String 객체의 문자열은 변경이 불가능한 특성을 갖기 때문에
replace() 메소드가 리턴하는 문자열은
원래 문자열의 수정본이 아니라 완전히 새로운 문자열임
👩💻 문자열 대치하기
public class StringReplaceExample {
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를 지원합니다.
- 문자열 잘라내기(substring())
[ 리턴 타입 = String ]
형태- substring(int beginIndex, int endIndex)
: beginIndex 위치에서
endIndex 전까지 잘라낸 새로운 문자열을 리턴함
: 주어진 인덱스에서 문자열을 추출함
substring(int beginIndex, int endInedx)
는 주어진 시작과 끝 인덱스 사이의 문자열을 추출
substring(int beginIndex)
는 주어진 인덱스부터 끝까지 문자열을 추출
String ssn = "880815-1234567";
String firstNum = ssn.substring(0, 6);
String secondNum = ssn.substring(7);
firstNum 변수값은 "880815"
secondNum 변수값은 "1234567"
ssn.substring(0.6)은
인덱스 0(포함) ~ 6(제외) 문자열을 추출
substring(7)은
인덱스 7부터 끝까지 문자열을 추출
👩💻 문자열 추출하기
public class StringSubstringExample {
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
- 알파벳 소·대문자 변경(toLowerCase(), toUpperCase())
[ 리턴 타입 = String ]
형태- toLowerCase()
: 알파벳 소문자로 변환한 새로운 문자열을 리턴
형태- toUpperCase()
: 알파벳 대문자로 변환한 새로운 문자열을 리턴
toLowerCase() 메소드는
문자열을 모두 소문자로 바꾼
새로운 문자열을 생성한 후 리턴함
toUpperCase() 메소드는
문자열을 모두 대문자로 바꾼
새로운 문자열을 생성한 후 리턴함
String original = "Java Programming";
String lowerCase = original.toLowerCase();
String upperCase = original.toUpperCase();
: lowerCase 변수는 새로 생성된 "java programming" 문자열을 참조하고
upperCase 변수는 새로 생성된 "JAVA PROGRMMING" 문자열을 참조함
: 문자열이 변경된 것은 아님
: 영어로 된 두 문자열을 대소문자와 관계없이
비교할때 주로 이용됨
: equals() 메소드를 사용하려면 사전에
toLowerCase()와 toUpperCase()로 대소문자를 맞춰야 하지만,
equalsIgnoreCase() 메소드를 사용하면
이 작업이 생략됨
👩💻 전부 소문자 또는 대문자 변경
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));
}
}
💻 결과
false
true
true
- 문자열 암뒤 공백 잘라내기(trim())
[ 리턴 타입 = String ]
형태- trim()
: 앞뒤 공백을 제거한 새로운 문자열을 리턴
: 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴함
String oldStr = " 자바 프로그래밍 ";
String newStr = oldStr.trim();
:newStr 변수는 앞뒤 공백이 제거된
새로 생성된 "자바 프로그래밍" 문자열을 참조함
: 원래 문자열의 공백이 제거되는 것은 아님
👩💻 문자열 앞뒤 공백 제거
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();
System.out.println(tel);
}
}
💻 결과
021231234
- 문자열 변환(valueOf())
[ 리턴 타입 = String ]
형태- valueOf(int i) / valueOf(double d)
: 기본 타입 값을 문자열로 리턴
: 기본 타입의 값을 문자열로 변환하는 기능
· 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)
👩💻 기본 타입 값을 문자열로 변환
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);
}
}
💻 결과
10
10.5
true