자바 표준 모듈에서 제공하는 라이브러리는 방대하기 때문에 쉽게 찾아서 사용할 수 있도록 도와주는 API 도큐먼트가 있다.
Java Platform, Standard Edition Documentation - Releases




클래스 선언부를 통해서 해당 클래스의 정보에 대해서 알 수 있다.
Class String
java.lang.Object
java.lang.String
전체 상속 관계를 볼 수 있다.
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence, Constable, ConstantDesc
클래스가 final인지 abstract인지 알 수 있고, 부모 클래스와 구현 인터페이스를 볼 수 있다.
선언된 멤버별로 이동하는 링크이다.
NESTED: 중첩 클래스/중첩 인터페이스 목록으로 이동하는 링크
FIELD: 필드 목록으로 이동하는 링크

CONSTR: 생성자 목록으로 이동하는 링크

생성자의 매개변수 타입을 알 수 있다. 여기에 있는 생성자 중에 하나를 이용해서 String 객체를 생성할 수 있다.
METHOD: method 목록으로 이동하는 링크

All Methods: 모든 method 목록을 보여준다
Static Methods: 정적 method 목록을 보여준다
Instance Methods: 인스턴스 method 목록을 보여준다
Concrete Methods: 완전한 실행부를 갖춘 method 목록을 보여준다.
Deprecated Methods: 향후 제거될 method 목록을 보여준다.
Modifier and Type에서는 static 여부와 리턴 타입이 무엇인지 알 수 있다. Method에서는 method명과 매개변수 타입 및 개수를 알 수 있다.
모든 모듈이 의존하는 기본 모듈
모듈 중 유일하게 requires하지 않아도 사용할 수 있다.
| 패키지 | 용도 | 클래스 예시 |
|---|---|---|
java.lang | 자바 언어의 기본 클래스를 제공 | String, System, Integer, Double, Exception, RuntimeException |
java.util | 자료 구조와 관련된 컬렉션 클래스를 제공 | Scanner |
java.text | 날짜 및 숫자를 원하는 형태의 문자열로 만들어주는 포맷 클래스 제공 | |
java.time | 날짜 및 시간을 조작하거나 연산하는 클래스를 제공 | |
java.io | 입출력 스트림 클래스를 제공 | |
java.net | 네트워크 통신과 관련된 클래스를 제공 | |
java.nio | 데이터 저장을 위한 Buffer 및 새로운 입출력 클래스 제공 |
java.lang은 자바 언어의 기본적인 클래스를 담고 있는 패키지로, 이 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.
| 클래스 | 용도 |
|---|---|
Object | 자바 클래스의 최상위 클래스로 사용 |
System | 키보드로부터 데이터를 입력받을 때 사용 |
모니터로 출력하기 위해 사용
프로세스를 종료시킬 때 사용
진행 시간을 읽을 때 사용
시스템 속성을 읽을 때 사용 |
| String | 문자열을 저장하고 조작할 때 사용 |
| StringBuilder | 효율적인 문자열 조작 기능이 필요할 때 사용 |
| java.util.StringTokenizer | 구분자를 연결된 문자열을 분리할 때 사용 |
| Byte, Short, Character, Integer, Float, Double, Boolean | 기본 타입으로 값을 포장할 때 사용
문자열을 기본 타입으로 변환할 때 사용 |
| Math | 수학 계산이 필요할 때 사용 |
| Class | 클래스의 메타 정보(이름, 구성 멤버) 등을 조사할 때 사용 |
자바 클래스의 최상위 클래스
클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다. 자바의 모든 클래스는 Object의 자식이거나 자손 클래스이다.
Object가 가진 method는 모든 객체에서 사용할 수 있다.
| method | 용도 |
|---|---|
boolean equals(Object obj) | 객체의 번지를 비교하고 결과를 리턴 |
int hasCode() | 객체의 해시코드를 리턴 |
String toString() | 객체 문자 정보를 리턴 |
public boolean equals(Object obj)
객체의 번지를 비교하고 boolean 값을 리턴한다. 매개변수 타입이 Object이므로 자동 타입 변환에 의해 모든 객체가 매개값으로 대입될 수 있다. Object단에서 equals와 ==는 동일한 역할이다.
package ch12.sec03_object.exam01;
public class Member {
public String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Member target) { // 타입 감사
if (id.equals(target.id)) { // id 문자열이 같은지 비교
return true;
}
}
return false;
}
}
package ch12.sec03_object.exam01;
public class EqualsExample {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
if (obj1.equals(obj2)) { // 같은 Member 타입이며 id 동일 → true
System.out.println("obj1과 obj2는 동등합니다.");
} else {
System.out.println("obj1과 obj2는 동등하지 않습니다.");
}
if (obj1.equals(obj3)) { // 같은 Member 타입이지만 id가 다름 → true
System.out.println("obj1과 obj3은 동등합니다.");
} else {
System.out.println("obj1과 obj3은 동등하지 않습니다.");
}
}
}
기존의 equals method는 두 객체의 번지를 비교한다. 그렇기 때문에 obj1과 obj2가 서로 다른 객체라면, 번지가 다르기 때문에 equals는 무조건 false를 반환한다.
Override한 equals method는 객체의 번지 비교가 아닌, 객체의 id 값 비교로 재정의했다. 그렇기 때문에 obj1.equals(obj2)의 id값을 비교하여 동등하다는 값을 출력했다.

