Java 9일차
API 도큐먼트
자바 API 도큐먼트
- 라이브러리라고 부르기도 하며 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음
java.lang
-
기본적은 클래스를 담고 있는 패키지 ⇒ import 없이 사용할 수 있음
클래스 용도 Object 자바 클래스의 최상위 클래스 System 표준 입출력 장치, 자바 가상 머신 종료, 쓰레기 수집기 요청 Class 클래스 메모리로 로딩 String 문자열 저장하고 여러 가지 정보 얻을 때 StringBuffer, StringBuilder 문자열 저장하고 내부 문자열 조작 Math 수학 함수 Wrapper(Byte, short, Character, Integer, Float, Double, Boolean, Long) 기본 타입 데이터 갖는 객체 생성 문자열 기본 타입으로 변환할 때 입력값 검사
java.util
-
대부분 컬렉션 클래스
클래스 용도 Arrays 배열 조작 Calendar 운영체제의 날짜와 시간 Date 날짜, 시간 정보 저장하는 클래스 Objects 객체 비교, null 여부 조사 StringTokenizer 특정 문자로 구분된 문자열 뽑아낼 때 Random 난수 얻을 때
Object 클래스
- 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스 상속
- 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스
객체 비교(equals())
- 모든 객체가 매개값으로 대입될 수 있음 ⇒ Object가 최상위 타입이므로 모든 객체는 Object 타입으로 자동 변환
- equals 메소드 재정의 할 때는 instanceof 연산자로 기준 객체와 동일한 타입인지 확인 필요
- 두 객체를 동등 비교할 때 사용 ⇒ 논리적으로 동등하면 true, 아니면 false
- 논리적으로 동등 : 같은 객체인지 상관없이 저장하고 있는 데이터가 동일함
객체 해시코드(hasCode())
- 객체를 식별할 하나의 정수값
- 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴
- 객체의 동등 비교를 위해 equals() 메소드와 hashCode() 메소드 모두 재정의 해서 논리적 동등 객체일 경우 동일한 해시코드가 리턴되도록 해야 함
객체 문자 정보(toString())
- 객체의 문자 정보 리턴
객체 복제(clone())
- 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체 생성
- 원본 객체를 안전하게 보호하기 위해
- 얕은 복제
- 단순히 필드값을 복사해서 객체를 복제하는 것
- 원본 객체와 복제 객체가 같은 객체 참조 ⇒ 복제 객체에서 참조 객체 바꾸면 원본 객체도 변경된 객체 참조
- 클래스 설계자가 복제를 허용하지 않으면 Cloneable 인터페이스 구현하지 않음
- clone()은 CloneNotSupportedException 예외 처리 필요 ⇒ try-catch 구문
- 깊은 복제
- 참조하고 있는 객체도 복제하는 것
객체 소멸자
- 참조하지 않는 배열이나 객체는 쓰레기 수집기가 힙 영역에서 자동으로 소멸
- 쓰레기 수집기는 객체를 소멸하기 직전에 객체의 소멸자 실행시킴(finalize())
Objects 클래스
- Object와 유사한 이름을 가진 java.util.Objects 클래스
- 객체 비교, 해시코드 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행하는 정적 메소드들로 구성된 Object의 유틸리티 클래스
객체 비교(compare(T a, T b, Comparatorc))
- 두 객체를 비교자(Comparator)로 비교해서 int 값 리턴
- a < b = 음수, a == b = 0, a > b = 양수
동등 비교(equals(), deepEquls())
a | b | Objects.equals(a, b) |
---|---|---|
not null | not null | a.equals(b)의 리턴값 |
null | not null | false |
not null | null | false |
null | null | true |
a | b | Objects.deepEquals(a, b) |
---|---|---|
not null(not array) | not null(not array) | a.equals(b)의 리턴값 |
not null(array) | not null(array) | Arrays.deepEquals(a, b)의 리턴값 |
not null | null | false |
null | not null | false |
null | null | true |
해시코드 생성(hash(), hashCode())
- 매개값으로 주어진 값들을 이용해서 해시 코드를 생성하는 역할
Null 여부 조사(isNull(), nonNull(), requireNonNull())
-
requireNonNull
리턴 타입 메소드(매개 변수) 설명 T requireNonNull(T obj) not null → obj, null → NullPointerException T requireNonNull(T obj, String message) not null → obj, null → NullPointerException(message) T requireNonNull(T obj, Supplier msgSupplier) not null → obj, null → NullPointerException(msgSupplier.get())
객체 문자 정보(toString())
리턴 타입 | 메소드(매개 변수) | 설명 |
---|---|---|
String | toString(Object o) | not null → o.toString(), null → “null” |
String | toString(Object o, String nullDefault) | not null → o.toString(), null → nullDefault |
System 클래스
- 운영체제 일부 기능 이용 할 수 있음
프로그램 종료(exit())
- 강제로 JVM 종료
- int 매개값
- 0 : 정장 종료
- 0 이외 : 비정상 종료
쓰레기 수집기 실행(gc())
- 개발자가 실행시키는 것이 아닌 JVM 에게 빨리 실행해달라고 요청
현재 시각 읽기(currentTimeMillis(), nanoTime())
- 컴퓨터 시계로부터 현재 시간을 읽어서 long 값 리턴
시스템 프로퍼티 읽기(getProperty())
- JVM이 시작할 때 자동 설정되는 시스템의 속성값
환경 변수 읽기(getenv())
- 운영체제가 실행되는 프로그램들에게 유용한 정보를 제공할 목적으로 환경 변수 제공
- 프로그램상 변수가 아닌 운영체제에서 이름과 값으로 관리되는 문자열 정보
클래스
- 자바는 클래스와 인터페이스의 메타 데이터를 java.lang 패키지에 소속된 Class클래스로 관리
- 메타 데이터 : 클래스 이름, 생성자 정보, 필드 정보, 메소드 정보
Class 객체 얻기(getClass(), forName())
- Object 는 모든 클래스의 최상위 클래스 ⇒ 모든 클래스에서 getClass() 메소드 호출 가능
- Class는 생성자를 감추고 있어서 new 연산자로 객체 생성 불가 ⇒ 정적 메소드 forName() 사용
- forName() 메소드는 클래스 전체 이름을 매개값으로 받고 Class 객체 리턴
- Class.forName() ⇒ 클래스 찾지 못하면 ClassNotFoundException 예외 발생
리플렉션(getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods())
- Class 객체를 이용하여 클래스의 생성자, 필드, 메소드 정보를 알아내는 것
동적 객체 생성(newInstance())
- Class 객체를 이용하여 new 연산자를 사용하지 않고 동적으로 객체 생성
- 코드 작성 시에 클래스 이름 결정할 수 없고 런타임 시에 클래스 이름이 결정되는 경우 유용
String
String 메소드
- 문자 추출(charAt)
- 매가값으로 주어진 인덱스의 문자 리턴
- 문자열 비교(equals())
- 기본 타입 변수값 비교할 때는 == 연산자
- 문자열 번지 말고 순수 문자열 비교할 때 사용
- 바이트 배열로 변환(getByte())
- 문자열을 바이트 배열로 변환
- 문자열 찾기(indexOf())
- 매개값으로 주어진 문자열이 시작되는 인덱스 리턴
- 없으면 -1
- 문자열 길이(length())
- 문자열 대치(replace())
- 첫번째 매개값을 찾아 두번째 매개값으로 대치한 새로운 문자열 생성, 리턴
- 문자열 잘라내기(substring())
- 주어진 인덱스에서 문자열 추출
- 인덱스 1개 ⇒ 주어진 인덱스부터 끝까지 문자열 추출
- 인덱스 2개 ⇒ 시작과 끝 인덱스 사이의 문자열 추출(시작 이상 끝 미만)
- 알파벳 대소문자 변경(toUpperCase() toLowerCase())
- 알파벳을 모두 대,소문자로 바꾼 새로운 문자열 생성, 리턴
- 문자열 앞뒤 공백 잘라내기(trim())
- 문자열의 앞뒤 공백 제거한 새로운 문자열 생성
- 중간 공백은 제거하지 않음
StringTokenizer
- 문자열이 특정 구분자로 연결되어 있을 경우, 구분자를 기준으로 부분 문자열을 분리하기 위해 사용
split() 메소드
- 정규 표현식을 구분자로 해서 문자열을 분리한 후, 배열에 저장 / 리턴
StringTokenizer 클래스
- 문자열이 한 종류의 구분자로 연결되어 있을 경우
-
StringTokenizer 객체 생성할 때 첫 번째 매개값으로 전체 문자열, 두번째 매개값으로 구분자 ⇒ 구분자 생략 시 공백이 기본 구분자
메소드 설명 countTokens() 꺼내지 않고 남아 있는 토큰 수 boolean 남이 있는 토큰 여부 String 토큰 하나씩 꺼내옴
StringBuffer, StringBuilder
- 문자열 변경 작업이 많을 경우 사용 ⇒ String 처럼 새로운 객체 만들지 않고도 문자열 조작
- StringBuffer : 멀티 스레드 환경에서 사용할 수 있도록 동기화 적용
-
StringBuilder: 단일 스레드 환경에서만 사용
메소드 설명 append() 문자열 끝에 주어진 매개값 추가 insert(int offset, …) 문자열 중간에 주어진 매개값 추가 delete(int start, int end) 문자열의 일부분 삭제 deleteCharAt(int index) 문자열에서 주어진 index의 문자 삭제 replace(int start, int end, String str) 문자열의 일부분을 다른 문자열로 대치 reverse() 문자열 순서 뒤바꿈 setCharAt(int index, char ch) 문자열에서 주어진 index 문자 다른 문자로 대치
정규표현식, Pattern 클래스
정규표현식 작성방법
기호 | 설명 | ||
---|---|---|---|
[ ] | 한 개의 문자 | [abc] | a,b,c 중 하나의 문자 |
- | - | [^abc] | a,b,c, 이외의 하나의 문자 |
- | - | [a-zA-Z] | a~z, A~Z중 하나의 문자 |
\d | 한 개의 숫자 | [0-9]와 동일 | - |
\s | 공백 | - | - |
\w | 한 개의 알파벳 | 한 개의 숫자 | [a-zA-Z]와 동일 |
? | 없음 또는 한개 | - | - |
* | 없음 또는 한개 이상 | - | - |
+ | 한개 이상 | - | - |
{n} | 정확히 n개 | - | - |
{n,} | 최소한 n개 | - | - |
{n, m} | n개에서부터 m개까지 | - | - |
( ) | 그룹핑 | - | - |
Pattern 클래스
- 정규 표현식으로 문자여 검증하는 방법
- java.util.regex.Pattern 클래스의 정적 메소드 matches()
Array 클래스
- 배열 조작 기능
배열 복사
- copyOf(원본배열, 복사할 길이), copyOfRange(원본배열, 시작인덱스, 끝인덱스)
배열 항목 비교
- equals() : 1차 항복의 값만 비교
- deepEquals() : 1차 항목이 서로 다른 배열을 참조할 경우 중첩된 배열의 항목까지 비교
배열 항목 정렬
- Arrays.sort() : 자동으로 오름차순
- 사용자 클래스 타입일 경우 ⇒ 클래스가 Comparable 인터페이스를 구현하고 있어야 정렬됨
배열 항목 검색
- 배열 항목에서 특정 값이 위치한 인덱스를 얻는 것
- 배열 정렬 ⇒ Arrays.binarySearch() 메소드로 검색
포장 클래스
- 기본 타입의 값을 갖는 객체 ⇒ 기본 타입의 값을 내부에 두고 포장
- 포장하고 있는 기본 타입 값 외부에서 변경 불가 ⇒ 새로운 포장 객체 만들어서 변경
박싱
- 기본 타입의 값을 포장 객체로 만드는 과정
언박싱
- 포장 객체에서 기본 타입의 값을 얻어내는 과정
- 포장 클래스의 생성자 매개값으로 기본 타입의 값 또는 문자열을 넘겨주면 됨
- 생성자 사용하지 않고 기본타입명 + value() 메소드 호출도 가능
자동 박싱과 언박싱
- 자동 박싱 : 포장 클래스 타입에 기본값이 대입될 경우
- 자동 언박싱 : 기본 타입에 포장 객체가 되입될 경우
문자열 기본 타입 값으로 변환
- parse + 기본타입 으로 되어 있는 정적 메소드 ⇒ 문자열을 매개값으로 받아 기본 타입 값으로 변환
포장값 비교
- ==, !=으로 비교 어려움 ⇒ 포장 객체의 참조를 비교하기 때문
- 내부의 값만 비교하려면 언박싱한 값으로 비교
- 직접 내부 값을 언박싱해서 비교하거나 equals() 메소드로 내부 값 비교
Math, Random 클래스
Math 클래스
-
수학 계산에 사용할 수 있는 메소드
메소드 설명 예시 결과 int abs(int a) 절대값 int a = Math.abs(-5) a = 5 double ceil(double a) 올림값 double a = Math.ceil(5.3) a = 6.0 double floor(double a) 버림값 double a = Math.floor(5.3) a = 5.0 int max(int a, int b) 최대값 int a = Math.max(6, 9) a = 9 int min(int a, int b) 최소값 int a = Math.min(6, 9) a = 6 double random() 랜덤값 double a = Math.random() 0.0 ≤ a ≤ 1.0 double rint(double a) 가까운 정수의 실수값 double a = Math.rint(5.3) a = 5 long round(double a) 반올림값 double a = Math.round(5.3) a = 5
Random 클래스
- 다양한 형태의 난수(boolean, int, float…)
- 종자값 설정 가능 ⇒ 종자값이 같으면 같은 난수
Date, Calendar
Date
- 날짜를 표현하는 클래스
- 객체 간에 날짜 정보를 주고받을 때 주로 사용
Calendar
- 달력을 표현한 클래스
- 추상 클래스 ⇒ new 연산자로 인스턴스 생성 불가
- getInstance() 메소드로 현재 운영체제에서 설정된 시간대를 기준으로 한 Calendar 하위 객체 얻을 수 있음
Format
숫자 형식 클래스(DecimalFormat)
기호 | 의미 | 패턴 예 | 1234567.89 변환 결과 |
---|---|---|---|
0 | 10진수(빈자리 0으로 채움) | 0, 0.0, 0000000000.00000 | 12345678, 12345678.9, 0001234567.89000 |
# | 10진수(빈자리 채우지 않음) | #, #.#, ##########.##### | 12345678, 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 |
% | 100을 곱한 후 % 문자 붙임 | #,#% | 123456789% |
\u00A4 | 통화 기호 | \u00A4 #,### | ₩ 1,234,568 |
날짜 형식 클래스(SimpleDateFormat)
-
Date 클래스의 toString() 메소드는 영문으로 된 날짜 리턴 ⇒ 특정 문자열 포맷으로 얻고 싶을 때 사용
패턴 문자 의미 패턴 문자 의미 y 년 H 시(0~23) M 월 h 시(1~12) d 일 K 시(0~11) D 월 구분이 없는 일(1 ~ 365) k 시(1~24) E 요일 m 분 a 오전/오후 s 초 w 년의 몇 번째 주 S 밀리세컨드(1/1000초) W 월의 몇 번째 주
문자열 형식 클래스(MessageFormat)
- 문자열에 데이터가 들어갈 자리 표시 ⇒ 프로그램이 실행하면 동적으로 데이터를 삽입해 문자열을 완성
java.time 패키지
- 자바 8부터 날짜, 시간 관련 API 추가
-
java.time 패키지로 별로도 제공
패키지 설명 java.time 날짜와 시간을 나타내는 핵심 API인 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 포함. SIO-8601에 정의된 달력 시스템에 기초 java.time.chrono ISO-8601에 정의된 달력 시스템 이외에 다른 달력 시스템이 필요할 때 사용 java.time.format 날짜와 시간을 파싱하고 포맷팅하는 API java.time.temporal 날짜와 시간을 연산하기 위한 보조 API java.time.zone 타임존을 지원하는 API
날짜와 시간 객체 생성
- LocalDate
- 날짜 정보만 저장
- LocalDate.now() ⇒ 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체 리턴
- LocalDate.of() ⇒ 매개값으로 주어진 날짜 정보를 저장한 LocalDate 객체 리턴
- LocalTime
- 시간 정보만 저장
- LocalTime.now() ⇒ 컴퓨터의 현재 시간 정보를 저장한 LocalTime 객체 리턴
- LocalTime.of() ⇒ 매개값으로 주어진 시간 정보를 저장한 LocalTime 객체 리턴
- LocalDateTime
- LocaDate와 LocalDateTime 결합한 클래스 ⇒ 날짜, 시간 정보 모두 저장
- LocalDateTime.now() ⇒ 컴퓨터의 현재 날짜, 시간 정보를 저장한 LocalDateTime 객체 리턴
- LocalDateTime.of() ⇒ 매개값으로 주어진 날짜, 시간 정보를 저장한 LocalDateTime 객체 리턴
- zonedDateTime
- ISO-8601 달력 시스템에서 정의하고 있는 타임존의 날짜와 시간을 저장하는 클래스
- 맨 뒤에 타임존에 대한 정보(+- UTC 시차[존아이디])
- Instant
- 특정 시점의 타임 스탬프로 사용
- 특정한 두 시점 간의 우선순위를 따질 때 사용 ⇒ UTC 기준
날짜와 시간에 대한 정보 얻기
클래스 | 메소드 | 설명 |
---|---|---|
LocalDate | getYear() | 년 |
getMonth() | Month 열거값 | |
getMonthValue() | 월 | |
getDatOfYear | 일년의 몇 번째 일 | |
LocalDate | getDayOfMonth() | 월의 몇 번째 일 |
getDayOfWeek() | 요일 | |
isLeapYear() | 윤년 여부 | |
LocalTime | getHour() | 시간 |
getMinute() | 분 | |
getSecond() | 초 | |
getNano() | 나노초 리턴 | |
ZonedDateTime | getZone() | 존 아이디 리턴 |
getOffset() | 시차 리턴 |
날짜와 시간 조작
- 빼기와 더하기
- 각 메소드들을 도트(.) 연산자로 연결해서 순차적으로 호츨할 수 있음
- 변경
- with() 메소드는 현재 날짜를 기준으로 해의 첫 번째 일 또는 마지막 일 등 상대적 날짜 리턴
날짜, 시간 비교
- 비교하거나 차이를 구하는 메소드를 가지고 있음
- Period : 년, 달, 일의 양을 나타내는 클래스
- Duration : 시, 분, 초, 나노초의 양을 나타내는 클래스
파싱 메소드
- 문자열을 파싱해서 날짜와 시간을 생성하는 메소드
- parse(CharSequence), parse(CharSequence, DateTimeFormatter)
포맷팅 메소드
- 날짜와 시간을 포맷팅된 문자열로 변환
- format(DateTimeFormatter)