java.base 모듈

이동주·2025년 3월 12일

JAVA

목록 보기
22/30

API 도큐먼트

  • Application Promgraming Information
  • 자바 표준 모듈에서 제공하는 라이브러리를 쉽게 찾아서 사용할 수 있도록 도와주는 문서
  • 자바 구문을 익히기 위해 활용하는 것이 좋음!
  • https://docs.oracle.com/en/java/javase/index.html

Java.base 모듈

  • 모든 모듈이 의존하는 기본 모듈
  • 모듈 중 유일하게 requires(요청)하지 않아도 사용이 가능함 (기본 패키지이기 때문에 그렇다)

java.base 모듈 종류

Java.lang 패키지

  • 자바 언어의 기본적인 클래스를 담고 있는 패키지
  • 이 패키지에 있는 클래스와 인터페이스는 import없이 사용 가능!
  • 모든 자바파일에 기본으로 포함되있음!

java.lang 클래스 종류

Object 클래스

  • 자바에서 최상위 클래스로 모든 클래스의 부모 역할을 함
    -> 자바의 모든 클래스는 Object의 자식 또는 자손 클래스
    -> 클래스를 선언할 때 extends를 사용해 다른 클래스를 상속하지 않으면 자동적으로 Object 클래스 상속

객체 동등 비교

  • Object의 equals() 메소드 : 객체의 번지를 비교하여 boolean 값 리턴
    -> public boolean equals(Object obj)
    -> 객체의 주소를 비교하는 ==과는 달리 문자열 자체를 비교
  • equals 함수 만들기 : 우클릭 > Source > Generate hashCode and equals > Generate
package ch12.sec03.exam01;

public class Member {
	public String id;
	
	// 생성자	
	public Member(String id) {
		this.id = id;
	}
	
	// Object 클래스의 equals 메소드 재정의
	// Object 타입의 매개변수를 가짐
	@Override
	public boolean equals(Object obj) {
		// Object 객체를 Member(현재 객체) 객체의 타입으로 변환이 가능하면 강제 형변환 실행
		// Object는 모든 클래스의 부모와 같은 존재 : 변환이 가능
		if(obj instanceof Member target) {
			if(id.equals(target.id)) {
				// id와 입력받은 문자열이 같은지!
				return true;
			}
		}
		return false;
	}
}
package ch12.sec03.exam01;

public class EqualsExam {
	public static void main(String[] args) {
		Member obj1 = new Member("이동주");
		Member obj2 = new Member("이동주");
		Member obj3 = new Member("야호");
		
		// equals : 문자열 동일 여부 확인
		if(obj1.equals(obj2)) {
			System.out.println("두 문자열 동일");
		}
		else {
			System.out.println("두 문자열 동일하지 않음");
		}
		
		// equals : 문자열 동일 여부 확인
		// obj1과 obj3의 문자열이 다름
		if(obj1.equals(obj3)) {
			System.out.println("두 문자열 동일");
		}
		else {
			System.out.println("두 문자열 동일하지 않음");
		}
	}
}

객체 해시코드

  • 객체를 식별하는 정수 (참조변수에서만 사용)
  • Object의 hashCode() 메소드 : 객체의 메모리 번지(주소)를 이용해서 해시코드를 생성
    -> 객체마다 다른 정수값을 리턴
    -> hashCode()가 리턴하는 정수값이 같은지 확인 후 equals() 메소드가 true를 리턴하는지 확인해서 동등 객체임을 판단
    -> hashCode()를 먼저 만들어서 객체의 주소를 리턴
  • hashCode 함수 만들기 : 우클릭 > Source > Generate hashCode and equals > Generate
package ch12.sec03.exam02;

import java.util.Objects;

public class Student {
	private int no;
	private String name;
	
	// 생성자
	public Student(int no, String name) {
		this.no = no;
		this.name = name;
	}
	
	// getNo() = no 필드 값
	public int getNo() {
		return no;
	}
	
	// getName() = name 필드 값
	public String getName() {
		return name;
	}

