StringBuilder와 StringBuffer
- 임시저장소(버퍼)를 갖고 있어서, append(다양한 타입의 데이터)로 새로운 객체 생성없이 임시저장소에 데이터를 저장할 수 있다
- 임시저장소에 저장된 데이터는 toString() 메소드를 실행해서 문자열(String)로 제공받을 수 있다
- StringBuilder와 StringBuffer의 사용법은 완전히 동일하다
- StringBuffer는 멀티스레드 환경에서 안전하게 사용할 수 있지만 속도가 느리다
- StringBuilder는 멀티스레드 환경에서 안전하지 않지만, 속도는 빠르다
사용예제
int no = 100;
String name = "홍길동";
String tel = "010-1234-5678";
// 1. 덧셈 연산자를 이용해서 값을 이어붙이기
String text = "번호:" + no + ", 이름:" + name + ", 전화번호:" + tel;
System.out.println(text); // 번호:100, 이름:홍길동, 전화번호:010-1234-5678
// 2. StringBuilder 객체 활용하기
StringBuilder sb = new StringBuilder();
sb.append("번호:");
sb.append(no);
sb.append(", 이름:");
sb.append(name);
sb.append(", 전화번호:");
sb.append(tel);
String text2 = sb.toString();
System.out.println(text2); // 번호:100, 이름:홍길동, 전화번호:010-1234-5678
1. 덧셈 연산자를 이용해서 값을 이어붙이기
- 값의 갯수가 적을 때 사용하는게 좋다
- 값의 갯수가 많으면 덧셈을 여러 번 실행하게 되고, 덧셈이 실행될 때마다 새로운 String 객체가 생성되기 때문에 메모리 누수가 발생할 수 있다
2. StringBuilder 객체 활용하기
- StringBuilder는 객체 내부에 임시저장소를 가지고 있다
- append(값) 메소드를 사용해서 값을 추가하면 임시저장소에 저장될 뿐 새로운 객체가 생성되지는 않는다
StringBuilder를 통해서 Method Chaining(메소드 체이닝) 사용하기
StringBuilder sb = new StringBuilder();
String text = sb.append("번호:")
.append(no)
.append(", 이름:")
.append(name)
.append(", 번호:")
.append(tel)
.toString();
System.out.println(text); // 번호:100, 이름:홍길동, 번호:010-1234-5678
StringBuilder의 append( ) 메소드는 StringBuilder 객체를 반환한다.
따라서, append( ) 메소드의 실행결과가 StringBuilder 객체이기 때문에 append( ) 메소드에 이어서 다시 append( ) 메소드를 실행하는 것이 가능하다.
이런식의 실행방식을 Method Chaining(메소드 체이닝) 이라고 한다
// 위 코드블록과 다른 메소드 체이닝 예시
String text2 = "Hello, Java!"
.toUpperCase() // "HELLO, JAVA!"
.substring(0,5) // "HELLO"
.replace("H","*");// "*ELLO"
System.out.println(text2); // *ELLO
Date 클래스
- 시스템의 현재 날짜와 시간정보를 표현하는 클래스
- java.lang 패키지
자바의 날짜/시간 API
- java.util.Date : 날짜, 시간, 시간대 정보를 제공한다
- java.util.Calendar : 날짜, 시간, 날짜 조작과 관련된 다양한 메소드를 제공한다. ( 날짜에 대한 더 다양한 정보를 제공 )
- java.text.SimpleDateFormat : 날짜와 텍스트 변환을 지원한다
주요 생성자
- new Date( ) : 현재 날짜와 시간정보가 포함된 객체가 생성
- new Date(long 유닉스타임) : 지정된 유닉스타임에 해당하는 날짜와 시간정보가 포함된 객체가 생성
주요 메소드
- boolean after(Date when) : 지정된 날짜보다 이후 날짜인지 확인한다.
- boolean before(Date when) : 지정된 날짜보다 이전 날짜인지 확인한다
- int compareTo(Date other) : 지정된 날짜와 순서를 비교한다
- long getTime() : 유닉스타임을 반환한다
// 시스템의 현재 날짜와 시간정보를 가진 Date 객체를 생성
Date now = new Date();
System.out.println(now);
long unixTime = now.getTime();
System.out.println("유닉스타임:"+unixTime);
날짜와 시간정보를 지정된 포맷형식의 텍스트로 변환하기 ( SimpleDateFormat )
- Date 객체의 날짜와 시간정보를 지정된 포맷의 텍스트로 변환한다
주요 메소드
생성자
- SimpleDateFormat(String pattern) : 지정된 패턴으로 날짜와 텍스트간의 변환을 지원하는 객체를 생성
인스턴스 메소드
- String format(Date date) : Date 객체의 날짜와 시간정보를 생성자에게 지정한 패턴에 맞는 포맷형식의 텍스트로 변환해서 반환
- Date parse(String text) : 텍스트가 생성자에게 지정한 형식으로 작성된 날짜와 시간정보라면 텍스트에 해당하는 날짜와 시간정보를 가진 Date 객체로 변환해서 반환
각종 패턴
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd");
String text = sdf.format(now);
System.out.println(text); // 2023-11-15
sdf.applyPattern("yyyy-M-d");
String text2 = sdf.format(now);
System.out.println(text2); // 2023-11-15
sdf.applyPattern("yyyy년 M월 d일");
String text3 = sdf.format(now);
System.out.println(text3); // 2023년 11월 15일
sdf.applyPattern("M월 d일 E");
String text4 = sdf.format(now);
System.out.println(text4); // 11월 15일 수
sdf.applyPattern("M월 d일 EEEE");
String text5 = sdf.format(now);
System.out.println(text5); // 11월 15일 수요일
sdf.applyPattern("HH:mm:ss");
String text6 = sdf.format(now);
System.out.println(text6); // 15:27:56
sdf.applyPattern("hh:mm:ss");
String text7 = sdf.format(now);
System.out.println(text7); // 03:29:18
sdf.applyPattern("a h시 m분 s초");
String text8 = sdf.format(now);
System.out.println(text8); // 오후 3시 31분 5초
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
String text9 = sdf.format(now);
System.out.println(text9); // 2023-11-15 15:33:26
String text10 = DateUtils.dateToString(now);
System.out.println(text10);
String textDetail = DateUtils.dateToDetailString(now);
System.out.println(textDetail);
Time 클래스
- LocalDate.now() : 현재 날짜 정보를 가진 LocalDate 객체
- LocalTime.now() : 현재 시간 정보를 가진 LocalTime 객체
- LocalDateTime() : 현재 날짜와 시간 정보를 가진 LocalDateTime 객체
- LocalDate.of(년도, 월, 일) : 지정된 날짜 정보를 가진 LocalDate 객체
- LocalDate.of(년도, 월, 일, 시, 분, 초) : 지정된 날짜와 시간 정보를 가진 LocalDateTime 객체
날짜에 특정 기간을 적용하기
- LocalDate.now().plusDays(일) : 현재 날짜에 plusDays(일) 만큼 더한다
- LocalDate.now().plusWeeks(주) : 현재 날짜에 plusWeeks(주) 만큼 더한다
- LocalDate.now().plusMonths(월) : 현재 날짜에 plusMonths(월) 만큼 더한다
- LocalDate.now().minusDays(일) : 현재 날짜에 minusDays(일) 만큼 뺀다
- LocalDate.now().minusDays(주) : 현재 날짜에 minusDays(주) 만큼 뺀다
- LocalDate.now().minusDays(월) : 현재 날짜에 minusDays(월) 만큼 뺀다
두 날짜 사이의 기간을 조회하기
LocalDate today = LocalDate.now();
LocalDate birthDay = LocalDate.of(1997, 2, 12);
long years = ChronoUnit.YEARS.between(birthDay, today);
long months = ChronoUnit.MONTHS.between(birthDay, today);
long days = ChronoUnit.DAYS.between(birthDay, today);
- ChronoUnit.YEARS.between(시작일자, 종료일자) : 시작일자에서 종료일자를 뺀 년 수
- ChronoUnit.MONTHS.between (시작일자, 종료일자) : 시작일자에서 종료일자를 뺀 월 수
- ChronoUnit.DAYS.between (시작일자, 종료일자) : 시작일자에서 종료일자를 뺀 일 수
문자열로 변환하기
날짜값.format(DateTimeFormatter.ofPattern(원하는 패턴)) : 날짜값에 대한 원하는 패턴으로 변환
Math 클래스
- 수학연산과 관련된 기능을 제공하는 클래스
- 상수와 클래스 메소드만으로 구성되어 있다
주요 메소드
- int abs(값) / long abs(값) / double abs(값) : 절대값을 반환한다
System.out.println("절대값: "+Math.abs(10.5)); // 절대값: 10.5
System.out.println("절대값: "+Math.abs(-10)); // 절대값: 10
- int min(값1, 값2) / long min(값1, 값2) / double min(값1, 값2) : 두 수 중에서 작은 숫자를 반환한다
- int max(값1, 값2) / long max(값1, 값2) / double max(값1, 값2) : 두 수중에서 큰 숫자를 반환한다
System.out.println("작은 수: "+Math.min(10, 50)); // 작은 수: 10
System.out.println("큰 수: "+Math.max(10, 50)); // 큰 수: 50
- double pow(double a, double b) : a의 값을 b의 값만큼 제곱한 수를 반환한다
System.out.println("1번째의 값을 2번째의 값만큼 곱한 값: "+Math.pow(2, 4));
// 1번째의 값을 2번째의 값만큼 곱한 값: 16.0
- int round(float x) / long round(double x) : 반올림된 값을 반환한다 ( 일의 자리수로 반올림 )
System.out.println("반올림: "+Math.round(3.14)); // 반올림: 3
System.out.println("반올림: "+Math.round(7.85)); // 반올림: 8
- double floor(double x) : 내림함수 (전달받은 실수값에 대한 내림값을 반환)
- double ceil(double x) : 올림함수 (전달받은 실수값에 대한 올림값을 반환)
System.out.println("내림함수: "+Math.floor(5.7)); // 내림함수: 5.0
System.out.println("내림함수: "+Math.floor(8.1)); // 내림함수: 8.0
System.out.println("올림함수: "+Math.ceil(8.9)); // 올림함수: 9.0
System.out.println("올림함수: "+Math.ceil(2.5)); // 올림함수: 3.0
Random 클래스
int nextInt(int bound)
- 임의의 정수를 반환한다 ( bound의 값은 포함하지 않는다 )
- 정수값의 범위는 0 <= 정수 < bound
// 0부터 9까지의 랜덤한 값
System.out.println(random.nextInt(10)); // 5
System.out.println(random.nextInt(10)); // 9
System.out.println(random.nextInt(10)); // 1
// 1 ~ 45 사이의 임의의 값을 조회하기
for(int i=0; i<6; i++) {
int num = random.nextInt(45)+1;
System.out.println(num);
}
// 로또번호 출력 ( 임의의 숫자 6개 출력하기 )
// 로또번호를 중복없이 추출하고, 추출한 결과를 오름차순으로 정렬하기
int[] lotto = new int[6];
int position = 0;
while(true) {
// 번호 뽑기
int num = random.nextInt(45)+1;
// 중복검사 및 번호 저장하기
if (position == 0) {
lotto[position++] = num;
} else {
// 중복여부를 저장하는 플래그 변수다. 기본값은 false다.
boolean isExist = false;
for(int i=0; i<position; i++) {
if(lotto[i] == num) {
isExist = true;
break;
}
}
// isExist가 false면 배열에 번호를 저장한다.
if(!isExist) {
lotto[position++] = num;
}
}
// position 값이 6이면 lotto배열에 모든 숫자가 채워졌다
if (position == 6) {
break;
}
}
// 배열의 값을 오름차순으로 정렬한다
Arrays.sort(lotto);
System.out.println("로또번호 : "+Arrays.toString(lotto));
'Java' 카테고리의 다른 글
Java_Collection Framework, Iterator (0) | 2023.11.21 |
---|---|
Java_제네릭(Generic) (0) | 2023.11.17 |
Java_Wrapper 클래스 (0) | 2023.11.16 |
Java_String 클래스 (0) | 2023.11.14 |
Java_Object 클래스, Java API (0) | 2023.11.14 |