21-11-09 클래스와 메소드 (String, Wapper, Calendar, DateFormat)
String 클래스의 메소드
1) charAt();
: String 문자열의 (index) 번째 글자를 찾는다.
String n = "0123456789";
char c1 = n.charAt(0);
char c2 = n.charAt(5);
System.out.println("3. " + c1 + " " + c2);
//출력 결과 : 0 5
2) compareTo()
: 첫글자부터 차례로 같은 자리의 글자와 비교 (아스키코드). 크기를 결정하는 방법은 비교되는 두글자들의 뺄셈을 연산하여 결과가 음수이면 괄호안의 변수가, 양수 이면 this 변수가 더 크다. (ex) a.compareTo(b) = -1 : b가 더 크다 )
앞쪽부터 비교해 같은 글자는 지나치는 방식으로 크기가 결정되면 뒤쪽 글자들은 비교하지 않는다 (ex) 9981.compareTo(999) = -1 : 999가 더 크다고 판단함)
String a1 = new String("ABCD");
String a2 = new String("CCD");
String a3 = new String("ABCD");
System.out.println("4. a1.compareTo(a2)? " + a1.compareTo(a2));
System.out.println("4. a2.compareTo(a3)? " + a2.compareTo(a3));
System.out.println("4. a1.compareTo(a3)? " + a1.compareTo(a3));
//나라 이름 오름차순 정렬
String[] k = {"korea", "japan", "canada", "china", "brazile", "kenya", "jamaica"};
for(int i=0; i<k.length; i++) {
for(int j=i+1; j<k.length; j++) {
if(k[i].compareTo(k[j]) > 0) {
String temp = k[i];
k[i] = k[j];
k[j] = temp;
}
}
}
for (String str : k) System.out.print(str + " ");
System.out.println();
3) concat();
: 원본 s에 있는 문자열에 새로운 문자열을 이어붙이기하고 업데이트해서 저장하는 것이 아니라 이어붙이기 된 새로운 문자열 객체를 만들어 새로운 레퍼런스 변수에 저장할 수 있게 리턴해준다 .String 클래스의 특성상 s에 있는 원본은 보호된다.
s2 = s.concat(" World");
System.out.println("5. " + s2);
System.out.println("5. " + s); //원본이 보호됨
4) contains()
: 괄호 안의 문자열이 메서드 호출 객체가 갖고 있는 문자열의 일부로 포함되어 있다면 true를 리턴
s = new String("abcdefg");
boolean b = s.contains("bc");
boolean b1 = s.contains("xy");
System.out.println("6. 문자열 " + s + "에는 \"bc\"가 포함되어 있다? " + b);
System.out.println("6. 문자열 " + s + "에는 \"xy\"가 포함되어 있다? " + b1);
5) endsWith(), startsWith()
: 메서드 호출 객체가 갖고 있는 문자열이 괄호 안의 문자열로 끝나면/시작하면 true
s= new String("Hello.txt");
b = s.endsWith("txt");
b1 = s.startsWith("H");
System.out.println("7. 문자열 " + s + "는 \"txt\"로 끝난다? " + b);
System.out.println("7. 문자열 " + s + "는 \"H\"로 시작한다? " + b1);
6) equals(), equalsIgnoreCase()
: 문자열 비교, 대소문자를 구분하지 않고 문자열 비교
s = new String("Hello");
System.out.println("8. " + s + "는 \"Hello\"와 같다? " + s.equals("Hello"));
System.out.println("8. " + s + "는 \"hello\"와 같다? " + s.equals("hello"));
System.out.println("8. " + s + "는 \"HELLO\"와 같다? " + s.equalsIgnoreCase("HELLO"));
System.out.println("8. " + s + "는 \"Hello\"와 같다? " + s.equalsIgnoreCase("Hello"));
7) indexOf( ), indexof( , )
메서드 호출 객체의 문자열 중 괄호 안에 있는 문자가 몇 번째로 위치하는 지 구해준다. 존재한다면 인덱스값, 없으면 -1
System.out.println("9. " + s + "의 문자중 \'o\'의 위치 " + s.indexOf('o'));
System.out.println("9. " + s + "의 문자중 \'k\'의 위치 " + s.indexOf('k'));
System.out.println("9. " + s + " s.indexOf(\'e\', 0) " + s.indexOf('e',0));
System.out.println("9. " + s + " s.indexOf(\'e\', 1) " + s.indexOf('e',1));
System.out.println("9. " + s + " s.indexOf(\'e\', 2) " + s.indexOf('e',2));
System.out.println("9. " + s + " s.indexOf(\'o\', 2) " + s.indexOf('o',2));
//찾고자하는 문자가 지정된 정수(0부터 시작)번째 부터 시작해 몇번째 글자에 위치하는지
//첫번째 사용 예 : 알파벳 e가 문자열 s의 0번째부터 몇번째 글자인지 리턴 : 1
//두번째 사용 예 : 알파벳 e가 문자열 s의 2번째부터 찾아서 전채 글자의 몇번째 글자인지 구함
// ->"llo" 중 존재하지 않으므로 -1리턴
8) replace('기존 char','바꿀 char'), replace("기존문자열", "바꿀문자열)
:String 클래스는 보관하고 있는 문자열을 이용하여 변화를 주는 메서드들에서 변화된 내용이 업데이트 되어 저장되는 것이 아니고 대부분 새로운 변화된 문자열 객체로 만들어 리턴한다. 이는 대부분의 String클래스 메소드의 특징이므로따String 메서드를 통한 원본 s 문자열을 변경 시키기 어렵다.
s= "Hello";
System.out.println("10. " + s + " s.replace(\'H\', \'C\') -> " + s.replace('H','C'));
s2 = s.replace('H', 'C');
System.out.println("10. " + s+ " " + s2);
System.out.println("10. " + s + " s.replace(\'ll\', \'LL\') -> " + s.replace("ll","LL"));
s2 = s.replace("ll", "LL");
System.out.println("10. " + s+ " " + s2);
9) split()
( ) 안의 문자를 기준으로 문자열을 분리하여 문자열 배열로 만든다
String animal = "dog,cat,bear";
String[] a = animal.split(",");
System.out.print("\n12. ");
for(String str : a) System.out.print(str + " ");
10) substring( 시작인덱스, 끝 ), substring( 시작인덱스 )
: 원본 문자열에서 시작인덱스부터 끝인덱스 바로 전 문자까지를 추출한다
Hello World 에서 substring(2,7)을 하면 "llo W" 가 출력될 것이다.
s = "java.lang.Object";
s2 = s.substring(5,9);
//원본에서 인덱스 5~8(9-1)까지 추출
System.out.println("\n\n12. " + s2);
s2 = s.substring(10); //원본에서 열번째 글자부터 끝까지
System.out.println("12. " + s2);
11) valueOf()
: String 타입으로 변환해준다.
System.out.println("\n14. " + String.valueOf(true));
s = String.valueOf("14. " + 100);
System.out.println(s);
s = String.valueOf(100.123);
System.out.println("14. " + s);
Date dd = new Date();
s = String.valueOf(dd);
System.out.println("14. " + s);
Calenday 클래스
싱글톤 방식의 클래스. 생성자가 private으로 접근 차단됨 (외부에서 접근 금지 -> 외부에서 new Calendar() 사용 X)
유일하게 실행된 new Calendar()는 클래스 내부에서 실행되어 클래스 내부에 단 하나만 존재하게끔 생성된 레퍼런스 주소를 저장한다. 그 레퍼런스 변수가 갖고 있는 주소를 리턴하는 public static 형태의 getInstace메서드로 인스턴싀 주소를 리턴받아 사용해야한다. 이후 다시 getInstace() 메서드가 실행되면 HEAP에 이미 생성되어있는 인스턴스의 주소가 리턴된다.
Calendar today = Calendar.getInstance(); //싱글턴패턴
Calendar tomorrow = Calendar.getInstance(); //today와 같은 주소값을 가진다.
캘린더 클래스에는 스태틱 파이널(static final)변수들이 다수 존재한다.
i = today.get(Calendar.DATE);
System.out.println("이 달의 몇 일 : " + i);
i = today.get(Calendar.WEEK_OF_YEAR);
System.out.println("금년의 몇 째 주 : " + i);
i = today.get(Calendar.WEEK_OF_MONTH);
System.out.println("이 달의 몇 째 주 : " + i);
i = today.get(Calendar.DAY_OF_YEAR);
System.out.println("금년의 며칠째 : " + i);
System.out.println();
i = today.get(Calendar.DAY_OF_WEEK);
System.out.println("요일(1~7)" + i);
i = today.get(Calendar.DAY_OF_WEEK_IN_MONTH);
System.out.println("이 달의 몇 째 요일 : " + i); //두번째 화요일
System.out.println("이 달의 마지막 날 : " + today.getActualMaximum(Calendar.DATE));
System.out.println();
System.out.println("오전_오후(0:오전, 1:오후) : " + today.get(Calendar.AM_PM));
System.out.println("시간(0~11) : " + today.get(Calendar.HOUR));
System.out.println("시간(0~23) : " + today.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59) : " + today.get(Calendar.MINUTE));
System.out.println("초(0~59) : " + today.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999) : " + today.get(Calendar.MILLISECOND));
//프로그램이 시작되어 Calenday인스턴스가 만들어진 시점
//시:분:초:1/1000초
예제
date1과 date2에 설정된 날짜를 "000년 0월 0일 0요일" 형식으로 System.out.printf();안에 한번에 구성하여 출력하시오
날짜 설정은 set 메소드로 date1.set(년, 월, 일); 해주면 년월일이 모두 설정되고 변경하고 싶은 부분만 따로 변경 하는 방법은 아래 코드 참조
import java.util.Calendar;
public class CalendayClass02 {
static String[] weekday = {"","일", "월","화","수","목","금","토"};
public static void main(String[] args) {
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
//date1 달력 객체의 오늘 날짜를 2015년 8월 15일로 설정
date1.set(2015, 7, 15);
//set : 원하는 특정 날짜로 객체내 날짜 구성을 재설정, date2는 아직 오늘 날짜
//set 메서드에 필드명과 값을 넣어주면 해당 필드값만 변경됨
date2.set(Calendar.MONTH, 6); // -> 월만 7월로 바뀜 (월은 0~11)
}
public static void prnDate(Calendar a) {
System.out.printf("%d년 %d월 %d일 %s요일\n",
a.get(Calendar.YEAR), (a.get(Calendar.MONTH))+1, a.get(Calendar.DATE),
weekday[a.get(Calendar.DAY_OF_WEEK)]);
}
}
weekday 배열을 메인과 메서드에서 동시에 사용하려면 클래스의 static 멤버변수로 선언해준다.
예제2
시간 설정 후 출력하기 + 두 시간의 차이를 초 단위로 구하기.
import java.util.Calendar;
public class CalendayClass03 {
public static void main(String[] args) {
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY,10);
time1.set(Calendar.MINUTE,20);
time1.set(Calendar.SECOND,10);
time2.set(Calendar.HOUR_OF_DAY,20);
time2.set(Calendar.MINUTE,30);
time2.set(Calendar.SECOND,10);
printTime(time1);
printTime(time2);
System.out.println(time1.getTimeInMillis());
System.out.println(time2.getTimeInMillis());
long dif = (time2.getTimeInMillis() - time1.getTimeInMillis()) /1000;
System.out.println("time1과 time2의 차이는 " + dif+ "초입니다.");
}
public static void printTime(Calendar c) {
System.out.println("time : " + c.get(Calendar.HOUR_OF_DAY) + "시 "
+ c.get(Calendar.MINUTE) + "분 " + c.get(Calendar.SECOND) + "초 "
+ c.get(Calendar.MILLISECOND) + "(1/1000 초)\n");
}
}
milisecond는 1/1000초 이므로 1000으로 나눠주면 몇 초인지 알 수 있다.
add()와 roll()
import java.util.Calendar;
public class CalendayClass04 {
public static void main(String[] args) {
Calendar date = Calendar.getInstance();
date.set(2021,10,30);
System.out.println(toDate(date));
System.out.println("= 1일 후 =");
date.add(Calendar.DATE, 1);
System.out.println(toDate(date));
//add 메서드의 증감은 하나의 요소를 변경하지만 그로 인해 다른 필드에 영향을 줄 수 O
//11월 30일 +1일 => 12월 1일, 2021년 12월 +1월 => 2022년 1월
System.out.println("= 6달 후 =");
date.add(Calendar.MONTH, 6);
System.out.println(toDate(date));
System.out.println("= 40일 후(roll) =");
date.roll(Calendar.DATE, 40);
//다른 필드에 영향을 주지 않고 해당 필드만 더하고 빼는 메서드
// 3월 1일에 30일을 더하면 3월 31일이 되고 이후 10이 더해져 다시 10이 나옴
// 월에는 영향을 주지 않음
// roll -> 해당 월에서 뱅글뱅글 돌며 숫자세기
System.out.println(toDate(date));
}
public static String toDate(Calendar c) {
String cDate = c.get(Calendar.YEAR) + "년 "
+ (c.get(Calendar.MONTH)+1) + "월 "
+ c.get(Calendar.DATE) + "일\n";
return cDate;
}
}
roll메소드는 지정한 요소 이외에 변화가 일어나지 않고 add메소드는 3월 31일 +1일 -> 4월 1일 이 되는 식으로 다른 요소에도 변화를 줄 수 있다.
예제
Calendar 클래스를 이용하여 달력 출력하기
import java.util.*;
public class CalendayClass05 {
public static void main(String[] args) {
int year, month;
int input = 0;
Scanner sc = new Scanner(System.in);
System.out.printf("년도 입력 : ");
year = sc.nextInt();
System.out.printf("월 입력 : ");
month = sc.nextInt();
Calendar sDay = Calendar.getInstance();
Calendar eDay = Calendar.getInstance();
while(input != 3){
sDay.set(year, month-1, 1); //입력한 년, 월, 1일로 시작일 설정
eDay.set(year, month, 1); //입력한 월의 다음 달의 1일
eDay.add(Calendar.DATE, -1); //-1일을 계산해서 이달 말일로 설정
//sDay 1일의 요일 계산
int START_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
System.out.println("\n\t\t " + year +"년 "+month+"월 ");
System.out.println("----------------------------------------------------");
System.out.println("일\t월\t화\t수\t목\t금\t토");
System.out.println("----------------------------------------------------");
//1일자 까지 빈칸
for(int i=1; i<START_WEEK; i++) System.out.print("\t");
//1일부터 마지막 날짜까지 출력
for(int i=1; i<=eDay.get(Calendar.DATE); i++) {
System.out.printf("%2d\t", i);
if(START_WEEK++ % 7 == 0) System.out.println();
}
System.out.println("\n----------------------------------------------------");
System.out.println("\n[1.지난달][2.다음달][3.종료]");
input = sc.nextInt();
if(input == 1) {
if(month==1) {year--; month=12;}
else {month--;}
}
else if(input == 2) {
if(month==12) {year++; month=1;}
else {month++;}
}
}
}
}
Calendar 클래스의 메소드를 이용하여 while문의 조건문을 수정해 볼 수도있다.
import java.util.*;
public class CalendayClass05 {
public static void main(String[] args) {
int year, month;
int input = 0;
Scanner sc = new Scanner(System.in);
System.out.printf("년도 입력 : ");
year = sc.nextInt();
System.out.printf("월 입력 : ");
month = sc.nextInt();
Calendar sDay = Calendar.getInstance();
Calendar eDay = Calendar.getInstance();
sDay.set(year, month - 1, 1); // 입력한 년, 월, 1일로 시작일 설정
eDay.set(year, month, 1); // 입력한 월의 다음 달의 1일
eDay.add(Calendar.DATE, -1); // -1일을 계산해서 이달 말일로 설정
while (input != 3) {
// sDay 1일의 요일 계산
int START_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
System.out.println("\n\t\t " + sDay.get(Calendar.YEAR) + "년 " + (sDay.get(Calendar.MONTH) + 1) + "월 ");
System.out.println("----------------------------------------------------");
System.out.println("일\t월\t화\t수\t목\t금\t토");
System.out.println("----------------------------------------------------");
// 1일자 까지 빈칸
for (int i = 1; i < START_WEEK; i++)
System.out.print("\t");
// 1일부터 마지막 날짜까지 출력
for (int i = 1; i <= eDay.get(Calendar.DATE); i++) {
System.out.printf("%2d\t", i);
if (START_WEEK++ % 7 == 0)
System.out.println();
}
System.out.println("\n----------------------------------------------------");
System.out.println("\n[1.지난달][2.다음달][3.종료]");
input = sc.nextInt();
if (input == 1) {
sDay.add(Calendar.MONTH, -1);
eDay.add(Calendar.DATE, 1); // 원래 월의 1일자로 설정
eDay.add(Calendar.MONTH, -1); // 이전달 1일로 이동
eDay.add(Calendar.DATE, -1); // 전전달 말일로 이동
// 10월 31일에서 MONTH -1 하게되면 9월 31일은 존재하지 않으므로
// 에러가 발생할 수 있다. 그것을 방지하기 위해 위와 같은 방법을 사용
} else if (input == 2) {
sDay.add(Calendar.MONTH, 1);
eDay.add(Calendar.DATE, 1); // 원래 월의 1일자로 설정
eDay.add(Calendar.MONTH, 2); // 다다음달 1일로 이동
eDay.add(Calendar.DATE, -1); // 다음달 말일로 이동
}
}
}
}
결과는 같다.
sDay.add() 뿐만 아니라 eDay에도 add메소드를 사용하여 수정하는 방법을 기억하면 좋을 듯하다
Wrapper 클래스
Wrapper 클래스의 메소드
public class WrapperClass01 {
public static void main(String[] args) {
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
//참조변수들의 비교
if(i1 == i2) System.out.println("i1과 i2의 값이 같습니다.");
else System.out.println("i1과 i2의 값이 다릅니다.");
System.out.println("i1 == i2 ? " + (i1 == i2));
//실제 인스턴스에 저장된 값들의 비교
if(i1.equals(i2)) System.out.println("i1과 i2의 값이 같습니다.(equals)");
else System.out.println("i1과 i2의 값이 다릅니다.(equals)");
System.out.println("i1.equals(i2) = " + i1.equals(i2));
System.out.println("i1.compareTo(i2) = " + i1.compareTo(i2));
//실제 인스턴스에 저장된 값들의 비교 - 뺄셈연산으로 앞에 숫자가 크면 양수
//뒤에 숫자가 크면 음수반환, 같으면 0반환
//Object 부모 클래스의 오버라이딩
System.out.println("i1.toString() = " + i1.toString());
System.out.println("i2 = " + i2);
//toString()의 리턴값은 String이다.
//표현 가능한 가장 큰값와 작은수(스태틱변수)
System.out.println("MAX_VALUE = "+Integer.MAX_VALUE);
System.out.println("MIN_VALUE = "+Integer.MIN_VALUE);
//비트 바이트로 표현한 저장크기
System.out.println("SIZE = " + Integer.SIZE + "bits");
System.out.println("BYTES = " + Integer.BYTES + "bytes");
//자료형
System.out.println("TYPE = " + Integer.TYPE);
//int와 Integer의 호환성
int i = 10;
Integer inti = (Integer) i; //Integer inti = Integer.valueOf(i);
int i3 = inti+10;
System.out.println(i3);
Integer inti2 = new Integer(20);
System.out.println("inti2 = " + inti2);
int i4 = (int)inti2; //참조형을 기본형으로도 형변환 가능(생략가능)
System.out.println("i4 = " + i4);
Integer inti3 = inti2 + i3;
System.out.println("inti2 + i3 = " + inti3);
}
}
BigInteger
Integer가 가질 수있는 MAX, MIN값보다 더 큰 수를 담을 수 있는 데이터 타입 Long보다 큰 범위의 수를 저장할 수 있다. (import필요)
참조변수타입이므로 산술 연산자는 사용이 불가하므로 메소드를 사용해 연산해야한다.
//BigInteger의 초기화.
BigInteger fact = BigInteger.ONE;
//fact = 1; //err
System.out.println(fact); //1
BigInteger k = BigInteger.ONE;
System.out.println(k); //1
k = k.add(fact);
System.out.println(k); //2
BigInteger를 이용한 factorial 계산
import java.math.BigInteger;
public class WrapperClass02 {
public static void main(String[] args) {
BigInteger fact = BigInteger.ONE;
System.out.println(fact);
BigInteger k = BigInteger.ONE;
System.out.println(k);
k = k.add(fact);
System.out.println(k);
int n = 15;
for(k=BigInteger.ONE; k.compareTo(BigInteger.valueOf(n))<=0 ; k=k.add(BigInteger.ONE)) {
fact = fact.multiply(k);
}
System.out.printf("%d! = %s", n, fact.toString());
}
}
BigInteger은 참조변수타입이므로 정수와 연산되지 않는 것을 유념하고 for문의 조건식에서도 정수를 사용하지 않도록 주의한다.
int n = 40;
for(n=1; n<=40; n++) {
fact = BigInteger.ONE;
for(k=BigInteger.ONE; k.compareTo(BigInteger.valueOf(n))<=0 ; k=k.add(BigInteger.ONE)) {
fact = fact.multiply(k);
}
System.out.printf("%d! = %s\n", n, fact.toString());
}
1부터 40까지의 팩토리얼을 전부 출력해도 오버 플로우 없이 값이 잘 출력된다.
SimpleDateFormat 클래스
날짜를 형식에 맞춰 출력할 수 있게 해주는 클래스 Calendar와는 다르다
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatterClass01 {
public static void main(String[] args) {
//날짜 데이터 클래스, Calendar와는 다름
Date today = new Date();
System.out.println(today);
//날짜서식 클래스
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
//날짜데이터 서식 데이터에 맞춰서 적용 후 출력
System.out.println(sdf1.format(today));
//날짜 서식 레퍼런스 변수들
SimpleDateFormat sdf2, sdf3, sdf4, sdf5, sdf6, sdf7, sdf8, sdf9;
//서식 인스턴스 생성 및 저장
sdf2 = new SimpleDateFormat("yy년 MM월 dd일 E요일");
sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
sdf4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
//today적용 후 출력
System.out.println(sdf2.format(today));
System.out.println(sdf3.format(today));
System.out.println(sdf4.format(today));
}
}
y : 년도를 표시할 자리 수 문자 (yyyy : 2021, yy:21)
M : 월을 표시할 자리 수 문자 (MM : 01~12, M : 1~12)
d : 일을 표시할 자리 수 문자 (dd : 01~31, d : 1~31)
H : 시를 표시할 자리 수 문자 (HH : 01~23, H : 1~23)
h : 시를 표시할 자리 수 문자 (hh : 01~12, h : 1~12)
m : 분, s : 초, S: 밀리초, a : 오전/오후
sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
sdf8 = new SimpleDateFormat("오늘은 이 달의 W번째 주입니다.");
sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일입니다.");
System.out.println(sdf5.format(today));
System.out.println(sdf6.format(today));
System.out.println(sdf7.format(today));
System.out.println(sdf8.format(today));
System.out.println(sdf9.format(today));
Calendar로 얻은 오늘 날짜를 date를 통해 서식에 맞춰 출력하기
Calendar cal = Calendar.getInstance();
Date day = cal.getTime();
System.out.println(sdf1.format(day));
System.out.println(sdf2.format(day));
System.out.println(sdf3.format(day));
System.out.println(sdf4.format(day));
String 문자열을 Date 타입으로 변환하기
SimpleDateFormat에는 parse메서드를 이용하여 문자열을 날짜로 변환해주는 기능이 있다.
단, 설정된 서식을 반드시 지켜야 한다. (예외처리 필요 : throws ParseException)
서식을 잘못 입력 시 java.text.ParseException 에러가 발생한다.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatterClass02 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
String s2 = "2020/11/24";
Date d = sdf1.parse(s2);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy년 MM월 dd일");
System.out.println(sdf2.format(d));
}
}
10진수의 서식 출력
import java.text.DecimalFormat;
public class FormatterClass03 {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("0000");
DecimalFormat df1 = new DecimalFormat("0000.00");
DecimalFormat df2 = new DecimalFormat("0.00");
double number = 123.123456;
System.out.printf("%19s: %f -> %s\n", "0000", number, df.format(number));
System.out.printf("%19s: %f -> %s\n", "0000.00", number, df1.format(number));
System.out.printf("%19s: %f -> %s\n", "0.00", number, df2.format(number));
//자리가 모자라면 포맷을 무시하고 채워넣는다.
}
}
양식문자 0 : 표시할 숫자들의 자리표현 : 0=숫자 한자리 00=숫자 두자리 ....
표시할 숫자는 많은데 0의 갯수가 모자라면 필요한 만큼 0의 갯수를 자동으로 추가 적용한다.
(ex)숫자 12345, 양식 "000" => 출력 : 12345)
숫자 자리수보다 0의 갯수가 많으면 많은 만큼 0으로 채워서 표시
(ex)숫자 123, 양식 "00000" => 출력 : 00123)
소수점 아래에 대해서는 0의 갯수만큼만 소수점 아래 자리를 표시한다.
0의 갯수보다 소수점 아래자리가 많다면 반올림하여 표시된다.
0의 갯수가 소수점 아래자리보다 많다면 0을 채워 표시한다.
(ex)0.1234, "0.00" => 0.13, 0.1, "0.00" => 0.10)
number = 123456.71289;
df = new DecimalFormat("0.0000");
System.out.printf("%19s: %f -> %s\n", "0.000", number, df.format(number));