	// Object 객체의 hashCode() 메소드를 재정의
	// 객체의 주소를 나타내는 코드
	@Override
	public int hashCode() {
		int hashCode = no + name.hashCode();
		// no에 입력된 필드와 name의 객체 번지(주소)를 더한 값
		return hashCode;
	}

	
	// Object 객체의 equals() 메소드를 재정의함
	@Override
	public boolean equals(Object obj) {
		// Object 타입을 Student 타입으로 변환 가능하면 target 참조변수에 저장
		if(obj instanceof Student target) {
			if(no == target.getNo() && name.equals(target.getName())) {
			// no 필드값과 getNo의 값이 같거나, name 필드와 getName의 문자열이 같을 때
			// 숫자와 문자열의 비교를 연산자로 처리할 때 숫자 연산자를 먼저 처리해줘야 함
				return true;
			}
		}
		return false;
	}
	
	
}
package ch12.sec03.exam02;

public class HashCodeExample {

	public static void main(String[] args) {
		Student s1 = new Student(1, "홍길동");
		Student s2 = new Student(1, "홍길동");
		
		// 해시코드가 동일한지 (객체의 내부의 값이 같은지) 검사함 (숫자 형태로 반환되기 때문에 == 연산자 써줌)
		if(s1.hashCode() == s2.hashCode()) {
			// s1과 s2의 문자열이 같은지 검사
			if(s1.equals(s2)) {
				System.out.println("동등 객체입니다");
			}
			else {
				System.out.println("데이터가 다르므로 동등 객체가 아닙니다");
			}
		}
		
		else {
			System.out.println("해시코드가 다르므로 동등 객체가 아닙니다.");
		}
	}

}

hashSet

  • 동등 객체를 중복 저장하지 않는 특성을 가짐
  • 중복을 허용하지 않는 데이터 집합을 저장할 때 사용하며, HashMap을 이용하여 요소를 저장함
package ch12.sec03.exam02;

import java.util.HashSet;

public class HashSetExample {
	public static void main(String[] args) {
		HashSet hashSet = new HashSet();
		// HashSet : 중복된 데이터를 저장하지 않음
		
		Student s1 = new Student(1, "이동주");
		hashSet.add(s1);
		// .add : HashSet에 값을 추가해줌
		System.out.println("저장된 객체 수: " + hashSet.size());
		// .size : HashSet에 저장된 해당 값의 갯수를 반환함
		
		Student s2 = new Student(1, "이동주");
		hashSet.add(s2);
		// s1과 같은 값이 들어갔기 때문에 중복 데이터가 저장이 되지 않는 HashSet 특성상
		// 데이터가 저장되지 않음
		System.out.println("저장된 객체 수: " + hashSet.size());
		// 위의 값과 동일함
		
		Student s3 = new Student(2, "이동주");
		hashSet.add(s3);
		// 동일한 값이 없으므로 HashSet에 값이 저장됨
		System.out.println("저장된 객체 수: " + hashSet.size());
	}
}

객체 문자 정보

  • 객체를 문자열로 표현한 값
  • Object의 toString() 메소드 : 객체의 문자 정보를 리턴함
    -> 기본적으로 Object의 문자열은 클래스명@16진수 해시코드 형태로 리턴함
    -> 위와 같이 구성된 해시코드 형태를 문자열 형태로 출력하는 역할
package ch12.sec03.exam03;

public class Dongju {
	private String name;
	private int age;
	
	public Dongju(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// String 클래스의 toString() 메소드를 재정의함
	@Override
	public String toString() {
		return "이름: " + name + " 나이: " + age;
		// 객체의 문자 정보를 리턴함
		// 형태는 클래스명@16진수해시코드
		// 해당 메소드를 사용함으로써 위와 같은 형태를 문자열로 반환함
	}
}
package ch12.sec03.exam03;

public class ToStringExam {
	public static void main(String[] args) {
		Dongju dj = new Dongju("이동주", 26);
		
		String strdj = dj.toString();
		System.out.println(strdj);
		System.out.println(dj);
	}
}

레코드 선언

