String 클래스
String 생성자
자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리된다. 소스상에서 문자열 리터럴은
String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String객체를 생성할 수도 있다.
어떤 생성자를 이용해서 String 객체를 생성할지는 제공되는 매개값의 타입에 달려 있다.
package sec02.exam01;
public class ByteToStringEx {
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
package sec02.exam01;
import java.io.IOException;
public class KeboardToStringEx {
public static void main(String[] args) throws IOException {
byte[] bytes = new byte[100];
System.out.print("입력 :" );
int readByteNo = System.in.read(bytes);
System.out.println(readByteNo); // 7
String str1 = new String(bytes, 1, readByteNo-2);
System.out.print(str1); // ello
String str2 = new String(bytes, 0, readByteNo-2);
System.out.print(str2); // Hello
}
}
<결과>
입력 :Hello
7
ello
Hello
-2를 한 이유는 캐리지리턴(\r)+라인피드(\n) 부분은 문자열로 만들 필요가 없기 때문에
문자 추출( charAt( ) )
해당 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다. 여기서 인덱스란 0에서부터 문자열 길이 -1까지의
번호를 말한다.
문자열 비교( equals( ) )
바이트 배열로 변환 ( getBytes( ) )
종종 문자열을 바이트 배열로 변환하는 경우가 있다. 대표적인 예로 네트워크로 문자열을 전송 하거나,
문자열을 암호화할 때 문자열을 바이트 배열로 변환하는 경우가 있다.
ECU-KR은 getBytes()와 마찬가지로 알파벳은 1바이트, 한글은 2바이트로 변환하고,
UTP-8은 알파벳은 1바이트, 한글은 3바이트로 변환한다.
package sec02.exam01;
public class StringGetBytesEx {
public static void main(String[] args) {
String str = "안녕하세요";
byte[] bytes1 = str.getBytes();
System.out.println("bytes1.legth: " + bytes1.length);
String str1 = new String(bytes1);
System.out.println("bytes->String: " + str1);
try {
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);
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 (Exception e) {
e.printStackTrace();
}
}
}
<결과>
bytes1.legth: 15
bytes->String: 안녕하세요
bytes2.length: 10
bytes2->String: 안녕하세요
bytes3.length: 15
bytes3->String: 안녕하세요
문자열 찾기 ( indexOf() )
문자열 길이 ( length() )
문자열 대치 ( replace() )
replace() 메소드는 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고
리턴한다.
String 객체의 문자열은 변경이 불가능한 특성을 갖기 때문에 replace()메소드가 리턴하는 문자열은 원래 문자열의
수정본이 아니라 완전히 새로운 문자열 이다.
package sec02.exam01;
public class StringEx {
public static void main(String[] args) {
String str1 = "자바 프로그래밍";
int n = "여기에 없는".indexOf("없는");
System.out.println(n); // 4
System.out.println(str1.length()); // 8
str1 = str1.replace("자바", "코볼");
System.out.println(str1);// 코볼 프로그래밍
String ssn = "880815-1234567";
String fn = ssn.substring(0, 6);
System.out.println(fn);// 880815
String ssn1 = "880815-1234567";
String fn1 = ssn1.substring(7);
System.out.println(fn1);// 1234567
String tel1 = " 9 8 ";
System.out.println(tel1.trim());// 9 8
String num = "10";
int a1 = Integer.parseInt(num);
System.out.println(a1);// 10
String num2 = String.valueOf(a1);
System.out.println(num2);// "10"
}
}
위에 코드를 보면 "자바" => "코볼"로 변경 되어서 코볼 프로그래밍으로 출력 됨
Wrapper(포장) 클래스
박싱(Boxing)과 언박싱(Unboxing)
기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는
과정을 언박싱이라고 한다.
박싱(Boxing)
언박싱(Unboxing)
package sec02.exam01;
public class Boxing_UnBoxingEx {
public static void main(String[] args) {
//박싱
Integer obj1 = new Integer(100);
Integer obj2 = new Integer("200");
Integer obj3 = Integer.valueOf("300");// 해당 방법이 맞음
//언박싱
int vale1 = obj1.intValue();
int vale2 = obj2.intValue();
int vale3 = obj3.intValue();
System.out.println(vale1);
System.out.println(vale2);
System.out.println(vale3);
}
}
<결과>
100
200
300
자동 박싱과 언박싱
자동 박싱
포장 클래스 타입에 기본값이 대입될 경우에 발생, 예를 들어 int 타입의 값을 Integer 클래스 변수에 대입하면
자동 박싱이 일어나 힙 영역에 Integer 객체가 생성된다.
자동 언박싱
기본 타입에 포장 객체가 대입되는 경우와 연산에서 발생, 예를 들어 Integer객체를 int 타입 변수에 대입하거나,
Integer 객체와 int 값을 연산하면 Integer 객체로부터 int값이 자동 언박싱되어 연산된다.
포장 값 비교
포장 객체는 내부의 값을 비교하기 위해 ==와 !=연산자를 사용하지 않는 것이 좋다. 이 연산자는 내부의 값을 비교
하는게 아니라 포장 객체의 참조를 비교하기 때문에
package sec02.exam01;
public class ValueCompareEx {
public static void main(String[] args) {
System.out.println("[128~127 초과값일 경우]");
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("==결과: " + (obj1 == obj2));
System.out.println("언박싱후 ==결과: " + (obj1.intValue()==obj2.intValue()));
System.out.println("equals() 결과: " + obj1.equals(obj2));
System.out.println();
System.out.println("[-128~127 범위값일 경우]");
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("==결과: " + (obj3 == obj4));
System.out.println("언박싱후 ==결과: " + (obj3.intValue()==obj4.intValue()));
System.out.println("equals() 결과: " + obj3.equals(obj4));
}
}
<결과>
[128~127 초과값일 경우]
==결과: false
언박싱후 ==결과: true
equals() 결과: true
[-128~127 범위값일 경우]
==결과: true
언박싱후 ==결과: true
equals() 결과: true
java.util 패키지
Date 클래스
Date 클래스는 날짜를 표현하는 클래스이다. Date는 객체 간에 날짜 정보를 주고받을 때 매개 변수나 리턴 타입으로
주로 사용된다.
현재 날짜를 출력하기
package sec02.exam02;
import java.text.*;
import java.util.*;
public class DateEx {
public static void main(String[] args) {
Date now = new Date();
String strNow1 = now.toString();
System.out.println(strNow1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
String strNow2 = sdf.format(now);
System.out.println(strNow2);
}
}
<결과>
Mon Jun 19 20:16:06 KST 2023
2023년 06월 19일 08시 16분 06초
package sec02.exam02;
import java.text.*;
import java.util.*;
public class Date2Ex {
public static void main(String[] args) {
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 E요일 HH시 mm분");
System.out.println( sdf.format(now) );
}
}
<결과>
2023년 06월 19일 월요일 20시 16분
Calendar 클래스
package sec02.exam02;
import java.util.Calendar;
public class CalendarEx {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
System.out.println(year);
// 0월 부터 시작하기 때문에 + 1
int moth = cal.get(Calendar.MONTH) + 1;
System.out.println(moth);
int day = cal.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
}
}
<결과>
2023
6
19
localDate
package sec02.exam02;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class LocalDateEx {
public static void main(String[] args) {
// 날짜만
LocalDate cd = LocalDate.now();
System.out.println(cd);
// 시간만
LocalTime ct = LocalTime.now();
System.out.println(ct);
// 날짜+시간
LocalDateTime cdt = LocalDateTime.now();
System.out.println(cdt);
String cm = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy년MM월dd일"));
System.out.println(cm);
String str = LocalDate.now()+ "" + LocalTime.now().toString().substring(0, 8);
System.out.println(str);
}
}
<결과>
2023-06-19
20:20:18.870436400
2023-06-19T20:20:18.870436400
2023년06월19일
2023-06-1920:20:18