개발자/JAVA
[JAVA 13일차] StringBuilder/reverse/replace/Date/Calendar/현재시각,어제시각,내일시각
GoGo개발
2022. 8. 25. 21:45
StringBuilder
먼저 StringBuilder의 객체를 생성한 후, append()의 인자로 연결하고자 하는 문자열을 넣어서 StringBuilder의 객체를 통해 호출한다. 그리고 출력 시에는 toString()을 붙여야 하고, String 변수에 넣을 때도 마찬가지다. Stirng은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 준다.
<메모리문제>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
String name = "일순신"; //메모리상에 name 1개 소모
name += ", 일순신"; //메모리상에 name 1개 소모
name += ", 이순신"; //메모리상에 name 1개 소모
name += ", 삼순신"; //메모리상에 name 1개 소모
name += ", 사순신"; //메모리상에 name 1개 소모
name += ", 오순신";
name += ", 육순신";
name += ", 칠순신";
name += ", 팔순신";
name += ", 구순신";
// 누적되어진 메모리상의 name 은 9개가 소모된다고 한다.
System.out.println(name);
//일순신,이순신,삼순신,사순신,오순신,육순신,칠순신,팔순신,구순신
|
cs |
<stringBuilder> 사용시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
StringBuilder sb = new StringBuilder (); // 단일 스레드(single thread)에서만 사용되어지므로 주로 웹에서
//StringBuilde 가 StringBuffer 보다 상대적으로 더 가볍다.
//StringBuffer sb = new StringBuffer (); // 단일 스레드(single thread) 및 다중 스레드(Multi thread)를 지원해주므로 주로 게임에서 많이 쓰인다.
//StringBuffer와 StringBuilder는 사용방법이 같다.
sb.append("일순신");
sb.append(",이순신");
sb.append(",삼순신");
sb.append(",사순신");
sb.append(",오순신");
sb.append(",육순신");
sb.append(",칠순신");
sb.append(",팔순신");
sb.append(",구순신");
sb.toString();
System.out.println(sb.toString());
|
cs |
출력값 : 일순신,이순신,삼순신,사순신,오순신,육순신,칠순신,팔순신,구순신
<초기화 방법 1>
1
2
3
4
|
1. StringBuilder 의 초기화 하는 첫번째 방법
sb = new StringBuilder();
|
cs |
<초기화 방법2>ㄱ
1
2
3
4
5
6
7
8
9
10
11
|
2. StringBuilder 의 초기화 하는 두번째 방법
sb.setLength(0); // 길이를 0으로 하면 된다.
sb.append("일은우");
sb.append(",이은우");
sb.append(",삼은우");
sb.append(",사은우");
sb.append(",차은우");
System.out.println(sb.toString());
|
cs |
reverse
스트링 문자열을 뒤집어주는 메소드이다. reverse메소드를 제공해주는 StringBuilder/StringBuffer 클래스를 이용한다. : sb.reverse().toString();
<문자열 뒤집기>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// === StringBuilder 를 사용하여 문자열을 거꾸로 만들기 ===
String str = "안녕하세요";
sb = new StringBuilder(str);
System.out.println("###################");
System.out.println(sb.toString());
System.out.println(sb); //tostring 안하먄 생략되어진것. 원래 써주는게원칙
System.out.println("###############");
System.out.println(sb.reverse().toString()); // 클릭해서 찍어주기?
// "요세하녕안"
// === StringBuider 를 사용하여 특정위치에 존재하는 문자열을 다른 문자열로 바꾸기 ===
str = "안녕하세요? 호호호 안녕하십니까? 안녕히 가세요~~";
// str 변수에 들어있는 두번째 "안녕"을 "Hello" 로 바꾸기
sb = new StringBuilder(str);
System.out.println(sb.replace(11, 13, "Hello").toString());
//안녕하세요 호호호 안Hello십니까? 안녕히 가세요~~
//sb.replace(11, 13, "Hello") 은 sb에 저장된 문자열인 "안녕하세요? 호호호 안녕하십니까? 안녕히
|
cs |
Date
: 1일차,2일차 포스팅을 참고하자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 자바에서 날짜를 나타낼때는 Date, Calendar 를 사용한다.
// === 1. Date 클래스를 사용하여 현재시각 나타내기 ===
Date now = new Date(); // 현재시각
System.out.println("1. 현재시각 : " + now);
// 1. 현재시각 : Mon Jun 20 11:16:57 KST 2022
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("2. 현재시각 : " + df.format(now) );
// 2. 현재시각 : 2022-06-20 11:16:57
String currentTime = String.format("%tF %tT %tA %tZ", now, now, now, now);
System.out.println("3. 현재시각 : " + currentTime);
// 3. 현재시각 : 2022-06-20 11:16:57 월요일 KST
/*
<참고>
날짜 타입 format 설명
--------------------------------------------------
%tF 날짜를 yyyy-mm-dd 형식으로 포맷해주는 것
%tT 날짜의 시각을 HH:MM:SS 형식으로 포맷해주는 것
%tp 오전, 오후를 출력
%tA 요일명 출력
%tY 4자리 년도만 출력
%tB 월의 이름(January, February ...)출력
%tm 월의 01,02,03 ~~ 10,11,12 로 출력
%td 일수를 1~31 로 출력
%te %td와 동일함
%tk 시간을 0~23 으로 출력
%tl 시간을 1~12 으로 출력
%tM 분을 00~59 으로 출력
%tS 초를 00~59 으로 출력
%tZ 타임존을 출력(한국은 KST로 나옴).
*/
|
cs |
Calendar
Date 클래스 보다 조금 더 향상시켜서 나온 것이 Calendar 클래스 이다.
간단한 날짜표현에는 Date 클래스를 사용하는 것이 더 나을 수 있으며, 두 개 날짜사이의 날짜연산을 할 경우에는 메소드 기능이 더 많이 추가된 Calendar 클래스를 사용하는 것이 나을 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
Calendar currentDate = Calendar.getInstance();
// 현재날짜와 시간을 얻어온다.
int year = currentDate.get(Calendar.YEAR);
int month = currentDate.get(Calendar.MONTH);
int month_2 = (currentDate.get(Calendar.MONTH)+1);
/*
주의해야할 것은 get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12가 아닌, 0~11 이라는 것이다.
그래서 get(Calendar.MONTH)로 얻어오는 값이 0이면 1월을 의미하고 11이면 12월을 의미한다.
그러므로 현재월을 표현하려면 ( currentDate.get(Calendar.MONTH) + 1 ) 으로 해야한다.
괄호없이 currentDate.get(Calendar.MONTH) + 1로 하면 이상한 값이 나온다. (괄호유무조심!!)
*/
String str_month = (month_2<10)?"0"+month_2:String.valueOf(month_2);
System.out.println("올 해의 년도 : " + year); // 올 해의 년도 : 2022
System.out.println("월(0~11, 0=>1월) : " + month); // 월(0~11, 0=>1월) : 5
System.out.println("월(1~12) : " + str_month); // 월(1~12) : 06
System.out.println("이 해의 몇 째 주: " + currentDate.get(Calendar.WEEK_OF_YEAR)); // 이 해의 몇 째 주: 26
System.out.println("이 달의 몇 째 주: " + currentDate.get(Calendar.WEEK_OF_MONTH)); // 이 달의 몇 째 주: 4
// 아래의 Calendar.DATE 와 Calendar.DAY_OF_MONTH 는 같은 것이다.
int day = currentDate.get(Calendar.DATE);
String strDay = day<10?"0"+day: String.valueOf(day); //Integer.toString(day); 도 가능하다
System.out.println("이 달의 몇 일: " + currentDate.get(Calendar.DATE)); // 20
System.out.println("이 달의 몇 일: " + currentDate.get(Calendar.DAY_OF_MONTH)); // 20
System.out.println("이 달의 몇 일: " + strDay);
System.out.println("이 해의 몇 일: " + currentDate.get(Calendar.DAY_OF_YEAR)); // 171 오늘은 2022년 6월20일 인데 2022년 1월1일 부터 171일째 되는 날이다는 말이다.
|
cs |
<요일 나타내기>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 1:일요일, 2:월요일, 3:화요일, 4:수요일, 5:목요일, 6:금요일, 7:토요일
System.out.println("요일(1~7, 1:일요일): " + currentDate.get(Calendar.DAY_OF_WEEK)); // 2 2이므로 월요일이다.
System.out.println("이 달의 몇 째 요일: " + currentDate.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 3 오늘은 월요일인데 2022년 5월에서 3번째 월요일이다는 말이다.
String dayname = "";
switch (currentDate.get(Calendar.DAY_OF_WEEK)) {
case 1:
dayname = "일";
break;
case 2:
dayname = "월";
break;
case 3:
dayname = "화";
break;
case 4:
dayname = "수";
break;
case 5:
dayname = "목";
break;
case 6:
dayname = "금";
break;
case 7:
dayname = "토";
break;
}
System.out.println("오늘은 " +dayname+"요일 입니다.");
// 오늘은 월요일 입니다.
|
cs |
<시각 나타내기>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
System.out.println("오전_오후(0:오전, 1:오후): " + currentDate.get(Calendar.AM_PM)); // 현재가 오전 11시 49분 이므로 0 이다.
System.out.println("시간(0~11): " + currentDate.get(Calendar.HOUR));
System.out.println("시간(0~23): " + currentDate.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59): " + currentDate.get(Calendar.MINUTE));
System.out.println("초(0~59): " + currentDate.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999): " + currentDate.get(Calendar.MILLISECOND));
// 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60 * 60초)
System.out.println("TimeZone(-12~+12): " + (currentDate.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
// 이 달의 마지막 일을 찾는다.
System.out.println("이 달의 마지막 날: " + currentDate.getActualMaximum(Calendar.DATE) );
System.out.println("\n===============================================\n");
currentDate = Calendar.getInstance(); // 현재시간
SimpleDateFormat dateft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// === 어제시각 나타내기 ===
currentDate.add(Calendar.DATE, -1);
System.out.println("어제시각 => " + dateft.format(currentDate.getTime())); // 캘린더가 데이트로 바뀐다
// dateft.format(Date date)이므로 Calendar currentDate 을 Date 형식으로 바꾸어주는 것이
// currentDate.getTime()이다.
// 어제시각 => 2022-06-19 14:14:40
// === 현재시각 나타내기 ===
currentDate = Calendar.getInstance();
System.out.println("현재시각 => " + dateft.format(currentDate.getTime()));
// 현재시각 => 2022-06-20 14:17:24
// === 내일시각 나타내기 ===
currentDate.add(Calendar.DATE, 1);
System.out.println("현재시각 => " + dateft.format(currentDate.getTime()));
// 현재시각 => 2022-06-21 14:17:24
|
cs |
<어제시각, 현재시각, 내일시각>