  • getter와 비슷한 개념으로 데이터를 읽는 형태로만 사용함
  • 데이터 전달을 위해 반복적으로 작성하는 코드를 줄이기 위해 도입됨
  • 클래스 대신 사용하는 형태로, 객체를 생성할 때 매개변수를 반드시 줘야 함!
  • 매개 변수를 "."으로 나누어 메소드 형태로 나눔
  • 컴파일러가 toString 함수를 만들어주기 때문에 toString을 사용하여 전체 매개변수를 문자열로 출력
  • 함수 형태로 접근해주기
package ch12.sec03.exam04;

public record Member(String id, String name, int age) {
	// class 대신 record를 사용하며, 데이터를 읽는 용도로 사용
	// getter와 개념이 비슷함
}
package ch12.sec03.exam04;

public class RecordExample {
	public static void main(String[] args) {
		Member m = new Member("dj", "이동주", 25);
		// record 객체 생성도 객체 생성하는 방식과 똑같음
		
		// 매개값을 .으로 나누어 메소드로 만듦
		System.out.println(m.id()); // dj
		System.out.println(m.name()); // 이동주
		System.out.println(m.age()); // 25
		System.out.println(m.toString());
		// record에 저장된 모든 값을 합쳐서 문자열 형태로 필드명과 같이 출력
		
		Member m1 = new Member("hong", "홍길동", 30);
		Member m2 = new Member("hong", "홍길동", 30);
		// 같은 매개값을 가지는 객체 2개를 생성
		
		System.out.println("m1.hashCode(): " + m1.hashCode());
		System.out.println("m2.hashCode(): " + m2.hashCode());
		// m1과 m2의 해시코드를 출력, 두 객체의 값이 모두 같기 때문에
		// 해시코드도 동일하게 나옴
		
		System.out.println("m1.equals(m2): " + m1.equals(m2));
		// m1과 m2의 매개값이 동일한지 여부를 확인
		// 동일함
	}
}

롬복 사용

  • eclipse 자체적으로 코드를 만들어주는 역할을 함
  • Getter, setter, hashCode, equals, toString 메소드를 자동 생성하는 역할을 함
  • 롬복 설치 후 lombok.Data를 임포트해주고, class 위에 @Data를 적어주면 위의 코드들을 한 번에 불러옴

롬복 어노테이션

  • @Data : getter, setter, hashCode, equals, toString 메소드를 자동으로 생성함
  • @AllArgsConstructor : 모든 필드를 매개변수로 받는 역할
  • @NoArgsConstructor : 매개변수가 없는 기본 생성자를 자동적으로 생성
  • @Builder : 설정한 값을 명확하게 지정하는 기능을 가짐

Lombok 다운로드 및 설치, 적용

설치

  1. cmd창에서 다운받은 lombok.jar 파일이 있는 폴더로 이동하여
    java -jar lombok.jar 입력
  1. 1번과 같이 입력하면 설치 창이 뜸, eclipse가 설치된 주소가 맞는지 확인 후 설치

