자바 - java.base 모듈
API 도큐먼트
API 도큐먼트
- 자바 표준 모듈에서 제공하는 라이브러리를 쉽게 찾아서 사용할 수 있도록 도와주는 문서
- JDK 버전별로 사용할 수 있는 API 도큐먼트: https://docs.oracle.com/en/java/javase/index.html
java.base 모듈
java.base
- 모든 모듈이 의존하는 기본 모듈로, 모듈 중 유일하게 requires 하지 않아도 사용할 수 있음
java.lang
- 자바 언어의 기본적인 클래스를 담고 있는 패키지. 이패키지에 있는 클래스와 인터페이스는 import 없이 사용 할 수 있
Object 클래스
Object 클래스
- 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속 -> 자바의 모든 클래스는 Object의 자식이거나 자손 클래스
객체 동등 비교
- Object의 equals() 메소드는 객체의 번지를 비교하고 boolean 값을 리턴
public boolean equals(Object obj)
객체 해시코드
- 객체를 식별하는 정수. Object 의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수 값을 리턴
public int hashCode()
- hashCode()가 리턴하는 정수 값이 같은지 확인하고, equals() 메소드가 true를 리턴하는지 확인해서 동등 객체임을 판단
객체 문자 정보
- 객체를 문자열로 표현한 값. Object의 toString() 메소드는 객체의 문자 정보를 리턴
- 기본적으로 Object의 toString() 메소드는 '클래스명@16진수해시코드'로 구성된 문자열을 리턴
레코드 선언
- 데이터 전달을 위한 DTO작성 시 반복적으로 사용되는 코드를 줄이기 위해 도입
public record Person(String name, int age) {
}
롬복 사용하기
- DTO 클래스를 작성할 때 Getter, Setter, hasCode(), equals (), toString() 메소드를 자동 생성
- 필드가 final이 아니며, 값을 읽는 Getter는 getXxx(또는 isXxx)로, 값을 변경하는 Setter는 setXxx로 생성됨
java -jar lombok.jar
어노테이션(클래스 위 작성)
@Data // 어노테이션 : 기본 생성자와 함께 Getter, Setter, hashCode(), equals(), toString() 자동 생성@NoArgsConstructor // 기본(매개변수가 없는) 생성자 포함
@AllArgsConstructor // 모든 필드를 초기화 시키는 생성자 포함
@RequiredArgsConstructor // 기본적으로 매개변수가 없는 생성자 포함. 만약 final 또는 @NotNull이 붙은 필드가 있다면 이필드만 초기화 시키는 생성자 포함
@Getter // Getter 메소드 포함
@Setter // Setter 메소드 포함
@EqualsAndHashCode // equals()와 hashCode() 메소드 포함
@ToString // toString() 메소드 포함
System 클래스
System 클래스
- System 클래스의 정적 static 필드와 메소드를 이용하면 프로그램 종료, 키보드 입력, 콘솔(모니터) 출력, 현재 시간 읽기, 시스템 프로퍼티 읽기 등이 가능
*
프로세스 종료
자바 프로그램 -> JVM으로 프로세스가 생성 -> main() 메소드 호출 -> 프로그램 구동
GUI 프로그램 : 종료버튼
강제 프로세스 종료 : System.exit() 메소드
Sysetm.exit(매개값) : 0, 1 or -1
0 : 정상 종료
1 or -1 : 비정상 종료
진행 시간 읽기
currentTimeMillis() 메소스 nanoTime() 메소드 : 1970년 1월 1일 0시
시스템 프로퍼티 읽기
java.specifiactiomn.version : 자바 스펙 버전
java.home : JDK 디렉토리 경로
os.name : 운영체제
user.name : 사용자 이름
user.home : 사용자 홈 디렉토리 경로
user.dir : 현재 디렉토리 경로
*
문자열 클래스
*
문자열 클래스
String : 문자열을 저장하고 조작할때 사용
StringBuilder : 효율적인 문자열 조작 기능이 필요할 때 사용
StringTokenizer : 구분자로 연결된 문자열을 분리할 때 사용
*
String 클래스
- String 클래스는 문자열을 저장하고 조작할 때 사용
- 문자열 리터럴은 자동으로 String 객체로 생성. String 클래스의 다양한 생성자를 이용해서 직접 객체를 생성할 수도 있음
- 한글 1자를 UTF-8로 인코딩하면 3바이트가 되고, EUC-KR로 인코딩하면 2바이트가 됨
StringBuilder 클래스
- 잦은 문자열 변경 작업을 해야 한다면 String 보다는 StringBuilder가 좋음
- StringBuilder는 내부 버퍼에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계
StringTokenizer 클래스
- 문자열에 여러 종류가 아닌 한 종류의 구분자만 있다면 StringTokenizer를 사용 할 수도 있음. StringTokenizer 객체를 생성 시 첫 번째 매개값으로 전체 문자열을 주고, 두 번째 매개값으로 구분자를 줌. 구분자를 생략하면 공백이 기본 구분자가 됨
포장 클래스
포장 객체
- 기본타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체
- 포장하고 있는 기본 타입의 값을 변경할 수 없고, 단지 객체로 생성하는 목적
박싱과 언박싱
- 박싱 : 기본 타입 값을 포장 객체로 만드는 과정. 포장 클래스 변수에 기본 타입 값이 대입 시 발생
- 언박싱 : 포장 객체에서 기본 타입 값을 얻어내는 과정. 기본 타입 변수에 포장 객체가 대입 시 발생
Integer obj = 100; // 박싱
int value = obj; // 언박싱
int value = obj + 50; // 언박싱 후 연산
문자열을 기본 타입 값으로 변환
- 포장 클래스는 문자열을 기본 타입 값으로 변환할 때도 사용.
- 대부분의 포장 클래스에는 'parse+기본타입' 명으로 되어 있는 정적 메소드 있음
포장 값 비교
- 포장 객체는 번지를 비교하므로 내부 값을 비교하기 위해 ==와 != 연산자를 사용할 수 없음
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println(obj1 = = obj2);
- 다음 범위의 값을 갖는 포장 객체는 == 와 != 연산자로 비교 할 수 있지만, 내부 값을 비교하는 것이 아니라 객체 번지를 비교하는 것
- 대신 포장 클래스의 equals()메소드로 내부 값을 비교할 수 있음
수학 클래스
Math 클래스
- 수학 계산에 사용 할 수 있는 정적 메소드 제공
날짜와 시간 클래스
Date 클래스
- 날짜를 표현하는 클래스로 객체 간에 날짜 정보를 주고 받을 때 사용
- Date() 생성자는 컴퓨터의 현재 날짜를 읽어 Date 객체로 만듦
Date now = new Date();
Calendar 클래스
- 달력을 표현하는 추상 클래스
- getInstance() 메소드로 컴퓨터에 설정된 시간대 기준으로 Calendar 하위 객체를 얻을 수 있음
Calendar now = Calendar.getInstane();
날짜와 시간 조작
- java.time 패키지의 LocalDateTime 클래스가 제공하는 메소드를 이용해 날짜와 시간을 조작가능
날짜와 시간 비교
- LocalDataTime 클래스는 날짜와 시간을 비교할 수 있는 메소드 제공
형식 클래스
*
형식 클래스 : format()
숫자 또는 날짜를 원하는 형태의 문자열로 변환
DecimalFormat : 숫자 형식
SimpleDateFormat : 날짜 형식
*
DecimalFormat
- 숫자를 형식화된 문자열로 변환
SimpleDateFormat
- 날짜를 형식화된 문자열로 변환
정규 표현식 클래스
정규 표현식
- 문자또는 숫자와 관련된 표현과 반복 기호가 결합된 문자열
Pattern 클래스로 검증
- java.util.regex 패키지의 Pattern 클래스는 정규 표현식으로 문자열을 검증하는 matches() 메소드 제공
boolean result = Pattern.matchs("정규식", "검증할 문자열");
리프렉션
*
패키지 정보
클래스 이름
멤버 정보 얻기
Constructor[] getDeclaredConstructors() : 생성자 정보 읽기
Field[] getDeclaredFields() : 필드 정보 읽기
Method[] getDeclaredMethods() : 메소드 정보 읽기
*
리플렉션
- Class 객체로 관리하는 클래스와 인터페이스의 메타 정보를 프로그램에서 읽고 수정하는 것
- 메타 정보 : 패키지 정보, 타입 정보, 멤버(생성자, 필드, 메소드) 정보
패키지와 타입 정보 얻기
- 패키지와 타입(클래스, 인터페이스) 이름 정보는 다음 메소드로 얻을 수 있음
리소스 경로 얻기
- Class 객체는 클래스 파일(~.class)의 경로 정보를 기준으로 상대 경로에 있는 다른 리소스 파일(이미지,XML,Property 파일)의 정보를 얻을 수 있음
어노테이션
어노테이션
- 코드에서 @으로 작성되는 요소. 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보
- ① 컴파일 시 사용하는 정보 전달
- ② 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달
- ③ 실행 시 특정 기능을 처리할 때 사용하는 정보 전달
어노테이션 타입 정의와 적용
- @interface 뒤에 사용할 어노테이션 이름 작성
public @interface AnnotationName{
}
@AnnotationName
어노테이션 적용대상
-
어노테이션을 적용할 수 있는 대상의 종류는 ElementType 열거 상수로 정의
-
@Target 어노테이션으로 적용 대상 지정. @Target의 기본 속성 value 값은 ElementType 배열
어노테이션 유지 정책
- 어노테이션 정의 시 @AnnotationName을 언제까지 유지할지 지정
- 어노테이션 유지 정책은 RetentionPolicy 열거 상수로 정의
어노테이션 설정 정보 이용
- 애플리케이션은 리플렉션을 이용해 적용 대상에서 어노테이션의 정보를 다음 메소드로 얻어냄