위와 같은 cmd+N으로 자동 Override 기능을 제공한다.
객체를 식별하는 정수
Object의 hasCode() method는 객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수값을 리턴한다. equals와 비슷하지만 두 객체가 동등한지를 비교할 때 주로 사용된다.
실제 개발 환경에서는 데이터를 기준으로 hashCode()를 Override하는 것이 일반적이다.
public int hashCode();
hashCode()가 리턴하는 정수값이 같은지 확인한다.equals()가 true를 리턴하는지를 확인해서 동등 객체임을 판단한다.동등 객체를 중복 저장하지 않는 특징이 있다. HashSet은 hashCode(), equals() method를 이용해서 동등 객체인지 판단한다.
package ch12.sec03_object.exam02;
// HashSet java.util 패키지에 있으므로 import 해야 함
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); //HashSet에 Student 객체 저장
System.out.println("저장된 객체 수: " + hashSet.size());
Student s2 = new Student(1, "홍길동");
hashSet.add(s2); //HashSet에 Student 객체 저장
System.out.println("저장된 객체 수: " + hashSet.size());
Student s3 = new Student(2, "홍길동");
hashSet.add(s3); //HashSet에 Student 객체 저장
System.out.println("저장된 객체 수: " + hashSet.size());
}
}
s1과 s2의 학생번호와 이름이 같기 때문에 동등 객체이다. s2가 저장될 때 이미 s1이 저장돼있으므로 중복 저장되지 않는다.
Object의 toString() method는 객체의 문자 정보를 리턴한다. 객체의 문자 정보가 중요한 경우에는 Object의 toString() method를 재정의해서 간결하고 유익한 정보를 리턴하도록 해야 한다.
데이터 전달을 위한 DTO를 작성할 때 반복적으로 사용되는 코드를 줄이기 위해 Java 14부터 레코드가 도입됐다. 데이터를 저장하는 목적으로만 사용하는 클래스를 쉽고 간결하게 작성하기 위해 도입됐다.
매번 작성해야 하는 필드, 생성자, getter, toString, equals, hashCode의 코드 반복을 레코드를 사용해서 줄여준다.
private final 필드가 자동 생성된다.hashCode(), equals(), toString() method를 자동 추가한다.public record Person(String name, int age){
}
class 키워드 대신에 record로 대체하고, 클래스 이름 뒤에 괄호를 작성해서 저장할 데이터의 종류를 변수로 선언했다.
자동 코드 생성 라이브러리
JDK에 포함된 표준 라이브러리는 아니지만 개발자들이 즐겨 쓰는 자동 코드 생성 라이브러리이다.
레코드와 마찬가지로 코드 중복 작성의 양을 줄여준다. 레코드와의 차이점은 필드가 final이 아니며, 값을 읽는 Getter는 getXxx로, 값을 변경하는 Setter는 setXxx로 생성된다.
최신 버전의 롬복 설치 파일(lombok.jar)을 다운로드 한다.