  1. Lombok을 해당 javaProject 파일에 적용함
    -> 해당 자바프로젝트에 파일 생성 및 lombok.jar 붙여넣기
    -> lombok.jar 우클릭 > Build Path > Add to Build Path
package ch12.sec10;

import java.util.regex.Pattern;

public class PatternExample {
	public static void main(String[] args) {
		String regExp = "(02|010)-\\d{3,4}-\\d{4}";
		// \d : 숫자
		// {a,b} : 길이(a자리 또는 b자리)
		String data = "02-123-4567";
		boolean result = Pattern.matches(regExp, data);
		// Pattern.matches : 정규 표현식 (전화번호나 이메일 등을 주로 사용)
		if(result) {
			System.out.println("정규식과 일치합니다.");
		} else {
			System.out.println("정규식과 일치하지 않습니다.");
		}
			
		// chatgpt로 만들기!! ㅋ
		regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
		// \w : 영문자, 숫자 포함
		// + : 한 개 이상
		// . : .이 있음
		// ? : 없어도 있어도 됨
		
		data = "angel@mycompanycom";
		result = Pattern.matches(regExp, data);
		if(result) {
			System.out.println("정규식과 일치합니다.");
		} else {
			System.out.println("정규식과 일치하지 않습니다.");
		}
	}
}
package ch12.sec03.exam05;

public class LombokExam {
	public static void main(String[] args) {
		Member m1 = new Member();
		System.out.println(m1);
		// 생성자에 아무 값도 넣지 않았기 때문에 모두 null 값이 나옴
		
		Member m2 = new Member("dj", "이동주", 26);
		System.out.println(m2);
		// 생성자에 매개값을 타입과 개수를 알맞게 넣어줬기 때문에
		// 정상적으로 값이 나옴
		
		System.out.println("id= " + m2.getId());
		System.out.println("name= " + m2.getName());
		System.out.println("age= " + m2.getAge());
		// 매개값을 나누어 각각의 메소드로 생성하였음
		// 따라서 get 메소드를 통해 값을 받아올 수 있음
		
		Member m3 = Member.builder()
				.id("djdj")
				.name("이똥주")
				.age(25).build();
		// builder 메소드 
		// @Builder 어노테이션을 생성하면 자동적으로 만들어지는 메소드
		// 메소드 내에 새로운 값을 넣어 객체를 다시 생성함
		// 구조 : 클래스명.builder().매개변수1().매개변수2().build();
		// 마지막에 build()를 넣어야 함
		
		System.out.println(m3);
	}
}

System 클래스

  • System 클래스의 정적필드와 메소드를 이용하면 프로그램 종료, 키보드 입력, 콘솔 출력, 현재 시간 읽기, 시스템 프로퍼티 읽기 등이 가능함

err

package ch12.sec04;

public class ErrExample {
	public static void main(String[] args) {
		try {
			int value = Integer.parseInt("1oo");
		}
		catch(Exception e) {
			System.err.println("에러 내용");
			System.err.println(e.getMessage());
		}
		// err : 콘솔에 빨간 글씨 출력
	}
}

exit()

package ch12.sec04;

public class ExitExam {
	public static void main(String[] args) {
		for(int i=0;i<10;i++) {
			System.out.println(i);
			if(i==5) {
				System.out.println("프로세스 강제 종료");
				System.exit(0);
				// exit(0) : 정상 종료
				// exit(1)/ exit(-1) : 비정상종료
			}
		}
	}
}

GetProperty

package ch12.sec04;

public class GetPropertyExam {
	public static void main(String[] args) {
		
		int a = Integer.parseInt(System.getenv("DJ_A"));
		int b = Integer.parseInt(System.getenv("DJ_B"));
		// .getenv : 환경 변수 안의 값을 불러옴
		// 환경변수 설정 후에는 eclipse를 재시작하기
		
		System.out.println(a + b);
		
		// System.getProperty : 운영체제 및 사용자 정보 출력 메소드
		System.out.println(System.getProperty("os.name"));
		// os.name : 운영체제 정보 출력
		System.out.println(System.getProperty("user.name"));
		// user.name : 사용자 계정 출력
		System.out.println(System.getProperty("user.home"));
		// user.home : 사용자 계정 경로 출력
	}
}

nanoTime

package ch12.sec04;

public class MeasureRunExam {
	public static void main(String[] args) {
		long time1 = System.nanoTime();
		int sum = 0;
		for(int i=1;i<100000;i++) {
			sum += i;
		}
		long time2 = System.nanoTime();
		// .nanoTime() : 현재 시간을 나노초 단위로 표현
		// 밀리초 단위인 .currentTimeMillis()를 사용할 수 있지만 정밀성이 떨어짐
		
		System.out.println("합= " + sum);
		System.out.println("계산하는데 소요된 시간(나노초)= " + (time2-time1));
	}
}

String 클래스

