Java 기본 API 클래스 #3
String 클래스
생성자 byte[] 배열을 문자열로 변환하는 생성자.
키보드로부터 읽은 바이트 배열을 문자열로 변환
#System.in.read()메소드는 키보드에서 입력한 내용을 매개값으로 주어진 바이트 배열에 저장하고
읽은 바이트 수를 리턴.
예시. 바이트 배열을 문자열로 변환.
public class ApiByteToStringExample {
public static void main(String[] args) {
byte[] bytes = {72,101,108,108,111, 32,74,97,118,97}; // key 코드.
String str1 = new String(bytes);
System.out.println(str1);
String str2 = new String(bytes,6,4);
System.out.println(str2);
}
}
예시. System.in.read() 메소드
import java.io.IOException;
public class ApiKeyboardToString {
public static void main(String[] args) throws IOException{ // throws 남한테 떠넘긴다.
byte[] bytes = new byte[100];
System.out.print("입력: ");
int rbn = System.in.read(bytes);
String str = new String (bytes, 0, ren-2);
System.out.println(str);
문자 추출 (charAt())
매개 값으로 주어진 인덱스의 문자 리턴
ex. String subject = “자바 프로그래밍”;
char charValue = subject.charAt(3); = 프
예시. 문자 추출
public class ApiStringCharAtExample {
public static void main(String[] args) {
String ssn = "012345-1234567";
// index 01234567890123
char sex = ssn.charAt(7); // 7번째 인덱스 문자를 읽는다.
switch (sex) {
case '1':
case '3':
System.out.println("남자");
break;
case '2':
case '4':
System.out.println("여자");
break;
}
}
}
문자열 비교 equals()
기본타입 변수의 값을 비교할땐 == 연산자를 사용한다 그러나 문자열을 비교할때는 == 연산자를 사용하면 원하지 않는 결과가 나올수도 있어 equals()을 주로 사용한다.
자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어있고 new 연산자로 생성된 다른 String은 다른 객체를 참조한다.
예시. 문자열 비교
public class ApiStringEqualsExample {
public static void main(String[] args) {
String a1 = new String("이잉");
String a2 = "이잉";
if(a1 == a2) { // if (조건식) a1과 a2가 같을 경우
System.out.println("같은 string 객체 참조");
} else { // 그게 아니라면
System.out.println("다른 string 객체 참조");
}
if(a1.equals(a2)) {
System.out.println("equals비교 같은 문자열을 가짐");
} else {
System.out.println("equals비교 다른 문자열을 가짐");
}
}
}
바이트 배열로 변환 (getBytes())
시스템의 기본 문자셋으로 인코딩된 바이트 배열 얻기, 특정 문자셋으로 인코딩 된 바이트
byte[] bytes = “문자열”.getBytes();
종종 문자열을 바이트 배열로 변환하는 경우가 있는데 대표적으로 네트워크로 문자열을 전송하거나 문자열을 암호화할때 문자열을 바이트 배열로 변환한다.
어떤 문자셋으로 인코딩하는지에 따라 바이트 배열의 크기가 달라지는데 EUC-KR은 getBytes() 와 같은 알파벳 1바이트 한글은 2바이트로변환되고 UTF-8은 알파벳 1바이트 한글은 3바이트로 변환한다.
잘못된 문자셋을 매개값으로 줄경우 Java.io.UnsupportedEncodingException 예외가 발생하니 예외 처리를같이 해준다.
예시. getBytes()
import java.io.UnsupportedEncodingException;
public class ApiStringGetBytesExample { // 바이트 배열로 변환 getbytes
public static void main(String[] args) {
String eee = "안녕";
byte[] bytes = eee.getBytes();
System.out.println("bytes.length확인: "+ bytes.length); // 안녕을 byte로 변환 한글은 한글자씩 2바이트로 변환된다.
String a1 = new String(bytes);
System.out.println("bytes->String로 변환: " + a1);
try {
byte[] bytes1 = eee.getBytes("UTF-8"); // UTF-8은 한글은 3바이트로 변환된다 . utf-8 , euc-kr인코딩
System.out.println("bytes1.length확인: "+ bytes1.length); // 안녕을 byte로 변환 한글은 한글자씩 3바이트로 변환된다.
String a2 = new String(bytes1, "UTF-8");
System.out.println("bytes1->String로 변환: " + a2);
byte[] bytes3 = eee.getBytes("EUC-KR");
System.out.println("bytes3.length확인: "+ bytes3.length); // 안녕을 byte로 변환 한글은 한글자씩 2바이트로 변환된다.
String a3 = new String(bytes3, "EUC-KR");
System.out.println("bytes3->String로 변환: " + a3);
} catch(UnsupportedEncodingException e){
e.printStackTrace();
}
}
}
indexOf 문자열 찾기
매개값으로 주어진 문자열이 시작되는 인덱스 리턴, 주어진 문자열이 포함되어 있지 않으면 -1리턴
예시. indexOf 문자열
String s = "자바 프로그래밍"; // String s에 자바 프로그래밍을 저장시키고
int index = s.indexOf("프로그래밍") // indexOf로 프로그래밍이란 문자열을 찾아보면 index는 0부터 시작되기에 프까지 가는숫자는 3이된다.
indexOf()메소드는 if문의 조건식에서 특정 문자열이 포함되어있는지 여부에 따라 실행 코드를 달리 자주 사용된다. -1 값을 리턴하면 특정 문자열이 포함되어 있지 않다는 뜻이다. 따라서 ! 부정 기호를쓰고 문자열이 있는지 찾게 만들수 있다.
예시.
if(문자열.indexOf("찾는문자열") != -1 {
// 포함되있을경우
} else{
// 포함되어있지 않은 경우
}
문자열 포함 예씨
public class ApiIndexOfExample {
public static void main(String[] args) {
String sub = "자바 프로그래밍 자바...";
// index 01 23
int loca = sub.indexOf("프로그래밍"); // indexOf 문자열을찾아준다 프로그래밍이란 문자열 index 위치
System.out.println(loca);
if(sub.indexOf("자바") != -1){ // -1은 지정한 특정 문자열이 없다는 뜻이나 부정기호를 써서 해당 문자열이 있을경우 아래 내용을
System.out.println("자바가 들어갔어요오");
} else { // 그렇지 않으면 아래 내용을 실행한다
System.out.println("자바가 없어요오");
}
}
}
문자열 길이 length()
length()메소드는 문자열의 길이를 리턴한다.
예시.
public class ApiStringLengthExample {
public static void main(String[] args) {
String ssn = "012345-1234567";
int length = ssn.length(); // length는 ssn의 length이다
if(length == 13) { // 만일 length의 index가 13가 맞을경우 아래 내용을 실행을
System.out.println("일치!");
}else { // 그렇지 않으면 아래 내용을 실행한다.
System.out.println("틀림!");
} // 출력하면 틀림이 출력된다 0부터 index는 14이다.
}
}
.replace(첫번째 매개, 두번째 매개값) 문자열 대치
첫번째 매개값인 문자열을 찾고, 두번째 매개값인 문자열로 대치한다.
# String는 힙 영역이 같지않고 수정한다해도 다르다.
예시.
public class ApiStringReplaceExample {
public static void main(String[] args) {
String old = "자바는 객체지향 언어이구, 자바는 API를 지원한다.";
String New = old.replace("자바", "JAVA"); // New에는 old의 내용에 문자열을 대치한 값을 저장한다. 자바란 단어를 JAVA로...
System.out.println(old); // String은 힙영역이 같은 old의 내용을 바꾸더라도 따로 따로 저장되기에 값들은 다 따로따로 출력된다.
System.out.println(New);
}
}
substring() 문자열 잘라내기
해당 메소드는 두가지 형태로 사용되는데
substring(int beginIndex, int endIndex)는 주어진 시작과 끝의 인덱스 사이의 문자열을 추출
substring(int beginIndex)는 주어진 인덱스 이후 부터 끝까지 문자열을 추출한다.
예시.
public class ApiString_substring_Example {
public static void main(String[] args) {
String ssn = "123456-1234567";
// index 01234567890123
String fi = ssn.substring(0, 6); // 0번째 index부터 6번째 앞까지 잘라 낸다.
System.out.println(fi);
String se = ssn.substring(7); // (0, 6)은 0 ~ 어디까지 이고, 그냥 (7)은 7번째부터 이후의 문자열을 추출한다.
System.out.println(se);
}
}
알파벳 소.대문자 변경(toLowerCase(), toUpperCase())
해당 메소드는 문자열을 소문자로, 대문자로 바꾼새로운 문자열을 생성한 후 리턴한다.
해당 메소드는 영어로 된 두문자열을 대소문자 관계없이 비교할때 주로 이용된다.
equals()메소드를 사용하려면 사전에 toLowerCase()와 toUpperCase()로 대소문자를 맞춰야하지만 equalsIgnoreCase()메소드를 사용하면 작업은 생략한다.
예시.
public class ApiStringToLowerUpperCaseExample {
public static void main(String[] args) {
String st1 = "Java Programming";
String st2 = "JAVA PROGRAMMING";
System.out.println(st1.equals(st2)); // st1과 st2의 같은지 비교
String lowerStr1 = st1.toLowerCase();
String lowerStr2 = st2.toLowerCase();
System.out.println(lowerStr1.equals(lowerStr2)); // 전부 소문자로 바꿔서 문자가 같은지 비교
System.out.println(st1.equalsIgnoreCase(st2)); // equalsignorecase를 사용해서 대소문자 구분없이 같은지 비교한다.
}
}
문자열 앞뒤 공백 잘라내기 trim()
trim()메소드는 문자열 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴한다
예시.
public class ApiStringTrimExample {
public static void main(String[] args) {
String tel1 = " 000";
String tel2 = " 123 ";
String tel3 = " 456 ";
String tel = tel1.trim() + tel2.trim() + tel3.trim(); // 공백을 제거하는 trim을 사용한다
System.out.println(tel);
}
}
문자열 변환(valueOf())
해당 메소드는 기본 타입의 값을 문자열로 변환하는 기능이다.
예시.
public class ApiStringValueOfExample {
public static void main(String[] args) {
String st1 = String.valueOf(10);
String st2 = String.valueOf(10.5);
String st3 = String.valueOf(true);
System.out.println(st1);
System.out.println(st2);
System.out.println(st3);
}
}
StringTokenizer클래스
문자열 특정 구분자로 연결되어 있을 경우 구분자를 기준으로 부분 문자열을 분리하기 위해서는 String의 split() 메소드를 이용하거나 java.util패키지의 StringTokenizer를 이용할수있다. split는 정규 표현식으로 구분하고 StringTokenizer은 문자로 구분한다는 차이점이 있다.
예시. Split
public class ApiStringSplitExample {
public static void main(String[] args) {
String text = "길동이&둘리,또치,마이클-희동이"; // 기호로 연결한 이름들은 split() 메소드를 통해서 구분자로 문자열을 추출할수있다.
String[] names = text.split("&|,|-"); // |파이프 를 이용해 기호가들어간것을 제외 시킨다.
for(String name : names) { // for문에 사용한 String 값을 주기위해 name라는 이름을만들고 names의 내용을 대입시킨다.
System.out.println(name); // 출력한다.
}
}
}
StringTokenizer 클래스를 사용하면 손쉽게 문자열(토큰token)을 분리해 낼수 있다. 첫 번째 매개값으론 전체 문자열을 주고 두번째 매개값으로 구분자를 주면된다.
만약 구분자를 생략하면 공백이 기본구분자가 된다.
예시. StringTokenizer
import java.util.StringTokenizer;
public class ApiStringTokenizerExample {
public static void main(String[] args) {
String text = "길동이/희동이/또치/마이클";
// how1: 전체 토큰 수를 얻어 for문으로 루핑
StringTokenizer st = new StringTokenizer(text, "/"); // text에서 문자열 안에 내용중 /로 구분되어있을 경우 StringTokenizer 객체로 문자열을 분리한다.
int tokens = st.countTokens(); // int 메소드에 countTokens() 꺼내지 않고 남아있는 토큰의 수
for(int i=0; i<tokens; i++) { // 남아있는 만큼 반복한다.
String token = st.nextToken(); // text에 저장된 String nextToken()메소드로 토큰을 꺼내 token에 저장한다.
System.out.println(token);
}
System.out.println();
// how2: 남아 있는 토큰을 확인하고 while문으로 루핑.
st = new StringTokenizer(text, "/");
while(st.hasMoreTokens()) {
String token = st.nextToken();
System.out.println(token);
}
}
}
StringBuffer , StringBuilder 클래스
문자열을 저장하는 String는 내부의 문자열을 수정할수없다.
string의 힙 메모리에 abc가 들어갔으면 string에는 abc가 있고 수정이 불가 다시 string1로 새롭게해야한다
buffer, builder 이두 클래스는 내부 버퍼에 문자열을 저장해 두고 그 안에서 추가 수정 삭제 작업을
할수있도록 설계되어 있다. String 처럼 새로운 객체를 만들지 않고도 문자열을 조작할수있다.
그리고 마지막에 String로 대입해주면서 수정할수 없게 만든다.
예시.
public class ApiStringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(); // 객체를 생성한다 .
sb.append("Java "); // append는 문자열 끝에 주어진 매개값을 추가한다.
sb.append("Program Study"); // 따라서 Java Program Study가 출력된다.
System.out.println(sb.toString());
// insert 문자열 중간에 주어진 매개값을 추가한다.
sb.insert(4, "2"); // sb의 index 4번째에 숫자 2를 추가해준다
System.out.println(sb.toString()); // 출력한다.
// setCharAt 문자열에 주어진 index의 문자를 다른문자로 만든다.
sb.setCharAt(4, '5'); // 이때 변경하려는 char은 '' 작은따옴표로 값을 감싼다.
System.out.println(sb.toString()); // Java5 Program Study
// replace 문자열의 일부를 다른 문자열로 바꾼다
sb.replace(6, 13, "BOOK"); // 6번째 index부터 13앞자리 12번째 index까지.
System.out.println(sb.toString());
// delete 문자열 일부분을 삭제
sb.delete(4, 5); // index 4번째 문자열을 삭제시킨다.
System.out.println(sb.toString());
// length 문자열 총수를 구한다
int length = sb.length();
System.out.println("총 길이(수): " + length);
String result = sb.toString(); // sb의 내용을 string result에 대입시킨다.
System.out.println(result);
}
정규 표현식과 Pattern 클래스
문자열이 정해져 있는 형식이 정규 표현식이다.하지만 정규 표현식으로 구성되어있는지 검증해야 하는 경우가있다.
이메일, 전화번호 사용자가 제대로 입력했는지 말이다.

Pattern 클래스 문자열을 정규 표현식으로 검증하는 기능은 java.util.regex.Pattern 클래스의 정적 메소드인 matches() 메소드가 제공한다. 첫 번째 매개 값은 정규 표현식이고 두번째 매개 값은 검증할 문자열이다. 검증 후 결과는 boolean타입으로 리턴된다.
예시.
import java.util.regex.Pattern;
public class ApiS_PatternExample {
public static void main(String[] args) {
String regExp = "(02|010)-\\d{3,4}-\\d{4}"; // 정규 표현식 표를 보고 참고한다. // 02 또는 010 \d{3,4} 3~4자리 숫자 \d{4} 4자리 숫자.
String data = "010-1234-5678";
boolean result = Pattern.matches(regExp, data); // regExp(정규표현식)의 값과 data(검증할 문자열)에 들어간 매개값을 검증한다. 검증후 result에 저장된다.
if(result) { // 위에 대입된 내용이 일치하면 아래 내용을
System.out.println("전화번호가 맞음");
} else { // 그렇지 않으면 아래 내용을
System.out.println("전화번호가 아님");
}
regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?"; // 뒤에 (\\.\\w+)? 은 .과 한개 이상의 알파벳 또는 숫자가 한번더 사용될수있다는 내용이다.
// regExp = "\\w+@\\w+\\.\\w+"; // 이것도 사용할순 있다 다만 .co.kr, .or.kr등등 이런것은 구분할수없다.
data = "abc@gmail.com";
result = Pattern.matches(regExp, data);
if(result) {
System.out.println("이메일이 맞음");
} else {
System.out.println("이메일이 아님");
}
}
Wrapper 포장 클래스
자바는 기본 타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 생성할수 있다.
이런 객체를 포장(Wrapper) 객체라고 한다.

기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고있다.
Boxing, Unboxing 박싱, 언박싱.
기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라하고 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라 한다.
자동 박싱과 언박싱.
기본 타입 값을 직접 박싱, 언박싱 하지 않아도 자동으로 박싱과 언박싱이 일어나는 경우가 있다.
자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생한다 예를 들어 int 타입의 값을 Integer 클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 integer 객체가 생성된다
Integer A = 100; << 요거.
예시. Boxing.
public class ApiBoxingUnBoxingExample {
public static void main(String[] args) {
// boxing 기본 타입의 값을 박싱하고 언박싱해서 출력한다. ㅆ...
Integer o1 = new Integer(100);
Integer o2 = new Integer(100);
Integer o3 = Integer.valueOf("300");
// unboxing
int value1 = o1.intValue();
int value2 = o2.intValue();
int value3 = o3.intValue();
// 출력
System.out.println(value1);
System.out.println(value2);
System.out.println(value3);
}
}
예시.2 Auto Boxing Unboxing
public class ApiAutoBoxingUnboxingExample {
public static void main(String[] args) {
// auto boxing
Integer o1 = 100;
System.out.println("value: " + o1.intValue());
// auto unboxing
int value = 100;
System.out.println("value: " + value);
// 연산 auto unboxing
int result = o1 + 100;
System.out.println("result: " + result);
}
}
Math 클래스는 수학 계산에 사용할수 있는 메소드 들을 제공하고 있다 Math 클래스가 제공하는 메소드는 모두 정적static ) 이므로 Math 클래스로 바로 사용이 가능하다. Math가 제공하는 메소드는 찾아봐라. 알아서
java.util.Random 클래스는 난수를 얻어내기 위해 다양한 메소드를 제공한다. Math.random()메소드는 0.0에서 1사이의 double 난수를 얻는 것만 사용한다면 Random 클래스는 boolean, int, long, float, double 난수를 얻을 수 있다 차이점은 Random클래스는 종자 값(seed)을 설정할수있다아
Random() = 호출 시마다 다른 종자 값(현재시간 이용)이 자동 설정된다
Random(long seed) = 매개값으로 주어진 종자값이 설정된다.
예시.
import java.util.Random;
public class ApiMathRandomLottoExample {
public static void main(String[] args) {
// 선택번호
int[] selectNumber = new int[6]; // 선택번호 6개가 저장될 배열 생성한다.
Random random = new Random(3); // 선택번호를 얻기 위한 random 객체를 생성한다.
System.out.print("선택 번호: ");
for(int i=0 i<6; i++){
selectNumber[i] = random.nextInt(45)+1l // 1~45 까지의 랜덤번호를 얻어 selectNumber의 배열에 저장한다
System.out.print(selectNumber[i] + " ");
}
}
}
Date, Calendar 클래스도있다
날짜는 프로그램에서 자주 사용되는 데이터이고 자바는 시스템의 날짜 및 시각을 읽을 수있도록 Date와 Calendar 클래스를 제공하고있다 이 두 클래스는 모두 java.util 패키지에 포함되어있다아
Format 클래스
정수 세자리마다 쉼표( , )를 넣고 싶다면 정수를 문자열로 변환한 다음 세라지씩 끊어서 쉼표를 넣을수 있다 하지만 코드가 지저분해지니 숫자 형식 클래스 DecimalFormat로 사용시킬수있다.

예시.
OO = new DecimalFormat("#,###.0");
1,234,567.0처럼 출력시킬수있다.