플러그인 마켓플레이스에서 lombok을 검색 후, 설치한다.

lib 디렉토리를 설치하고, 설치한 lombok.jar 파일을 해당 위치에 추가한다.

해당 과정을 통해서 lib에 있는 lombok.jar를 라이브러리로 등록한다.

설정→빌드,실행,배포→컴파일러→어노테이션 프로세서에 들어가서 어노테이션 처리 활성화를 해준다.
| 어노테이션 | 설명 |
|---|---|
@Data | 컴파일 과정에서 기본 생성자와 함께 Getter, Setter, hashCode(), equals(), toString() method가 자동 생성 |
@NoArgsConstructor | 기본(매개변수가 없는) 생성자 포함 |
@AllArgsConstructor | 모든 필드를 초기화 시키는 생성자 포함 |
@RequiredArgsConstructor | 기본적으로 매개변수가 없는 생성자 포함, 만약 final 또는 @NonNull이 붙은 필드가 있다면 이 필드만 초기화시키는 생성자 포함 |
@Getter | Getter method 포함 |
@Setter | Setter method 포함 |
@EqualsAndHashCode | equals()와 hashCode() method 포함 |
@ToString | toString() method 포함 |

Structure 아이콘(cmd+7)을 통해서 Lombok으로 생성되는 코드를 확인할 수 있다.

그냥 @Data를 사용하면 기본적으로 매개변수가 없는 생성자를 포함시키지만, final 또는 @NonNull이 붙은 필드가 있다면 해당 필드만 초기화시키는 생성자를 포함하게 된다.
자바는 운영체제 상에서 바로 실행되지 않고 JVM을 거쳐서 실행된다. 그래서 운영체제의 모든 기능을 자바 코드로 직접 접근하기는 쉽지 않다. 그래서 System 클래스를 이용해서 운영체제의 일부 기능을 이용한다.
| 정적멤버 | 용도 |
|---|---|
out | 콘솔(모니터)에 문자 출력 |
err | 콘솔(모니터)에 에러 내용 출력 |
in | 키보드 입력 |
exit(int status) | 프로세스 종료 |
currentTimeMillis() | 현재 시간을 밀리초 단위의 long 값으로 리턴 |
nanoTime() | 현재 시간을 나노초 단위의 long 값으로 리턴 |
getProperty() | 운영체제와 사용자 정보 제공 |
getenv() | 운영체제의 환경 변수 정보 제공 |
out(err) 필드를 이용해서 콘솔에 원하는 문자열을 출력
err필드는 콘솔에 빨간색으로 출력된다.