  • String 클래스는 문자열을 저장하고 조작할 때 사용
  • 문자열 리터럴은 자동으로 String 객체로 생성함
  • String 클래스의 다양한 생성자를 이용하여 직접 객체를 생성할 수 있음
  • 한글 한 자를 UTF-8(전세계적으로 사용)로 인코딩하면 3바이트가 되고, EUC-KR(한국에서만 사용)로 인코딩하면 2바이트가 된다
package ch12.sec05;

import java.util.Arrays;

public class StringExam {
	public static void main(String[] args) throws Exception{
		// 예외는 던짐
		String data = "자바";
		
		// 문자열을 byte 타입의 배열로 변환
		byte[] arr1 = data.getBytes();
		// 문자열의 각 문자들을 하나의 byte형태의 숫자로 쪼개 배열의 형태로 표현
		System.out.println(Arrays.toString(arr1));
		
		// byte 타입의 배열에서 문자열로 변환 (UTF-8 인코딩)
		String str1 = new String(arr1);
		System.out.println(str1);
		
		// 문자열을 byte 타입의 배열로 변환 (EUC-KR 인코딩)
		byte[] arr2 = data.getBytes("EUC-KR");
		// 문자열의 각 문자들을 하나의 byte형태의 숫자로 쪼개 배열의 형태로 표현
		// EUC-KR로 인코딩할 때에는 getBytes 메소드에 반드시 "EUC-KR" 입력
		System.out.println(Arrays.toString(arr2));
		// utf-8보다 바이트수가 작기 때문에 출력 숫자도 적음
		
		// byte 타입의 배열을 문자열로 변환 (EUC-KR 인코딩)
		String str2 = new String(arr2, "EUC-KR");
		// EUC-KR 인코딩의 경우 String 생성자 두 번째 인자에 "EUC-KR"를 넣어줘야함
		System.out.println(str2);
		
		// "EUC-KR"를 선언하지 않을 씨 문자가 깨짐
		String str3 = new String(arr2);
		System.out.println(str3);
	}
}

StringBuilder 클래스

  • 잦은 문자열 변경 작업을 할 때 사용하면 용이함
  • StringBuilder는 내부 버퍼에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계됨
package ch12.sec05;

public class StringBuilderExam {
	public static void main(String[] args) {
		
		// StringBuilder : 잦은 문자열 변경 작업을 위한 클래스
		String data = new StringBuilder()
				.append("나가라") 
				// append : 문자열을 끝에 추가함
				
				.insert(0, "종신감독 이숭용 ") 
				// insert(a,b) : 문자열 b를 a번째에 삽입
				
				.delete(0,5)
				// delete(a,b) : a번째부터 b번째 앞까지의 문자열을 삭제 
				
				.toString();
				// toString() : 위의 구문을 통해 조합한 문자열을 리턴함
		System.out.println(data);
		// 이숭용 나가라 (제발)
	}
}

StringTokenizer 클래스

  • 문자열에 여러 종류가 아닌 한 종류의 구분자만 있다면 이를 사용할 수 있음
  • .split과 비슷한 개념임
  • 구조 : StringTokenizer(a,b)
    -> a의 매개값으로 전체 문자열을 줌
    -> b의 매개값으로 구분자(구분할 문자)를 줌 (생략시 공백이 기본 구분자가 됨)
package ch12.sec05;

import java.util.StringTokenizer;

public class StringTokenizerExam {
	public static void main(String[] args) {
		String data1 = "SSG=LG/키움=kt/SSG=LG/키움=kt";
		
		// split() : 해당 문자로 문자열을 구분지음
		// = 또는 /의 문자로 구분
		// 배열로만 문자열을 나누는 기능만 가지고 있음
		String[] arr1 = data1.split("=|/");
	
		for(String token : arr1) {
			System.out.print(token + " ");
		}
		System.out.println();
		
		String data2 = "SSG/LG/키움/kt/SSG/LG/키움/kt";
		
		// StringTokenizer : split과 같이 문자열을 특정 문자로 나누는 역할을 함
		// StringTokenizer(a,b) : 문자열 a를 b의 문자를 기준으로 나눔
		// java.util 내에 클래스가 존재하므로 사용시 import 해주기
		StringTokenizer st = new StringTokenizer(data2, "/");
		
		// .hasMoreTokens() : 더 가져올 문자가 있는지 확인
		while(st.hasMoreTokens()) {
			// nextToken() : 나눈 문자들이 저장됨
			String token = st.nextToken();
			System.out.println(token);
		}
	}
}

포장 객체

