문자열은 데이터로서 아주 많이 사용
문자열을 생성, 추출 비교, 찾기, 분리, 변환 을 제공하는 메소드를 잘 익혀두어야함
String 생성자
java 문자열은 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, 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 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 str2 = new String(bytes, 6 , 4 );
System.out.println(str2);
}
}
키보드로부터 읽은 바이트 배열을 문자열로 변환 방법
System.in.read() 메소드는 키보드에서 입력한 내용을 매개값으로 주어진 바이트 배열에 저장
잃은 바이트 수를 리턴
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 메소드
String 문자열 추출, 비교 찾기 ,분리 ,변환 등과 같은 다양한 메소드를 가지고 있다
리턴 타입 | 메소드명(매개 변수) | 설명 |
char | charAt(int index) | 특정 위치의 문자 리턴 |
boolean | equals(Object andObject) | 두 문자열을 비교 |
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, intend index) | beginindex 위치에서 endindex 전까지 잘라낸 새로운 문자열을 리턴 |
String | toLowerCase() | 알파벳 소문자로 변환한 새로운 문자열을 리턴 |
String | toUpperCase() | 알파벳 대문자로 변환한 새로운 문자열을 리턴 |
String | trim() | 앞뒤 공백을 제거한 새로운 문자열을 리턴 |
String | valueOff(int i) valueOf(double d) |
기본 타입값을 문자열로 리턴 |
문자 추출(charAt())
charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다.
인덱스란 0 에서부터 "문자열길이 -1 "까지의 번호를 말한다,
프가 리턴 된다
String subject = "자바 프로그래밍"
char charValue = subject.charAt(3);
문자열 비교(equals())
기본 타입(byte, char, short, int, long, float, double , boolean) 변수의 값을 비교할 때에는 == 연산자를 사용
but 문자열은 원하지 않는 결과가 나온다
자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조
but new 연산자로 생성된 다른 String 객체를 참조
-> new 연산자로 만든 str 과 리터럴로 만든 str == 연산 사용시 전혀 다른 결과 값 출력
equals() 를 사용 str.equals(str) 로 문자열을 비교
eqauls() 는 Object 번지 비교 메소드 지만, String 클래스 오버라이딩을 하였다.
바이트 배열로 변환(getBytes())
종종 문자열을 바이트 배열로 변환
-> 네트워크로 문자열을 전송하거나, 문자열을 암호화 할때 문자열을 바이트 배열로 변환
바이트로 변환하는 2가지 메소드
byte[] bytes = "문자열".getBytes();
byte[] bytes = "문자열".getBytes(Charset charset);
getBytes() 메소드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열을 리턴
만약 특정 문자셋으로 인코딩된 바이트 배열을 얻으려면 두번째 메소드를 사용
try{
byte[] bytes = "문자열".getBytes("EUC-KR");
byte[] bytes = "문자열".getBytes("UTF-8");
} catch (UnsupportedEncodingException e){
}
어떤 문자셋으로 인코딩 하느냐에 따라 바이트 배열의 크기가 달라짐
EUC-KR 은 getBytes()와 마찬가지로 알파벳을 1바이트, 한글은 2바이트로 변환
UT8-8 알파벳은 1바이트, 한글은 3바이트로 변환
getBytes(Charset charset)메소드는 잘못된 문자셋을 매개값으로 줄 경우,
java.io.UnsuppotedEncodingExceptin 예외가 발생하므로 예외 처리 필요
바이트 배열을 다시 문자열로 변환(디코딩) 할때에는 어떤 문자셋으로 인코딩된
바이트 배열이냐에 따라서 디코딩 방법이 다름
단순한 String(byte[] bytes) 생성자를 이용해서 디코딩하면 시스템의 기본 문자셋을 이용한다.
시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열일 경우 다음 String 생성자를 이용해서 디코딩
String str = new String(byte[] bytes, String charsetName);
문자열 찾기(indexOf())
indexOf() 메소드는 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴,
만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴
String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");
index 변수에는 3이 저장되는데 ,"자바 프로그래밍" 에서 "프로그래밍" 문자열 인덱스 위치가 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() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열,
따라서 newStr 변수는 새로 생성된 "java 프로그래밍" 문자열을 참조.
문자열 잘라내기(substring())
substring() 메소드는 주어진 인덱스에서 문자열을 추출 substring() 메소드는 매개값의 수에 따라 두가지 형태 사용
substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열을 추출, substring(int beginIndex)는 주어진 인덱스 부터 끝까지 문자열을 추출
String ssn = "880815-1234567";
String firstNum = ssn.substring(0.6);
String secondNum = ssn.substring(7);
상기 코드에서 firstNum 변수값은 "880815" secondNum 변수값은 "1234567"
알파벳 소*대문자 변경(toLowerCase(), toUpperCase())
toLowerCase() 메소드는 문자열을모두 소문자로 바꾸 새로운 문자열을 생성한후 리턴한다
반대로 toUpperCase() 메소드는 문자열을 모두 대문자로 바꾼 새로운 문자열을 생성한 후 리턴한다.
String original = "Java Programing";
String loweCase = original.toLowerCase();
String upperCase = original.toUpperCase();
lowerCase 변수는 새로 생성된 "Java programming" 문자열을 참조
upperCase 변수는 새로 생성된 "JAVA PROGRAMING" 문자열을 참조
원래 "Java Programming 문자열이 변경된 것이 아님"
toLowerCase() 와 toUpperCase() 메소드는 영어로 된 두 문자열 대소문자와 관계없이 비교 할떄 주로 이용
equals() 메소드를 사용하려면 사전에 toLowerCase() 와 toUpperCase() 대소문자를 맞추어야 함
equalsIgnoreCase() 메소드를 사용하면 이 작업이 생략
문자열 앞뒤 공백 잘라내기(trim())
trim() 메소드는 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴
newStr 변수는 새로 새성된 "자바 프로그래밍" 문자열을 참조, trim() 메소드는 앞뒤의 공백만 제거
중간의 공백은 제거 하지 않는다
String oldStr = " 자바 프로그래밍 "
String newStr = oldStr.trim();
trim() 메소드를 사용한다고 해서 원래 문자열의 공백이 제거되는것이 아님
oldStr.trim() 은 oldStr 의 공백을 제거 하는 것이 아니다
문자열 변환(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)
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
StringBuffer, StringBuilder 클래스 (0) | 2021.10.24 |
---|---|
StringTokenizer 클래스 (0) | 2021.10.24 |
Class 클래스 (0) | 2021.10.23 |
System 클래스 (0) | 2021.10.23 |
Objects 클래스 (0) | 2021.10.22 |