여러가지 기본적인 java.lang 패키지의 클래스를 공부해보자.
ㅇStrnig 클래스 <<요거를 보자
문자열은 아주 자주 쓰이는 데이터로, 문자열생성방법, 추출, 비교, 찾기, 분리, 변환 등 기능의 메소드를 잘 익혀야 한다.
여기서 배울 내용은
ㅇString 생성자
ㅇString 메소드
ㄴ문자 추출 : charAt()
ㄴ문자열 비교 : equals()
ㄴ바이트 배열로 변환 : getBytes()
ㄴ문자열 찾기 : indexOf()
ㄴ문자열 길이 : length()
ㄴ문자열 대치 : replace()
ㄴ문자열 잘라내기 : substring()
ㄴ알파벳 대소문자 변경 : toLowerCase() / toUpperCase()
ㄴ문자열 앞뒤 공백 잘라내기 : trim()
ㄴ문자열 변환 : valueOf()
String생성자
자바 문자열은 String클래스의 인스턴스로 관리된다.
ㅇ소스상에서 문자열 리터럴은 String객체로 자동 생성된다.
ㅇ하지만 직접 String객체 생성할 수 있다. (String클래스의 생성자 이용)
ㄴ생성자가 많이 오버로딩되어있다.
사용 빈도가 높은 생성자들을 알아보자.
복습:
바이트는 8비트의 공간이 할당되며, 2^8=256이므로 -128~127의 범위를 나타낼 수 있다.
<<바이트 배열을 문자열로 변환하는 예제>>
이런건 인코딩 설정으로 해결
<<키보드로부터 읽은 바이트 배열을 문자열로 변환하기>>
ㅇSystem.in.read() 메소드 : 키보드 입력한 내용을! 매개값으로 주어진 바이트배열에 저장하고, 읽은 바이트 수를 리턴한다.
예를 들면 ) 키보다르 Hello 입력하고 Enter누르면 Hello+캐리지리턴(\r)+라인피드(\n) 코드값이 바이트 배열에 저장된다. 총 7개의 바이트를 읽었기 때문에 7을 리턴한다. 입력하고자 했던 정보가 아닌 그 2개의 코드는 제외해주고 이용하자.
String 메소드
String클래스는 많은 메소드를 가지고 있다.
문자열의 추출, 비교, 찾기, 분리, 변환.... 다양하게 활용 가능하다.
혼공자 책에서는 사용 빈도 높은 메소드를 공부해보자고 한다.
리턴타입 | 메소드이름(매개변수) | 설명 |
char | charAt(int index) | 인덱스에 있는 문자 리턴 |
boolean | equals(Object anObject) | 두 문자열을 비교 |
byte[] | getByte() | byte[]로 리턴 |
byte[] | getByte(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) |
기본 타입 값을 문자열로 리턴 |
ㅇString 메소드인 charAt() 익히기
ㄴ인덱스에 있는 문자 리턴
ㅇString 메소드인 equals() 익히기
ㅡ자바는 문자열 리터럴이 동일하면 동일한 String객체를 참조한다.
ㅡ하지만 new연산자로 생성된 String객체는 별개다.
ㅡ==연산자는 각 변수에 저장된 번지를 비교한다.
ㅡ String클래스의 equals()메소드는 문자열을 비교한다.
ㅇString 메소드인 getBytes() : 바이트 배열로 변환
ㄴ문자열을 바이트 배열로 변환하는 경우가 있다.
ㅡ네트워크로 문자열을 전송할 경우
ㅡ문자열을 암호화할 때 문자열을 바이트 배열로 변환하는 경우
두 가지 있다.
.getBytes()와 .getBytes(Charset charset)
전자 : 시스템의 기본 문자셋으로 인코딩된 바이트배열을 리턴
후자 : 특정 문자셋으로 인코딩하고싶을 경우.. 그 문자셋 바이트배열을 리턴
ㄴ잘못된 문자셋을 매개값으로 주면 java.io.UnsupportedEncodingException 발생. (예외처리 필요)
이렇게 인코딩한 바이트배열을 다시 문자열로 변환(디코딩) 하고 싶으면
어떤 문자셋으로 인코딩했는지에 따라 디코딩 방식을 달리 해야 한다.
시스템 기본 문자셋으로 인코딩을 했었다면 단순히 String(byte[] bytes) 생성자를 통해 디코딩한다. 그럼 시스템 기본 문자셋을 통해 디코딩된다!
하지만 시스템 기본 문자셋이 아닌 다른 문자셋으로 인코딩한 바이트배열일 경우, 다음의 String 생성자를 이용해 디코딩한다.
String str = new String(byte[] bytes, String charsetName);
<<문자열을 바이트 배열로 인코딩하기 -> 다시 디코딩하기 (String 생성자 이용)>>
예외 처리를 해주었는데... 개발자의 경험이 예외처리하는 것에 중요하다고 했으니까
UnsupportedEncodingException예외를 처리해야 하는 상황을 잘 인지해야 할 것 같다.
ㅡㅡ
매개값에 잘못된 문자셋이 들어가면 예외가 발생하니까 예외 처리가 필요하다
ㅡㅡ
e.printStackTrace는
ㅇString의 메소드인 indexOf() : 문자열 찾기
ㄴ매개값으로 주어지는 문자열이 '시작되는 인덱스'를 리턴한다.
ㄴ그 문자열이 포함되어있지 않으면 '-1'을 리턴한다.
ㅇString의 메소드 length() : 문자열 길이
ㅇString의 메소드 replace() : 문자열대치
ㄴ수정하는게 아니라 완전히 새로운 문자열을 리턴하는 거다.
즉, 스택 영역에는 두 변수가 있는 상태인거고, 힙 영역에는 두 객체 (String)이 생기는 거다.
ㅇString의 메소드 substring() : 문자열 잘라내기
ㄴ주어진 인덱스에서 문자열을 추출한다. 매개값에 수에 따라서..
ㅇsubstring(int beginIndex, int endIndex) --> 이 인덱스 사이의 문자열 추출 (처음 포함 끝 제외)
ㅇsubstring(int beginIndex) --> 거기부터 끝까지 문자열을 추출 (첨부터 아예 끝까지)
ㅇString의 메소드 to[Lower/Upper]Case()
ㄴ역시 소/대문자로 바꾼 새로운 문자열을 리턴하는 것이다.
ㅡ사용 : 영어로 된 문자열을 대소문자 구분 없이 비교하고자 할 때
앗 equalsIgnoreCase() 메소드를 이용하면 대or소문자로 새로 리턴하는 과정 없이
영문 문자열을 대소문자 구분하지 않고 비교가능하다.
ㅇString의 메소드 trim() : 문자열의 앞뒤 공백 trim
ㄴ역시 앞뒤공백잘라낸 '새로운 문자열'을 리턴한다.
ㄴ중간 공백은 제거하지 않는다.
ㅇString의 메소드 valueOf() : 문자열 변환
ㄴ기본타입(boolean, char, ...) 값을 문자열로 변환한다.
ㅡString클래스에는 매개변수 타입별로 valueOf()메소드가 오버로딩되어있다.
static String valueOf(타입 매개변수)
이건 static메소드라는 거 주의하자.
String클래스에 대해 공부해봤다.
필요할 때 바로 사용할 수 있도록 기억해두자..
valueOf는 기본타입변수의 값을 문자열로 새로 리턴
'JAVA' 카테고리의 다른 글
[3주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.07.26 |
---|---|
[JAVA] java.lang 패키지의 Wrapper 클래스 [ 포장클래스] (0) | 2020.07.25 |
[JAVA] java.lang 패키지의 Class클래스 (0) | 2020.07.23 |
[JAVA] java.lang 패키지의 System클래스 (0) | 2020.07.23 |
[JAVA] java.lang 패키지의 Object클래스 (0) | 2020.07.22 |