  • 기본 타입(byte, short, char, int, long, float, double, boolean)의 값는 객체!
  • 포장하고 있는 기본 타입의 값을 변경할 수 없고, 단지 객체로 생성하는 목적
  • 기본형의 타입을 객체처럼 이용하기 위함

박싱과 언박싱

  • 박싱 : 기본 타입의 값을 객체로 만드는 과정
    -> 포장 클래스 변수에 기본 타입 값이 대입 시 발생됨
  • 언박싱 : 객체에서 기본 타입 값을 얻어내는 과정
    -> 기본 타입 변수에 포장 객체가 대입 시 발생됨
package ch12.sec06;

public class BoxingUnBoxingExam {
	public static void main(String[] args) {
		// Boxing
		// int 타입의 값을 Integer 객체에 직접 저장
		Integer obj = 100;
		// .기본타입Value() (char제외) : 해당 타입의 객체 내부의 값을 리턴
		System.out.println(obj.intValue());
		
		// UnBoxing
		int value = obj;
		System.out.println(value);
		
		// UnBoxing 연산
		int result = obj + 100;
		System.out.println(result);
	}
}

문자열을 기본 타입 값으로 변환

  • 포장 클래스는 문자열을 기본 타입 값으로 변환할 때에도 사용
  • 대부분의 포장 클래스에는 "parse + 기본타입" 명으로 되어 있는 정적 메소드가 있음

포장 값 비교

  • 포장 객체는 번지를 비교하므로 내부 값을 비교하기 위해 ==와 != 연산자를 사용할 수 없음
  • 다음 범위의 값을 갖는 포장 객체는 ==와 != 연산자로 비교할 수 있지만, 내부 값을 비교하는 것이 아니라 객체 번지를 비교하는 것
  • 내부 값을 비교하기 위해서는 포장 클래스의 .equals() 메소드 사용
package ch12.sec06;

public class ValueCompareExample {
	public static void main(String[] args) {
		//-128~127 초과값일 경우
		// 객체를 별도로 생성하기 때문에 참조하는 객체가 달라짐
		// == : 참조하는 객체 비교, equals : 내용 비교
		// (int) 형태로 형변환하면 정수형으로 변환되기 때문에 ==으로 비교하면 값이 같아짐
		Integer obj1 = 300;
		Integer obj2 = 300;
		System.out.println("==: " + (obj1 == obj2));
		System.out.println("equals(): " + obj1.equals(obj2));
		System.out.println();

		//-128~127 범위값일 경우
		// 1byte 내외의 값은 == 이나, equals의 비교값은 모두 같음
		Integer obj3 = 10;
		Integer obj4 = 10;
		System.out.println("==: " + (obj3 == obj4));
		System.out.println("equals: " + obj3.equals(obj4));
	}
}

Math 클래스

  • 수학에 계산에 사용할 수 있는 정적 메소드 제공

날짜와 시간 클래스

Date 클래스

  • 날짜를 표현하는 클래스로 객체 간에 날짜 정보를 주고 받을 때 사용
  • Date() 생성자는 컴퓨터의 현재 날짜를 읽어 Date 객체로 만듦
package ch12.sec08;

import java.text.*;
import java.util.*;

public class DateExample {
	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 a HH:mm:ss");
		// 중간에 a : 오전, 오후
		String strNow2 = sdf.format(now);
		System.out.println(strNow2);
	}
}

Calendar 클래스

  • 달력을 표현하는 추상 클래스
  • getInstance() 메소드로 컴퓨터에 설정된 시간대 기준으로 Calendar 하위 객체를 얻을 수 있음