int keyCode = System.in.read();
이를 통해서 입력된 키의 키 코드 값을 얻을 수 있다.
System.exit(int status)
해당 코드를 이용해서 프로세스를 강제 종료 시킬 수 있다. status값으로 어떤 값이 와도 종료는 되지만 여기에 오는 값으로 프로그램이 어떤 상태로 종료가 되는지 확인 할 수 있다.
1970년 1월 1일 0시부터 시작해서 현재까지 진행된 시간을 리턴한다. 주로 프로그램 처리 시간을 측정하는 데 주로 사용된다. 프로그램 처리를 시작할 때 한번, 끝날 때 한번 읽어서 그 차이를 구하면 프로그램 처리 시간이 나온다.
package ch12.sec04_system;
public class MeasureRunTimeExample {
public static void main(String[] args) {
**long time1 = System.nanoTime();**
int sum = 0;
for (int i = 1; i <= 1000000; i++) {
sum += i;
}
**long time2 = System.nanoTime();**
System.out.println("1~1000000까지의 합: " + sum);
System.out.println("계산에 " + (**time2 - time1**) + " 나노초가 소요되었습니다.");
}
}
자바 프로그램이 시작될 때 자동 설정되는 시스템의 속성
System.getProperty("java.home");
| 속성 이름(key) | 설명 | 값(value) |
|---|---|---|
java.specification.version | 자바 스펙 버전 | 17 |
java.home | JDK 디렉토리 경로 | /opt/homebrew/Cellar/openjdk@17/17.0.14/libexec/openjdk.jdk/Contents/Home |
os.name | 운영체제 | Mac OS X |
user.name | 사용자 이름 | win-air |
user.home | 사용자 홈 디렉토리 경로 | /Users/win-air |
user.dir | 현재 디렉토리 경로 | /Users/win-air/Library/Mobile Documents/com~apple~CloudDocs/study/kb-fullstack/실습/am/04-Java/study |
| 클래스 | 설명 |
|---|---|
String | 문자열을 저장하고 조작할 때 사용 |
StringBuilder | 효율적인 문자열 조작 기능이 필요할 때 사용 |
StringTokenizer | 구분자로 연결된 문자열을 분리할 때 사용 |
문자열을 저장하고 조작할 때 사용
문자열 리터럴은 자동으로 String 객체로 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 객체를 생성할 수 있다.
String str = "자바";
//String->byte(UTF-8)
byte[] arr = data.getBytes("UTF-8"); //기본 디코딩 방식, 생략 가능
//byte->String
String newStr = new String(arr);
특정 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성한다. 한글 1자는 UTF-8로 인코딩하면 3byte가 된다.
String은 내부 문자열을 수정할 수 없다. 그래서 문자열을 수정하려면 새로운 String 객체를 매번 생성하고 반환해야 한다. 그러고 그 수정된 String 객체를 참조하는 번지수를 변수에 저장하는 것이다. 이는 계속해서 새로운 String 객체를 생성하고, 이전 객체는 버려직기에 효율성이 좋지는 않다.
잦은 문자열 변경 작업을 할 때는 StringBuilder를 사용하는 것이 좋다. String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있다.
| 리턴 타입 | method(매개변수) | 설명 |
|---|---|---|
StringBuilder | `append(기본값 | 문자열)` |
StringBuilder | `insert(위치,기본값 | 문자열)` |
StringBuilder | delete(시작위치, 끝위치) | 문자열 일부를 삭제 |
StringBuilder | replace(시작위치,끝위치,문자열) | 문자열 일부를 대체 |
String | toString() | 완성된 문자열을 리턴 |
package ch12.sec05_string;
public class StringBuildExample {
public static void main(String[] args) {
String data = new **StringBuilder()
.append("DEF")
.insert(0, "ABC")
.delete(3, 4)
.toString();**
System.out.println(data);
}
}
toString()을 제외한 다른 method는 StringBuilder를 다시 리턴하기 때문에 연이어서 다른 method를 호출할 수 있는 method 체이닝 패턴을 사용할 수 있다.
문자열이 구분자로 연결되 있을 경우 구분자를 기준으로 문자열을 분리할 수 있다.
String data = "방찬&이민호,서창빈,황현진-한지성";
String[] names = data.split("&|,|-");String data = "김승민/이용복/양정인";
StringTokenizer st = new StringTokenizer(data,"/"); 만약 구분자를 지정하지 않으면 공백이 기본 구분자가 된다.| 리턴 타입 | method(매개변수) | 설명 |
|---|---|---|
int | countTokens() | 분리할 수 있는 문자열의 총 수 |
boolean | hasMoreTokens() | 남아있는 문자열이 있는지 여부 |
String | nextToken() | 문자열을 하나씩 가져옴 |
만약 nextToken()시에 다음 token이 없다면 예외가 발생하기 때문에 nextToken() 전에 hasMoreTokens() method로 가져올 문자열이 있는지 먼저 조사해주는 것이 좋다.
기본 타입인 int는 참조를 얻을 수 없다. 하지만 개발하면서 해당 값의 참조타입이 필요할 때가 있다. 기본 타입에 대응하는 wrapper 클래스가 있다.
컬렉션 API 사용 시
List<Integer> list = new ArrayList<>();
null 값을 다뤄야 할 때
Integer num = null;
제네릭 사용 시
public class Box<T> {T value;}
Box<Integer> box = new Box<>();
| 기본 타입 | 포장 클래스 |
|---|---|
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
포장 객체는 포장하고 있는 기본 타입의 값을 변경할 수 없다.
package ch12.sec06_wrapper;
public class BoxingUnBoxingExample {
public static void main(String[] args) {
//Boxing
Integer obj = 100;
System.out.println("value: " + obj.intValue());
//Unboxing
int value = obj;
System.out.println("value: " + value);
//연산 시 Unboxing
int result = obj + 100;
System.out.println("result: " + result);
}
}
박싱과 언박싱은 기본 타입과 참조 타입 간 자동 변환의 일종이다. 자바 컴파일러가 자동으로 valueOf()/xxxValue() method를 삽입해서 처리해준다.
대부분의 포장 클래스에는 parse기본타입명으로 돼있는 정적 method가 있다.
포장 객체는 내부 값을 비교하기 위해 ==와 != 연산자를 사용할 수 없다. 이 연산자는 내부 값을 비교하는 것이 아니라 포장 객체의 번지를 비교한다. 포장 객체의 내부값을 비교하기 위해서는 포장 클래스의 equals() method를 사용해줘야 한다.
Integer obj1 = 300;
Integer obj2 = 300;
**obj1.equals(obj2)**;
수학 계산에 사용할 수 있는 method
모두 static method이기 때문에 Math 클래스로 바로 사용할 수 있다.
| 구분 | 코드 | 리턴값 |
|---|---|---|
| 절대값 | int v=Math.abs(-5); | 5 |
| 올림값 | double v=Math.ceil(5.3); | 6.0 |
| 버림값 | double v=Math.floor(5.3); | 5.0 |
| 최대값 | int v=Math.max(5,9); | 9 |
| 최소값 | int v=Math.min(5,9); | 5 |
| 랜덤값 | double v=Math.random(); | 0.0과 1.0 사이의 랜덤값 |
| 반올림값 | long v=Math.round(5.3); | 5 |
Math.random()
0.0과 1.0 사이의 double 타입 난수를 리턴한다.
생성자
| 객체 생성 | 설명 |
|---|---|
| Random() | 현재 시간을 이용해서 종자값을 자동 설정한다 |
| Random(long seed) | 주어진 종자값을 계산한다. 같은 seed를 주면 항상 같은 순서의 난수를 얻을 수 있다. |
개발할 때 테스트나 디버깅 단계에서는 Random(long seed)를 활용해서 디버깅이 쉽도록 하고, 실제 서비스 단계에서는 Random()을 사용해서 난수를 얻는다.
method
| 리턴값 | method | 설명 |
|---|---|---|
boolean | nextBoolean() | boolean 타입의 난수를 리턴 |
double | nextDouble() | double 타입의 난수를 리턴(0.0≤~<1..0) |
int | nextInt() | int 타입의 난수를 리턴(-2^32≤~≤2^32-1) |
int | nextInt(int n) | int 타입의 난수를 리턴(0≤~<n) |
Java는 컴퓨터의 날짜 및 시각을 읽을 수 있도록 java.util 패키지에서 Date와 Calendar 클래스를 제공하고 있다. 또한 날짜와 시간을 조작할 수 있도록 java.time 패키지에서 LocalDateTime 등의 클래스를 제공한다.
| 클래스 | 설명 |
|---|---|
Date | 날짜 정보를 전달하기 위해 사용 |
Calendar | 다양한 시간대별로 날짜와 시간을 얻을 때 사용 |
LocalDateTime | 날짜와 시간을 조작할 때 사용 |
날짜를 표현하는 클래스로 객체 간에 날짜 정보를 주고 받을 때 사용
Date now = new Date();
Date() 생성자는 컴퓨터의 현재 날짜를 읽어 Date 객체로 만든다. Date() 생성자만 주로 사용된다. 우리가 원하는 형식의 문자열로 얻고 싶다면 SimpleDateFormat 클래스와 함께 사용한다. 사용하지 않으면 “Tue Apr 29 22:09:11 KST 2025”과 같은 형태로 출력된다.
package ch12.sec08_date;
import java.text.SimpleDateFormat;
import java.util.Date;
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 HH:mm:ss");**
String strNow2 = sdf.format(now);
System.out.println(strNow2);
}
}
달력을 표현하는 추상 클래스
Calendar 클래스의 정적 method인 getInstance() method를 이용하면 컴퓨터에 설정돼있는 시간대를 기준으로 Calendar 하위 객체를 얻을 수 있다.
Calendar now = Calendar.getInstance();
Calendar가 제공하는 날짜와 시간에 대한 정보를 얻기 위해서는 get() method를 이용한다. get() method의 매개값으로 Calendar에 정의된 상수를 주면 상수가 의미하는 값을 리턴한다.
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); //요일을 리턴
int amPm = now.get(Calendar.AM_PM); //오전/오후를 리턴
int hour = now.get(Calendar.HOUR); //시를 리턴
int minute = now.get(Calendar.MINUTE); //분을 리턴
int second = now.get(Calendar.SECOND); //초를 리턴
만약 다른 시간대의 값을 얻고 싶다면 getInstance()method의 매개값으로 넘겨주면 해당 시간대를 알 수 있다.
TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
LocalDateTime 클래스가 제공하는 method를 활용해서 날짜와 시간을 조작할 수 있다.
LocalDateTime now = LocalDateTime.now();
| method(매개변수) | 설명 |
|---|---|
minusYears(long) | 년 빼기 |
minusMonths(long) | 월 빼기 |
minusDays(long) | 일 빼기 |
minusWeek(long) | 주 빼기 |
plusYears(long) | 년 더하기 |
plusMonths(long) | 월 더하기 |
plusWeeks(long) | 주 더하기 |
plusDays(long) | 일 더하기 |
| method(매개변수) | 설명 |
|---|---|
minusHours(long) | 시간 빼기 |
minusSeconds(long) | 분 빼기 |
minusNanos(long) | 초 빼기 |
plusHours(long) | 나노초 빼기 |
plusMinutes(long) | 분 더하기 |
plusSeconds(long) | 초 더하기 |
| 리턴 타입 | method(매개변수) | 설명 |
|---|---|---|
boolean | isAfter(other) | 이후 날짜인지? |
boolean | isBefore(other) | 이전 날짜인지? |
boolean | isEqual(other) | 동일 날짜인지? |
long | until(other, unit) | 주어진 단위(unit) 차이를 리턴 |
LocalDateTime target = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second);
해당 코드를 통해서 원하는 날짜와 시,분,초를 생성할 수 있다.
숫자를 형식화된 문자열로 반환
원하는 형식으로 표현하기 위해 다음과 같은 패턴을 사용한다.
| 기호 | 의미 | 패턴 예 | 1234567.89→변환 결과 |
|---|---|---|---|
| 0 | 10진수(빈자리는 0으로 채움) | 0 |
0.0
00000000.00000000 | 1234568
1234567.9
0001234567.89000 |
| # | 10진수(빈자리는 채우지 않음) | #
#.#
########.######## | 1234568
1234567.9
1234567.89 |
| . | 소수점 | #.0 | 1234567.9 |
| - | 음수 기호 | +#.0
-#.0 | +1234567.9
-1234567.9 |
| , | 단위 구분 | #,###,0 | 1,234,567.9 |
| E | 지수 문자 | 0.0E0 | 1.2E6 |
| ; | 양수와 음수의 패턴을 모두 기술할 경우, 패턴 구분자 | +#,###;-#,### | +1,234,568
-1,234,568 |
| % | % 문자 | #.#% | 123456789% |
| \u00A4 | 통화 기호 | \u00A4 #.### | ₩1,234,568 |
Decimal df = new DecimalFormat("#,###.0");
String result = df.format(1234567.89); //1,234,567.9
패턴 정보와 함께 DecimalFormat 객체를 생성하고 format()method로 숫자를 제공하면 패턴에 따른 형식화된 문자열을 얻을 수 있다.
날짜를 형식화된 문자열로 변환
| 패턴 문자 | 의미 |
|---|---|
| y | 년 |
| M | 월 |
| d | 일 |
| D | 월 구분이 없는 일(1~365) |
| E | 요일 |
| a | 오전/오후 |
| w | 년의 몇번째 주 |
| W | 월의 몇번째 주 |
| 패턴 문자 | 의미 |
|---|---|
| H | 시(0~23) |
| h | 시(1~12) |
| K | 시(0~11) |
| k | 시(1~24) |
| m | 분 |
| s | 초 |
| S | 밀리세컨드(1/1000초) |
이를 통해 원하는 형식으로 표현하기 위해 다음과 같은 패턴을 사용한다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
위와 같이 패턴 정보와 함께 SimpleDateFormat 객체를 생성하고 format() method로 날짜를 제공하면 패턴과 동일한 문자열을 얻을 수 있다.
문자 또는 숫자와 관련된 표현과 반복 기호가 결합된 문자열
| 표현 및 기호 | 설명 |
|---|---|
| [] | 한개의 문자 |
| \d | 한개의 숫자, [0-9]와 동일 |
| \s | 공백 |
| \w | 한개의 알파벳 또는 한개의 숫자, [a-zA-Z0-9]와 동일 |
| . | . |
| . | 모든 문자 중 한개의 문자 |
| ? | 없음 또는 한개 |
| 표현 및 기호 | 설명 |
|---|---|
| * | 없음 또는 한개 이상 |
| + | 한개 이상 |
| {n} | 정확히 n개 |
| {n,} | 최소한 n개 |
| {n,m} | n개부터 m개까지 |
| a | b |
| () | 그룹핑 |
(02|010)-\d{3,4}-\d{4}
\w+@\w+\.\w+(\.\w+)?
.java.util.regex 패키지의 pattern 클래스이다. 정규 표현식으로 문자열을 검증하는 matches() method를 제공한다.
boolean result = Pattern.matches("정규식", "검증할 문자열");
Class 객체로 관리하는 클래스와 인터페이스의 메타 정보를 프로그램에서 읽고 수정하는 것이다.
//클래스로부터 얻는 방법
Class clazz = 클래스이름.class;
Class clazz = Class.forName("패키지...패키지이름");
//객체로부터 얻는 방법
Class clazz = 객체참조변수.getClass();
셋 중 어떤 방법을 사용하더라도 동일한 Class 객체를 얻을 수 있다.
| method | 용도 |
|---|---|
Package getPackage() | 패키지 정보 읽기 |
String getSimpleName() | 패키지를 제외한 타입 이름 |
String getName() | 패키지를 포함한 전체 타입 이름 |
package ch12.sec11_reflection.exam01;
public class CarExmaple {
public static void main(String[] args) throws Exception {
//how1, class static 필드이용
Class clazz = Car.class;
//how2, 클래스 문자열 이용
//Class clazz = Class.forName("ch12.sec11.exam01.Car");
//how3, 인스턴스를 이용
//Car car = new Car();
//Class clazz = car.getClass();
System.out.println("패키지: " + clazz.getPackage().getName());
System.out.println("클래스 간단 이름: " + clazz.getSimpleName());
System.out.println("클래스 전체 이름: " + clazz.getName());
}
}
| method | 용도 |
|---|---|
Constructor[] getDeclaredConstructors() | 생성자 정보 읽기 |
Field[] getDeclaredFields() | 필드 정보 읽기 |
Method[] getDeclaredMethods() | method 정보 읽기 |
클래스는 모두 java.lang.reflect 패키지에 있는데 각각 생성자, 필드, method에 대한 선언부 정보를 제공한다.
.class 경로를 기준으로 상대 경로에 있는 다른 리소스 파일(이미지, XML, Property 파일)의 정보를 얻을 수 있다.
| method | 용도 |
|---|---|
URL getResource(String name) | 리소스 파일의 URL 리턴 |
InputStream getResourceAsStream(String name) | 리소스 파일의 InputStream 리턴 |
클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보
코드에서 @으로 작성되는 요소이다.
대표적인 예로는 @Override가 있는데, 컴파일러가 method 재정의 검사를 하도록 설정한다. 정확히 재정의되지 않았다면 컴파일러는 에러를 발생시킨다. 어노테이션은 자바 프로그램을 개발할 때 필수 요소가 됐다.
public @interface AnnotationName{
String prop1();
int prop2() default1;
}
어노테이션은 속성을 가질 수 있다. 속성은 타입과 이름으로 구성되며, 이름 뒤에 괄호를 붙인다. 속성의 기본값은 default 키워드로 지정할 수 있다.
어노테이션은 기본 속성인 value를 가질 수 있다.
public @interface AnnotationName{
String value();
}
@AnnotationName(prop1 = "값")
@AnnotationName(prop1 = "값", propp2 =3)
@AnnotationName("값")
자바에서 어노테이션은 설정 정보이다. 어떤 대상에 설정 정보를 적용할 것인지, 클래스에 적용할 것인지, method에 적용할 것인지를 명시해야 한다.
| ElementType 열거 상수 | 적용 요소 |
|---|---|
TYPE | 클래스, 인터페이스, 열거 타입 |
ANNOTATION_TYPE | 어노테이션 |
FIELD | 필드 |
CONSTRUCTOR | 생성자 |
METHOD | method |
LOCAL_VARIABLE | 로컬 변수 |
PACKAGE | 패키지 |
@Target 어노테이션을 사용한다. @Target의 기본 속성인 value는 ElementType 배열을 값으로 가진다. 이것은 적용 대상을 복수 개로 지정하기 위해서이다.
@Target({ElementType TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotationName{}
이 어노테이션은 클래스, 필드, method에 적용할 수 있지만 생성자에는 적용할 수 없다.
@AnnotationName //TYPE(클래스)에 적용
public class ClassName{
@AnnotationName //필드에 적용
private String fieldName;
//@AnnotationName //@Target에 CONSTRUCT가 없으므로 생성자에는 적용 못함
public ClassName(){}
@AnnotationName //method에 적용
public void methodName(){}
}
@AnnotationName을 언제까지 유지할 것인지를 지정하는 것이다. 어노테이션 유지 정책은 RetentionPolicy 열거 상수로 다음과 같이 정의돼있다.
| RetentionPolicy 열거 상수 | 어노테이션 적용 시점 | 어노테이션 제거 시점 |
|---|---|---|
| SOURCE | 컴파일할 때 적용 | 컴파일 된 후에 제거됨 |
| CLASS | 메모리로 로딩할 때 적용 | 메모리로 로딩된 후에 제거됨 |
| RUNTIME | 실행할 때 적용 | 계속 유지됨 |
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName{}
이 설정 정보를 이용해서 어떻게 처리할 것인지는 애플리케이션의 몫이다. 리플렉션을 이용해서 적용 대상으로부터 어노테이션의 정보를 method를 통해서 얻어낼 수 있다.
| 리턴 타입 | method명(매개변수) | 설명 |
|---|---|---|
boolean | isAnnotationPresent(AnnotationName.class) | 지정한 어노테이션이 적용되었는지 여부 |
Annotation | getAnnotation(AnnotationName.class) | 지정한 어노테이션이 적용되어 있으면 어노테이션을 리턴하고, 그렇지 않다면 null을 리턴 |
Annotation[] | getDeclaredAnnotations() | 적용된 모든 어노테이션을 리턴 |