본문 바로가기
Java

Java_StringBuilder/Buffer, Date 클래스, Math 클래스

by 유서담 2023. 11. 16.

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