package ch12.sec08;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class CalendarExample {
	public static void main(String[] args) {
		Calendar now = Calendar.getInstance();
		// Calendar는 추상클래스임
		// getInstance() 메소드를 통해 정보를 얻어옴
		// 현재 시간이 나옴
		
		int year    = now.get(Calendar.YEAR);                
		int month  = now.get(Calendar.MONTH) + 1;          
		int day    = now.get(Calendar.DAY_OF_MONTH);     
		
		int week    = now.get(Calendar.DAY_OF_WEEK);        
		String strWeek = null;
		switch(week) {
			case Calendar.MONDAY: 		strWeek = "월"; 	break;
			case Calendar.TUESDAY: 		strWeek = "화"; break;
			case Calendar.WEDNESDAY: 	strWeek = "수"; break;
			case Calendar.THURSDAY: 	strWeek = "목"; break;
			case Calendar.FRIDAY: 		strWeek = "금"; break;
			case Calendar.SATURDAY: 	strWeek = "토"; break;
			default: 							strWeek = "일";
		}
		
		int amPm  = now.get(Calendar.AM_PM);   
		String strAmPm = null;
		if(amPm == Calendar.AM) {
			strAmPm = "오전";
		} else {
			strAmPm = "오후";
		}
		
		int hour    = now.get(Calendar.HOUR);                 
		int minute  = now.get(Calendar.MINUTE);             
		int second  = now.get(Calendar.SECOND);              

		System.out.print(year + "년 ");
		System.out.print(month + "월 ");
		System.out.println(day + "일 ");
		System.out.print(strWeek + "요일 ");
		System.out.println(strAmPm + " ");
		System.out.print(hour + "시 ");
		System.out.print(minute + "분 ");
		System.out.println(second + "초 ");
		
		// 이 방법을 더 많이 씀
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss");
        String strNow2 = sdf.format(now.getTime());
        System.out.println(strNow2);
	}
}

날짜와 시간 조작

  • java.time 패키지의 LocalDateTime 클래스가 제공하는 메소드를 이용해 날짜와 시간을 조작함

package ch12.sec08;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;

public class DateTimeOperationExample {
	public static void main(String[] args) {
		LocalDateTime now = LocalDateTime.now();
		// Date now = new Date();
		// Calendar now = Calendar.getInstance()
		// 모두 현재 시간을 알려주는 구문
		
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd a HH:mm:ss");
		System.out.println("현재 시간: " + now.format(dtf));
			
		LocalDateTime result1 = now.plusYears(1);
		System.out.println("1년 덧셈: " + result1.format(dtf));
		
		LocalDateTime result2 = now.minusMonths(2);
		System.out.println("2월 뺄셈: " + result2.format(dtf));
				
		LocalDateTime result3 = now.plusDays(7);
		System.out.println("7일 덧셈: " + result3.format(dtf));
			}
	}

날짜와 시간 비교

  • LocalDataTime 클래스는 날짜와 시간을 비교할 수 있는 메소드 제공

package ch12.sec08;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class DateTimeCompareExample {
	public static void main(String[] args) {
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd a HH:mm:ss");

		// 이것을 많이 씀 (년, 월, 일, 시, 분, 초)
		LocalDateTime startDateTime = LocalDateTime.of(2021, 1, 1, 0, 0, 0);
		System.out.println("시작일: " + startDateTime.format(dtf));
		
		LocalDateTime endDateTime = LocalDateTime.of(2021, 12, 31, 0, 0, 0);
		System.out.println("종료일: " + endDateTime.format(dtf));
 
		if(startDateTime.isBefore(endDateTime)) {
			System.out.println("진행 중입니다.");
		} else if(startDateTime.isEqual(endDateTime)) {
			System.out.println("종료합니다.");
		} else if(startDateTime.isAfter(endDateTime)) {
			System.out.println("종료했습니다.");
		}
		
		long remainYear = startDateTime.until(endDateTime, ChronoUnit.YEARS);
		long remainMonth = startDateTime.until(endDateTime, ChronoUnit.MONTHS);
		long remainDay = startDateTime.until(endDateTime, ChronoUnit.DAYS);
		long remainHour = startDateTime.until(endDateTime, ChronoUnit.HOURS);
		long remainMinute = startDateTime.until(endDateTime, ChronoUnit.MINUTES);
		long remainSecond = startDateTime.until(endDateTime, ChronoUnit.SECONDS);
		System.out.println("남은 해: " + remainYear);
		System.out.println("남은 월: " + remainMonth);
		System.out.println("남은 일: " + remainDay);
		System.out.println("남은 시간: " + remainHour);
		System.out.println("남은 분: " + remainMinute);
		System.out.println("남은 초: " + remainSecond);
	}
}

