API 도큐먼트
라이브러리를 쉽게 찾고 사용하도록 방법을 기술한것
자바 표준 모듈에서 제공하는 라이브러리는 방대하므로 쉽게 찾아서 사용가능하도록 도와주는 API 도큐먼트가 있다.
라이브러리가 클래스와 인터페이스 집합이라면
API 도큐먼트는 이를 사용하기 위한 방법을 기술한것
https://docs.oracle.com/en/java/javase/index.html
자바 버전을 선택하고 왼쪽 메뉴에서 [API Document] 버튼 클릭하면 버전에 따른 API 도큐먼트 페이지가 열린다.
String 도큐먼트를 통해 API 도큐먼트를 읽는 방법(찾는 방법)
방법1 : 웹사이트 메뉴 이용
1. [All Modules] 탭에서 java.base 모듈 클릭
2. java.base 의 Packages 목록에서 java.lang 패키지 클릭
3. java.lang의 [All Classes and Interfaces] 탭에서 String 클래스 클릭
방법2 : 웹사이트 검색 이용
1. 오른쪽 상단의 Search 검색란에 'String' 입력
2. 드롭다운 목록에서 java.lang.String 항목 선택
방법3 : 이클립스 이용
1. 자바 코드에서 String 클래스를 마우스로 선택하고 F1 키 누르면 Help 뷰가 나타남
2. Help 뷰에서 javadoc for 'java.lang.String' 링크 클릭시 String 도큐먼트로 이동
①선언부
API 도큐먼트에서 String 클래스가 어떻게 정의되었는지 확인 가능
클래스가 final인지 추상(abstract)인지 유추 가능
부모 클래스와 구현 인터페이스를 확인 가능
②상속 계층도
전체 상속 관계를 확인 가능
String이 가지고 있는 멤버를 보려면 상단 메뉴의 SUMMARY 활용
SUMMARY는 선언된 멤버별로 이동하는 링크 제공
링크가 있으면 공개된(public, protected) 멤버가 있다는 뜻이고
링크가 없으면 공개된 멤버가 없다는 뜻
SUMMARY | |
---|---|
NESTED | 중첩 클래스/중첩 인터페이스 목록으로 이동하는 링크 |
FIELD | 필드 목록으로 이동하는 링크 |
CONSTR | 생성자 목록으로 이동하는 링크 |
METHOD | 메소드 목록으로 이동하는 링크 |
SUMMARY에서 FIELD 링크를 클릭하면 필드 목록으로 이동한다.
첫번째에서 static 여부와 필드 타입 확인 가능
두번째, 세번째는 필드명과 그에 대한 간단한 설명
필드명 클릭하면 필드 선언부와 상세 설명 확인가능
관례적으로 필드 이름이 모두 대문자이면 public static final로 선언된 상수 필드임
SUMMARY에서 CONSTR 링크를 클릭하면 생성자 목록으로 이동한다.
첫번째에서 생성자의 매개변수 타입 확인 가능
두번째에서 이에 대한 간단한 설명
String 클래스는 매개변수 타입과 개수를 달리한 10개가 넘는 생성자들이 오버로딩 되어있다.
SUMMARY에서 METHOD 링크를 클릭하면 메소드 목록으로 이동한다.
Modifier and Type에서는 static 여부롸 리턴 타입이 무엇인지 알 수 있다.
Method 에서는 메소드명과 매개변수 타입 및 개수를 알수있고, 그에 대한 설명이 기술되어있다.
java.base
모듈이 의존하는 기본모듈
모듈 중 유일하게 requires하지 않아도 사용가능
이 모듈에 포함된 패키지는 대부분 자바 프로그램에서 많이 사용하는것들
java.base 모듈에 포함된 주요 패키지와 용도 |
---|
![]() |
자주 사용하는 String, System, Integer, Double, Exception, RuntimeException 등의 클래스는 java.lang 패키지 안에 있고,
키보드 입력을 위해 사용하는 Scanner는 java.util 패키지에 있음
java.lang
자바 언어의 기본적인 클래스를 담고있는 패키지
이 패키지에 포함된 클래스와 인터페이스는 import 안해도 사용가능
java.lang패키지에 포함된 주요 클래스와 용도 |
---|
![]() |
클래스 선언시 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속받음
따라서 자바의 모든 클래스는 Object의 자식이거나 자손 클래스임
그래서 Object 가 가진 메소드는 모든 객체에서 사용가능
Object가 가진 주요 메소드 |
---|
![]() |
equals() 메소드
Object의 는 객체의 번지 비교, boolean값 리턴
public boolean equals(Object obj)
-> 매개변수 타입이 Object 타입이므로 자동타입변환이 되어 모든 객체가 매개값으로 대입될수있다.
==와 동일한 결과를 리턴
두 객체가 동일한 객체라면 ture 리턴, 그렇지 않으면 false를 리턴
Object obj1 = new Object();
Object obj2 = obj1;
boolean result = obj1.equals(obj2); // 결과 동일
boolean result = (obj == obj2); // 결과 동일
일반적으로 Object의 equals() 메소드는 재정의해서 동등 비교용으로 사용된다.
동등비교 : 객체가 달라도 내부 데이터가 같은지 비교하는것
String은 equals() 메소드를 재정의해서 내부 문자열이 같은지 비교한다.
예제 설명 : Member 객체의 동등 비교를 위해서 equals() 메소드를 재정의.
Member 타입이면서 id 필드값이 같을 경우는 true를 리턴하고, 그 이외의 경우는 모두 false를 리턴
package ch12.sec03.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) { //java 16으로 업데이트 해야한다고함(에러)
if(id.equals(target.id)) {
return true;
}
}
return false;
}
}
package ch12.sec03.exam01;
public class EqualsExample {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("blue");
if(obj1.equals(obj2)) { //매개값이 Member타입이고 id도 동일하므로 true
System.out.println("obj1과 obj2는 동등함");
} else {
System.out.println("obj1과 obj2는 동등하지 않음");
}
if(obj1.equals(obj3)) { //매개값이 Member타입이지만, id가 다르므로 false
System.out.println("obj1과 obj3은 동등함");
} else {
System.out.println("obj1과 obj3는 동등하지 않음");
}
// obj1과 obj2는 동등함
// obj1과 obj3는 동등하지 않음
}
}
객체 해시코드
메모리에 할당된 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값
Object의 hashCode() : 객체의 메모리 번지를 이용해서 해시코드를 생성하기때문에 객체마다 다른 정수값을 리턴, equals() 메소드와 비슷하게 두 객체가 동등한지 비교할때 주로 사용
public int hashCode()
equals() 메소드와 마찬가지로 hashCode() 메소드 역시 객체의 데이터를 기준으로 재정의해서 새로운 정수값을 리턴하도록 하는것이 일반적임
객체가 다르더라도 내부 데이터가 동일하면 같은 정수값 리턴하게 하기 위해서임
자바는 두 객체가 동등함을 비교할때 hashCode()와 equals()를 같이 사용하는 경우가 많음
hashCode()가 리턴하는 정수값이 같은지 확인하고
equals()가 true를 리턴하는지 확인해서
동등객체임을 판단함
예제 설명 : Student 객체를 동등 비교하기위해 hashCode()와 equals() 메소드 재정의함, 학생 번호와 이름으로 해시코드 생성하고, 학생번호와 이름이 동일한 경우만 equals() 가 true를 리턴하도록 함
package ch12.sec03.exam02;
public class Student {
private int no;
private String name;
public Student(int no, String name) {
this.no = no;
this.name = name;
}
public int getNo() { return no; }
public String getName() { return name; }
@Override
public int hashCode() {
int hashCode = no + name.hashCode();
return hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student target) { //에러남 java 8에서 사용 불가한 문법(target이라는 변수 바로 만들어 쓸수 없음)
if(no == target.getNo() && name.equals(target.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()) {
if(s1.equals(s2)) {
System.out.println("동등 객체입니다.");
} else {
System.out.println("데이터가 다르므로 동등객체가 아닙니다. ");
}
} else {
System.out.println("해시코드가 다르므로 동등객체가 아닙니다. ");
}
// 동등 객체입니다.
}
}
15장에서 배울 컬렉션에 속하는 HashSet
HashSet
동등 객체를 중복 저장하지 않는 특징
hashCode()와 equals() 메소드를 이용해 동등객체인지 확인함
예제 설명 : Student 객체를 hashSet 에 저장하고, 저장 개수를 확인하였는데 hashSet.add()를 3번 했지만 동등객체는 중복 저장하지 않아서 개수가 2개뿐인것을 확인할 수 있음
s1객체와 s2객체는 학생 번호와 이름이 같아서 동등객체임
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); //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());
// 저장된 객체 수 : 1
// 저장된 객체 수 : 1 (동등 객체는 중복 저장되지 않음)
// 저장된 객체 수 : 2
}
}
Student 클래스의 hashCode() 재정의 코드를 주석처리하고 HashSetExample.java를 재실행해보면
hashCode() 재정의 하지 않으면 객체번지로 해시코드를 생성하므로 객체가 다를경우 해시코드도 달라짐
따라서 s1,s2 객체는 동등 객체가 아니므로 따로 저장되어 아래와 같이 출력된다.
// 저장된 객체 수 : 1
// 저장된 객체 수 : 2
// 저장된 객체 수 : 3
Object의 toString() 메소드는 객체의 문자 정보를 리턴한다.
toString()
객체의 문자 정보를 리턴
객체의 문자 정보 : 객체를 문자열로 표현한 값
기본적으로는 Object의 toString() 메소드는 '클래스명@16진수해시코드'로 구성된 문자열을 리턴한다.
객체의 문자 정보가 중요한 경우에는 Object의 toString() 메소드를 재정의해서 간결하고 유익한 정보를 리턴하도록 해야한다.
예를 들어 Date 클래스는 현재날짜와 시간을, String 클래스는 저장된 문자열을 리턴하도록 toString() 메소드를 재정의하고있다.
예제 설명 : SmartPhone 객체의 문자 정보로 제조회사 및 운영체제를 리턴하도록 toString() 메소드를 재정의한다.
package ch12.sec03.exam03;
public class SmartPhone {
private String company;
private String os;
public SmartPhone(String company, String os) {
this.company = company;
this.os = os;
}
@Override
public String toString() { //Object의 toString() 메소드를 재정의해서 결합 문자열을 리턴하도록 함
return company + ", " + os;
}
}
package ch12.sec03.exam03;
public class ToStringExample {
public static void main(String[] args) {
SmartPhone myPhone = new SmartPhone("삼성전자", "안드로이드");
String strObj = myPhone.toString();
System.out.println(strObj); // 삼성전자, 안드로이드
System.out.println(myPhone); // 삼성전자, 안드로이드
}
}
System.out.println()
매개값이 기본타입이거나 문자열일경우 해당값을 그대로 출력
매개값이 객체가 되면 객체의 toString() 메소드를 호출해서 리턴값을 출력
데이터 전달을 위한 DTO(Data Transfer Object) 작성시 반복적으로 사용되는 코드를 줄이기 위해 Java 14 부터 레코드가 도입
예를 들어 사람의 정보를 전달하기 위한 Person DTO 가 다음과 같으면
public class person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String name() {
return this.name;
}
public String age() {
return this.age;
}
@Override
public int hashCode() {...}
@Override
public boolean equals(Object obj) {...}
@Override
public String toString() {...}
}
Person의 데이터(필드)는 읽기만 가능하도록 private final로 선언하였고,
필드 이름과 동일한 Getter 메소드를 갖고있다.
그리고 동등 비교를 위해 hashCode, equals() 메소드를 재정의 하고 있고, 의미있는 문자열 출력을 위해 toString() 메소드를 재정의하고있다.
다음 코드는 위와 동일한 코드를 생성하는 레코드 선언이다.
class 키워드 대신 record로 대체하고 클래스 이름 뒤에 괄호 작성해 저장할 데이터의 종류를 변수로 선언하였다.
public recore Person(String name, int age) {
}
이렇게 선언된 레코드 소스를 컴파일 하면 변수의 타입과 이름을 이용해 private final 필드가 자동생성되고, 생성자 및 Getter 메소드가 자동으로 추가된다. 그리고 hashCode(), equals(), toString() 메소드를 재정의한 코드도 자동 추가된다.
java 14부터 가능하므로 코드 생략
롬복 Lombok
개발자들이 즐겨쓰는 자동 코드 생성 라이브러리
JDK 에 포함된 표준 라이브러리는 아님
레코드와 마찬가지로 DTO 클래스 작성할때 Getter, Setter, hashCode(), equals(), toString() 메소드를 자동 생성하므로 작성 코드의 양을 줄여줌
레코드와의 차이점은
이클립스에서 롬복 사용하려면 설치해야함
URL로 가서 설치파일(lombok.jar)을 다운로드
http://projectlombok.org/download
명령 프롬프트(또는 터미널)에서 다운로드 받은 lombok.jar 파일이 있는곳으로 이동해서 다음 명령어 java -jar lombok.jar
를 실행
주의 : 명령 프롬프트는 관리자 권한으로 실행해야한다
윈도우와 맥os에서 자동으로 롬복 설치할 이클립스를 찾아줄텐데
만약 찾지 못하면 [specify location] 버튼을 클릭해서 수동으로 이클립스를 지정하면 된다 .
install/update 버튼 클릭해 설치
설치 끝나면 닫고 이클립스가 롬복 기능을 인식하도록 이클립스를 재시작
재시작 되었다면 package explorer 뷰에서 thisisjava 프로젝트를 선택한 다음 마우스 오른버튼 클릭해 new - folder 메뉴 선택해서 lib 폴더 생성
그리고 다운로드한 lombok.jar 파일을 lib 폴더로 복사한다.
마지막으로 thisisjava 프로젝트에서 lombok 라이브러리를 사용할 수 있도록 lombok.jar 파일을 선택하고 마우스 오른버튼 클릭 build path - add to build path 선택
@Data
public class Member {
private String id;
private String name;
private int age;
}
@Data
@Data가 붙으면 컴파일시 기본 생성자와 함께 Getter, Setter, hashCode(), ( equals(), toString() 메소드가 자동 생성
(package explorer 뷰에서 Member 클래스를 확장해보면 확인 가능)
다양한 어노테이션 |
---|
![]() |
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
private String id;
private String name;
private int age;
}
@Data 에 포함되어있는 @RequiredArgsConstructor 는 기본적으로 매개변수 없는 생성자를 포함시키지만, final 또는 @NonNull 이 붙은 필드가 있으면 이 필드만 초기화시키는 생성자를 포함시킨다.
@Data
public class Member {
private String id;
@NonNull private String name;
private int age;
}
final 과 @NonNull 의 차이점은 초기화된 final 필드는 변경할수 없지만 (Setter가 만들어지지 않음), @NonNull 은 null 이 아닌 다른값으로 Setter를 통해 변경할 수 있다는 것이다.
자바 프로그램은 운영체제상에서 바로 실행되는게 아니라 JVM(자바 가상 머신) 위에서 실행된다.
따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기란 어렵다.
하지만 java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다.
System 클래스의 정적 필드와 메소드를 이용하면 프로그램 종료, 키보드 입력, 콘솔(모니터) 출력, 현재 시간 읽기, 시스템 프로퍼티 읽기 등이 가능
out 필드를 이용하면 콘솔에 원하는 문자열을 출력할 수 있다.
System.out.println();
err 필드도 out 필드와 동일한데 콘솔 종류에 따라 에러 내용이 빨간색으로 출력된다는 차이점이 있다.
System.err.println();
자바는 키보드로 부터 입력된 키를 읽기 위해 System 클래스에서 in 필드를 제공한다.
in 필드를 이용해서 read() 메소드를 호출하면 입력된 키의 코드값을 얻을 수 있다.
int keyCode = System.in.read();
키 코드(각 키에 부여된 번호) |
---|
![]() |
운영체제는 실행중인 프로그램을 프로세스로 관리
자바 프로그램을 시작하면 JVM 프로세스가 생성되고,
이 프로세스가 main() 메소드를 호출
프로세스를 강제 종료하고 싶다면 System.exit( ) 메소드를 사용한다.
System.exit(int status)
System 클래스의 currentimeMillis() 메소드와 nanoTime() 메소드
currentimeMillis() , nanoTime()
1970년 1월 1일 0시부터 시작해서 현재까지 진행된 시간을 리턴
시스템 프로퍼티
자바 프로그램이 시작될 때 자동 설정되는 시스템의 속성
예를 들어 운영체제의 종류 및 사용자 정보, 자바 버전 등의 기본 사양 정보
문자열 관련된 주요 클래스 |
---|
![]() |
자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리된다.
문자열은 return String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 통해 직접 String 객체를 생성할 수도 있다.
String 클래스는 Deprecated(비권장) 된 생성자를 제외하고 약 13개의 생성자를 제공한다.
String. 객체를 생성할지는 제공되는 매개값의 타입에 달려있다.
문자열을 버퍼에 담아 그 안에서 추가 수정 삭제 작업을 할 수 있도록 도와주는 클래스이다.
새로운 객체를 만들지 않고도 자유롭게 문자 변경 작업을 하는게 프로그램 성능 차원에서 훨씬 효율적이다
toString()을 제외한 다른 메소드는 StringBuilder를 다시 리턴하기 때문에 연이어서 다른 메소드를 호출 할 수 있는 메소드 체이닝 패턴을 사용할 수 있다
package ch12.sec05;
public class StringBuilderExample {
public static void main(String[] args) {
String data = new StringBuilder()
//메소드 체이닝 패턴
.append("DEF")
.insert(0, "ABC")
.delete (3,4)
.toString();
System.out.println(data);
}
}
문자열이 구분자로 연결되어 있을 경우, 구분자를 기준으로 문자열을 분리하려면
String 의 split() 메소드를 이용하거나, StringTokenizer 클래스를 이용할 수 있다.
여러 종류가 아닌 한 종류의 구분자만 있다면 StringTokenizer를 사용할 수 있다.
객체 생성 방법
첫번째 매개값으로 전체 문자열, 두번째 매개값으로 구분자를 준다.(구분자 생략 시 공백이 기본 구문자가 된다.)
StringTokenizer 객체가 생성되면 다음 메소들을 이용하여 분리된 문자열을 얻을 수 있다.
nextToken()
분리된 문자열을 하나씩 가져오고, 더 이상 가져올 문자열이 없으면 예외 발생시킴
nextToken() 사용 전에 hasMoreTokens() 메소드로 가져올 문자열이 있는지 조사하는게 좋음
public class StringTokenizerExample {
public static void main(Stirng[] args) {
String data1 = "홍길동&태연,아이유";
String[] arr1 = data1.split("&!,");
for(String token : arr) {
System.out.println(token);
}
System.out.println();
String data2 = "홍길동/태연/아이유";
StringTokenizer st = new StringTokenizer(data2, "/");
while (st.hasMoreTokens()) {
String token = st.nextToken();
System.out.println(token);
}
}
}
//홍길동
//태연
//아이유
//홍길동
//태연
//아이유
포장 객체
기본 타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체
자바는 기본 타입의 값을 갖는 객체를 생성 가능
포장하고 있는 기본 타입의 값은 외부에서 변경 불가, 객체 생성의 목적
포장객체를 생성하기 위한 클래스는 java.lang 패키지에 포함되어 있음
Character와 Integer만 빼고 첫문자 대문자로 바꾼 이름을 갖고있음
포장 객체가 필요한 이유는 컬렉션 객체 때문
Integer obj = 100; //박싱
int value = obj; //언박싱
언박싱은 연산 과정에서도 발생한다. obj 는 50과 연산되기 전에 언박싱된다.
int value = obj + 50; //언박싱 후 연산
public class BoxingUnBoxingExample {
public static void main(String[] args) {
//Boxing
Integer obj = 100;
System.out.println("value: " + obj.intValue()); //intValue() 메소드는 Integer 객체 내부의 int 값을 리턴
//UnBoxing
int value = obj;
System.out.println("value: " + value);
//연산 시 Unboxing
int result = obj + 100;
System.out.println("result: " + result);
}
}
//value: 100
//value: 100
//result: 200
포장 클래스는 문자열을 기본 타입 값으로 변환 할 때도 사용
대부분의 포장 클래스에는 “parse + 기본타입” 명으로 되어있는 정적 메소드가 있다.
이 메소드는 문자열을 해당 기본 타입값으로 변환한다.
==, != 비교연산
포장 객체의 번지를 비교
그래서 포장 객체는 내부 값 비교 할때 ==와 ≠ 연산자 사용불가
//동일한 값, 객체 주소가 다름
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println(obj1 == obj2);//false(주소가 달라서)
예외!!
포장 객체의 효율적 사용을 위해 다음 범위의 값을 갖는 포장 객체는 공유된다.
이 범위의 값을 갖는 포장 객체는 ==와 ≠ 연산자로 비교 가능하지만 내부 값이 아닌 주소 비교임
내부 값 비교
equals()로 가능
포장 클래스의 equals() 메소드는 내부의 값을 비교하도록 재정의 되어있음
Math 클래스
수학 계산에 사용할 수 있는 메소드 제공
Math 클래스의 메소드는 모두 정적(static)이므로 Math 클래스로 바로 사용 가능
Math 클래스가 제공하는 주요 메소드 |
---|
![]() |
random()
random() 메소드는 0.0 과 1.0 사이의 double 타입 난수를 리턴
난수를 얻는 또 다른 방법으로는 java.util.Ramdom 클래스를 이용할수있음 (boolean, int, double 난수를 얻을 수 있음)
int num = (int) (Math.random() * n) + start;
Random 객체를 생성하기 위한 생성자 |
---|
![]() |
종자값(seed)이란 난수를 만드는 알고리즘에 사용되는 값으로, 종자값이 같으면 같은 난수를 얻는다. |
.
Random 클래스가 제공하는 메소드 |
---|
![]() |
Date 와 Calendar 클래스
컴퓨터의 날짜 및 시각을 읽을 수 있도록 해주는 클래스
java.util 패키지
LocalDateTime 등의 클래스
날짜와 시간을 조작할 수 있도록 해주는 클래스
java.time 패키지
Date
날짜 표현 클래스
객체 간에 날짜 정보를 주고 받을 때 사용
Date 생성자는 여러개로 선언되어있지만 대부분 Deprecated되어 Date() 생성자만 주로 사용
Date 생성자
컴퓨터의 현재 날짜를 읽어 Date 객체로 만든다.
Date now = new Date();
toString()
현재 날짜를 문자열로 얻을수 있음. 대신 영어로 출력
Sun Nov 28 19:29:51 KST 2021
SimpleDateFormat 클래스
현재 날짜 원하는 형태의 문자열로 얻고싶을때
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
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);
}
}
// 결과
// Sun Nov 28 19:29:51 KST 2021
// 2021.11.28 19:29:51
Calendar 클래스
달력을 표현하는 추상 클래스
- 날짜와 시간을 계산하는 방법이 지역과 문화에 따라 다르기 때문에 특정 역법에 따르는 달력은 자식 클래스에서 구현하도록 되어 있다.
- Calendar 클래스의 정적 메소드인 getInstance() 메소드를 이용하면 컴퓨터에 설정되어있는 시간대를 기준으로 Calendar 하위 객체를 얻을 수 있다.
Calendar now = Calendar.getInstance();
Calendar 가 제공하는 날짜와 시간에 대한 정보를 얻기 위해서는 get 메소드를 이용 |
---|
![]() |
TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
Calendar now = Calendar.getInstance(timeZone);
LocalDateTime 클래스가 제공하는 메소드 |
---|
![]() |
//LocalDataTime 클래스를 이용하여 현재 컴퓨터의 날짜와 시간을 얻는 방법
LocalDateTime now = LocalDateTime.now();
//현재 시간에서 년, 월, 일을 연산하는 방법에 대한 예제
public class DateTimeOperationExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
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));
}
}
// 결과
// 현재 시간: 2021.11.28 오후 21:13:37
// 1년 덧셈: 2022.11.28 오후 21:13:37
// 2월 뺄셈: 2021.09.28 오후 21:13:37
// 7일 덧셈: 2021.12.05 오후 21:13:37
LocalDateTime 클래스는 날짜와 시간을 비교할 수 있는 다음 메소드도 제공
날짜와 시간 비교 메소드 |
---|
![]() |
비교를 위해 특정 날짜와 시간으로 LocalDateTime 객체를 얻으려면 year 부터 second 까지 매개값을 모두 int 타입 값으로 제공하면 된다.
LocalDateTime target = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second)
Format(형식) 클래스 - 숫자 또는 날짜를 원하는 형태의 문자열로 변환해주는 기능을 제공한다.
Format 클래스는 java.text 패키지에 포함되어있다.
주요 Format 클래스 |
---|
![]() |
DecimalFormat
숫자를 형식화된 문자열로 변환하는 기능을 제공
패턴 (원하는 형식으로 표현하기 위해 사용) |
---|
![]() |
패턴 정보와 함께 DecimalFormat 객체를 생성하고, format() 메소드로 숫자를 제공하면 패턴에 따른 문자열을 얻을 수 있다.
DecimalFormat df = new DecimalFormat("#,###.0");
String result = df.format(1234567.89); // 1,234,567.9
SimpleDateFormat
날짜를 형식화된 문자열로 변환하는 기능을 제공
패턴 (원하는 형식으로 표현하기 위해 사용) |
---|
![]() |
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
String strDate = sdf.format(new Date()); // 2021년 11월 28일
문자열이 정해져 있는 형식으로 구성되어 있는지 검증해야 할 때, 정규 표현식을 이용하여 문자열이 올바르게 구성되어 있는지 검증
정규 표현식을 구성하는 표현 및 기호 |
---|
![]() |
//02-123-1234 또는 010-1234-5678 과 같은 전화번호를 위한 정규 표현식
(02|010)-\d{3,4}-\d{4}
//white@naver.com 과 같은 이메일을 위한 정규 표현
\w+@\w+\.\w+(\.\w+)?
주의할 점은 . 과 . 은 다르다는 것이다. . 은 문자로서의 점(.) 을 말하지만 . 은 모든 문자 중에서 한개의 문자를 뜻한다.
matches()
- java.util.regex 패키지의 Pattern 클래스는 정규 표현식으로 문자열을 검증하는 matches() 메소드를 제공
- 첫번째 매개값은 정규 표현식이고, 두번째 매개값은 검증할 문자열
- 검증한 후의 결과는 boolean 타입으로 리턴
boolean result = Pattern.matches("정규식", "검증할 문자열");
public class PatternExample {
public static void main(String[] args) {
String regExp = "(02|010)-\\d{3,4}-\\d{4}";
String data = "010-123-4567";
boolean result = Pattern.matches(regExp, data);
if(result) {
System.out.println("정규식과 일치합니다.");
} else {
System.out.println("정규식과 일치하지 않습니다.");
}
String regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
String data = "angel@mycompanycom";
boolean result = Pattern.matches(regExp, data);
if(result) {
System.out.println("정규식과 일치합니다.");
} else {
System.out.println("정규식과 일치하지 않습니다.");
}
}
}
// 결과
// 정규식과 일치합니다.
// 정규식과 일치하지 않습니다.
// 실행 결과에서 이메일 검증이 실패한 이유는 @ 뒤에 최소한 하나의 점이 와야 하기 때문이다.
// mycompany.com 이라고 해야 맞다.
리플렉션
메타 정보를 프로그램에서 읽고 수정하는 행위
메타 정보
패키지 정보, 타입 정보, 멤버(생성자, 필드, 메소드) 정보 등을 말한다.
① Class clazz = 클래스이름.class; // 클래스로부터 얻는 방법
② Class clazz = Class.forName("패키지...클래스이름"); // 클래스로부터 얻는 방법
③ Class clazz = 객체참조변수.getClass(); // 객체로부터 얻는 방법
①, ② 는 클래스 이름만 가지고 Class 객체를 얻는 방법
③ 은 객체로부터 Class 객체를 얻는 방법
// String 클래스의 Class 객체를 얻는 방법
Class clazz = String.class;
Class clazz = Class.forName("java.lang.String");
String str = "김자바";
Class clazz = str.getClass();
패키지, 타입(클래스, 인터페이스), 이름 정보를 얻는 메소드 |
---|
![]() |
// car class 생성
public class Car {
}
public class GetClassExample {
public static void main(String[] args) throws Exception {
// how1
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());
}
}
// 결과
// 패키지: ch12.sec11.exam01
// 클래스 간단 이름: Car
// 클래스 전체 이름: ch12.sec11.exam01.Car
타입(클래스, 인터페이스)가 갖고있는 멤버 정보를 얻을수있는 메소드 |
---|
![]() |
각각 Constructor배열, Field배열, Method배열을 리턴한다.
Constructor, Field, Method 클래스는 모두 java.lang.reflect 패키지에 있는데, 각각 생성자, 필드, 메소드에 대한 선언부 정보를 제공한다.
출처: 이것이 자바다 (개정판) : JAVA 프로그래밍의 기본서 - 신용권, 임경균 저