타 지역의 시간 출력하기

package ch12.sec08;

import java.util.Calendar;
import java.util.TimeZone;

public class LosAngelesExample {
	public static void main(String[] args) {
		TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
		// 국가/도시명
		Calendar now = Calendar.getInstance( timeZone );
		// LA의 시간

		int amPm = now.get(Calendar.AM_PM);
		String strAmPm = null;
		if(amPm == Calendar.AM) {
			strAmPm = "오전";
		} else {
			strAmPm = "오후";
		}
		int hour = now.get(Calendar.HOUR);
		int minute = now.get(Calendar.MINUTE);
		int second = now.get(Calendar.SECOND);

		System.out.print(strAmPm + " ");
		System.out.print(hour + "시 ");
		System.out.print(minute + "분 ");
		System.out.println(second + "초 ");
	}
}

시간 출력 가능한 국가 알아보기

package ch12.sec08;

import java.util.TimeZone;

public class PrintTimeZoneID {
	public static void main(String[] args) {
		String[] availableIDs = TimeZone.getAvailableIDs();
		// 사용 가능한 국가 ID
		for(String id : availableIDs) {
			System.out.println(id);
		}
	}
}

형식 클래스

DemicalFormat

  • 숫자를 형식화된 문자열로 반환

package ch12.sec09;

import java.text.DecimalFormat;

public class DecimalFormatExample {
	public static void main(String[] args) {
		double num = 1234567.89;

		DecimalFormat df;
		
		//정수 자리까지 표기
		df = new DecimalFormat("#,###");
		System.out.println( df.format(num) );
		
		//무조건 소수 첫째 자리까지 표기
		//반올림 기능이 있음
		df = new DecimalFormat("#,###.0");
		System.out.println( df.format(num) );
	}
}

SimpleDateFormat

  • 날짜를 형식화된 문자열로 반환
package ch12.sec09;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatExample {
	public static void main(String[] args) {
		Date now = new Date();

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		System.out.println( sdf.format(now) );

		sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
		System.out.println( sdf.format(now) );

		sdf = new SimpleDateFormat("yyyy.MM.dd a HH:mm:ss");
		System.out.println( sdf.format(now) );

		sdf = new SimpleDateFormat("오늘은 E요일");
		System.out.println( sdf.format(now) );

		sdf = new SimpleDateFormat("올해의 D번째 날");
		System.out.println( sdf.format(now) );

		sdf = new SimpleDateFormat("이달의 d번째 날");
		System.out.println( sdf.format(now) );
	}
}

정규 표현식

  • 문자 또는 숫자와 관련된 표현과 반복 기호가 결합된 문자열
  • java.util.regex 패키지의 Pattern 클래스 내부의 정규 표현식으로 문자열을 검증하는 matches() 메소드를 사용
  • 웬만해선 chatGPT의 힘을 빌리기,,ㅎ
package ch12.sec10;

import java.util.regex.Pattern;

public class PatternExample {
	public static void main(String[] args) {
		String regExp = "(02|010)-\\d{3,4}-\\d{4}";
		// \d : 숫자
		// {a,b} : 길이(a자리 또는 b자리)
		String data = "02-123-4567";
		boolean result = Pattern.matches(regExp, data);
		// Pattern.matches : 정규 표현식 (전화번호나 이메일 등을 주로 사용)
		if(result) {
			System.out.println("정규식과 일치합니다.");
		} else {
			System.out.println("정규식과 일치하지 않습니다.");
		}
			
		// chatgpt로 만들기!! ㅋ
		regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
		// \w : 영문자, 숫자 포함
		// + : 한 개 이상
		// . : .이 있음
		// ? : 없어도 있어도 됨
		
		data = "angel@mycompanycom";
		result = Pattern.matches(regExp, data);
		if(result) {
			System.out.println("정규식과 일치합니다.");
		} else {
			System.out.println("정규식과 일치하지 않습니다.");
		}
	}
}
profile
끄작끄작

0개의 댓글