[JAVA] FREQUENTLY USED APIs

μ„±μž₯일기·2024λ…„ 7μ›” 22일
0

[SWCAMP] JAVA

λͺ©λ‘ 보기
10/16

자주 μ“°λŠ” API

Object

πŸ’‘ μžλ°”μ—μ„œ Object λŠ” μ΅œμƒμœ„ λΆ€λͺ¨ ν΄λž˜μŠ€μ΄λ‹€. Object ν΄λž˜μŠ€μ—λŠ” λ‹€μ–‘ν•œ λ©”μ†Œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.
λͺ¨λ“  ν΄λž˜μŠ€λŠ” Object 클래슀λ₯Ό μƒμ†ν•˜κ³  μžˆμœΌλ―€λ‘œ Object μ•ˆμ— μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
λ˜ν•œ Object ν΄λž˜μŠ€κ°€ κ°€μ§€λŠ” λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

Object μ£Όμš” λ©”μ†Œλ“œ

λ©”μ†Œλ“œμ„€λͺ…
boolean equals(Object obj)전달 받은 객체와 같은지 μ—¬λΆ€λ₯Ό λ°˜ν™˜ν•œλ‹€.(λ™μΌν•˜λ©΄ true, λ‹€λ₯΄λ©΄ false)
int hashCode()객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό λ°˜ν™˜ν•œλ‹€.
String toString()객체의 정보λ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.

Object ν™œμš©

toString()

  • toString() λ©”μ†Œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ˜ 정보λ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
  • λ°˜ν™˜λ˜λŠ” λ¬Έμžμ—΄μ€ 클래슀 이름과 κ΅¬λΆ„μž β€˜@’λ₯Ό μ‚¬μš©ν•˜λ©°, κ·Έ λ’€λ‘œ 16μ§„μˆ˜ ν•΄μ‹œμ½”λ“œκ°€ λΆ™κ²Œλœλ‹€. (ν•΄μ‹œμ½”λ“œλŠ” μΈμŠ€ν„΄μŠ€ μ£Όμ†Œ)
    • 예) 클래슀λͺ…@16μ§„μˆ˜ν•΄μ‹œμ½”λ“œ
  • toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ ν•΄μ‹œμ½”λ“œκ°€ μ•„λ‹Œ μΈμŠ€ν„΄μŠ€ μ•ˆμ— 값을 ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄ μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)λ₯Ό ν•˜λ©΄ λœλ‹€.

equals()

  • equals λ©”μ†Œλ“œλŠ” λ§€κ°œλ³€μˆ˜λ‘œ 전달받은 μΈμŠ€ν„΄μŠ€μ™€ == μ—°μ‚°ν•΄μ„œ true, false 둜 λ°˜ν™˜ν•œλ‹€. 즉, λ™μΌν•œ μΈμŠ€ν„΄μŠ€μΈμ§€λ₯Ό λΉ„κ΅ν•˜λŠ” κΈ°λŠ₯이닀.
    • 동일 객체와 동등 객체
      • 동일 객체 : μ£Όμ†Œκ°€ λ™μΌν•œ μΈμŠ€ν„΄μŠ€λ₯Ό 동일 객체라고 ν•œλ‹€
      • 동등 객체 : μ£Όμ†ŒλŠ” λ‹€λ₯΄λ”라도 ν•„λ“œκ°’μ΄ λ™μΌν•œ 객체λ₯Ό 동등 객체라고 ν•œλ‹€.
  • κ²½μš°μ— λ”°λΌμ„œλŠ” 동등객체λ₯Ό 동일 객체둜 μ·¨κΈ‰ν•΄μ„œ λΉ„κ΅ν•˜κ³  싢은 κ²½μš°κ°€ λ°œμƒν•œλ‹€. 즉, λ™μΌν•œ ν•„λ“œκ°’μ„ κ°€μ§€λŠ” 객체λ₯Ό 같은 객체둜 νŒλ‹¨ν•  수 μžˆλ„λ‘ ν•˜λŠ” 경우λ₯Ό λ§ν•œλ‹€. κ·ΈλŸ¬ν•œ 경우 equals() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬, 각각의 ν•„λ“œκ°€ λ™μΌν•œ 값을 κ°€μ§€λŠ”μ§€λ₯Ό ν™•μΈν•˜κ³  λͺ¨λ“  ν•„λ“œκ°’μ΄ 같은 값을 κ°€μ§€λŠ” 경우 true, μ•„λ‹Œ 경우 falseλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μž‘μ„±ν•œλ‹€.

hashCode()

  • ν•΄μ‹œμ½”λ“œλŠ” 객체λ₯Ό μ‹λ³„ν•˜λŠ” 값이닀. Object의 hashCode() λ©”μ†Œλ“œλŠ” 객체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°’μ„ μ΄μš©ν•΄ ν•΄μ‹œμ½”λ“œλ₯Ό λ§Œλ“€μ–΄μ„œ λ°˜ν™˜ν•œλ‹€.
  • Object 클래슀의 λͺ…세에 μž‘μ„±λœ 일반 κ·œμ•½μ— λ”°λ₯΄λ©΄ equals() λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ ν•˜λŠ” 경우 λ°˜λ“œμ‹œ hashCode() λ©”μ†Œλ“œλ„ μž¬μ •μ˜ ν•˜λ„λ‘ λ˜μ–΄ μžˆλ‹€.
  • λ§Œμ•½ hashCode()λ₯Ό μž¬μ •μ˜ ν•˜μ§€ μ•ŠμœΌλ©΄ 같은 값을 κ°€μ§€λŠ” 동등 κ°μ²΄λŠ” 같은 ν•΄μ‹œμ½”λ“œ 값을 κ°€μ Έμ•Ό ν•œλ‹€λŠ” κ·œμ•½μ— μœ„λ°˜λ˜κ²Œ λœλ‹€.
    • (κ°•μ œμ„±μ€ μ—†μ§€λ§Œ κ·œμ•½λŒ€λ‘œ μž‘μ„±ν•˜λŠ” 것이 μ’‹λ‹€)

String

πŸ’‘ μžλ°”μ—μ„œ String ν΄λž˜μŠ€λŠ” λ¬Έμžμ—΄μ„ λ‚˜νƒ€λ‚΄λŠ” μžλ£Œν˜•μ΄λ‹€.
String ν΄λž˜μŠ€μ—λŠ” λ¬Έμžμ—΄ κ΄€λ ¨λœ μž‘μ—…μ„ ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ λ©”μ†Œλ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆλ‹€.
String μΈμŠ€ν„΄μŠ€λŠ” ν•œ 번 μƒμ„±λ˜λ©΄ κ·Έ 값을 읽기만 κ°€λŠ₯ν•˜κ³  λ³€κ²½ν•  μˆ˜λŠ” μ—†λ‹€. μ΄λŸ¬ν•œ 객체λ₯Ό λΆˆλ³€ 객체(immutable object) 라고 ν•œλ‹€.
즉, μžλ°”μ—μ„œ λ§μ…ˆ(+) μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄ 결합을 ν•˜λŠ” 경우
κΈ°μ‘΄ λ¬Έμžμ—΄μ΄ λ³€κ²½λ˜λŠ” 것이 μ•„λ‹Œ λ¬Έμžμ—΄μ΄ 합쳐진 μƒˆλ‘œμš΄ String μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” 것이닀.

String μ£Όμš” λ©”μ†Œλ“œ

λ©”μ†Œλ“œμ„€λͺ…
charAt()ν•΄λ‹Ή λ¬Έμžμ—΄μ˜ νŠΉμ • μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” 문자λ₯Ό λ°˜ν™˜ν•œλ‹€.
μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 숫자 체계λ₯Ό μ˜λ―Έν•˜λ©° 인덱슀λ₯Ό λ²—μ–΄λ‚œ μ •μˆ˜λ₯Ό 인자둜 μ „λ‹¬ν•˜λŠ” κ²½μš°μ—λŠ”
IndexOutOfBoundsException이 λ°œμƒν•œλ‹€.
compareTo()인자둜 μ „λ‹¬λœ λ¬Έμžμ—΄κ³Ό 사전 순으둜 비ꡐλ₯Ό ν•˜μ—¬ 두 λ¬Έμžμ—΄μ΄ κ°™λ‹€λ©΄ 0 을 λ°˜ν™˜, 인자둜 μ „λ‹¬λœ λ¬Έμžμ—΄λ³΄λ‹€ μž‘μœΌλ©΄ 음수λ₯Ό,
크면 μ–‘μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.
단, 이 λ©”μ†Œλ“œλŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ—¬ λΉ„κ΅ν•œλ‹€.
compareToIgnoreCase()λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  λΉ„κ΅ν•œλ‹€
concat()λ¬Έμžμ—΄μ— 인자둜 μ „λ‹¬λœ λ¬Έμžμ—΄μ„ ν•©μΉ˜κΈ°ν•΄μ„œ μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
원본 λ¬Έμžμ—΄μ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
indexOf()λ¬Έμžμ—΄μ—μ„œ νŠΉμ • 문자λ₯Ό νƒμƒ‰ν•˜μ—¬ 처음 μΌμΉ˜ν•˜λŠ” 인덱슀 μœ„μΉ˜λ₯Ό μ •μˆ˜ν˜•μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
단, μΌμΉ˜ν•˜λŠ” λ¬Έμžκ°€ μ—†λŠ” 경우 -1을 λ°˜ν™˜ν•œλ‹€.
lastIndexOf()λ¬Έμžμ—΄ 탐색을 λ’€μ—μ„œλΆ€ν„° ν•˜κ³  처음 μΌμΉ˜ν•˜λŠ” μœ„μΉ˜μ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•œλ‹€.
단, μΌμΉ˜ν•˜λŠ” λ¬Έμžκ°€ μ—†λŠ” 경우 -1을 λ°˜ν™˜ν•œλ‹€.
trim()λ¬Έμžμ—΄μ˜ μ•ž 뒀에 곡백을 μ œκ±°ν•œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
toLowerCase()λͺ¨λ“  문자λ₯Ό μ†Œλ¬Έμžλ‘œ λ³€ν™˜μ‹œν‚¨λ‹€. μ›λ³Έμ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
toUpperCase()λͺ¨λ“  문자λ₯Ό λŒ€λ¬Έμžλ‘œ λ³€ν™˜μ‹œν‚¨λ‹€. μ›λ³Έμ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
substring()λ¬Έμžμ—΄μ˜ 일뢀뢄을 μž˜λΌλ‚΄μ–΄ μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€. 원본에 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
replace()λ¬Έμžμ—΄μ—μ„œ λŒ€μ²΄ν•  λ¬Έμžμ—΄λ‘œ κΈ°μ‘΄ λ¬Έμžμ—΄μ„ λ³€κ²½ν•΄μ„œ λ°˜ν™˜ν•œλ‹€. 원본에 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
length()λ¬Έμžμ—΄μ˜ 길이λ₯Ό μ •μˆ˜ν˜•μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
isEmpty()λ¬Έμžμ—΄μ˜ 길이가 0이면 trueλ₯Ό λ°˜ν™˜, μ•„λ‹ˆλ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€. 길이가 0인 λ¬Έμžμ—΄μ€ nullκ³ΌλŠ” λ‹€λ₯΄λ‹€.
split()μ •κ·œν‘œν˜„μ‹μ„ μ΄μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ λΆ„λ¦¬ν•œλ‹€.

StringBuilder & StringBuffer

πŸ’‘ μžλ°”μ—μ„œ λ¬Έμžμ—΄ 처리λ₯Ό ν•  λ•Œ κ°€μž₯ 많이 μ‚¬μš©ν•˜κ²Œ λ˜λŠ” ν΄λž˜μŠ€λŠ” String, StringBuffer, StringBuilder κ°€ μžˆλ‹€.
이 각각의 ν΄λž˜μŠ€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.
String은 λΆˆλ³€ν•˜κΈ° λ•Œλ¬Έμ— 값을 λ³€κ²½ν•  μˆ˜κ°€ μ—†λ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ StringBuffer와 StringBuilderκ°€ λ“±μž₯ν–ˆλ‹€.

그러면 StringBuffer와 StringBuilder의 차이점은 λ¬΄μ—‡μΌκΉŒ? Thread safe에 μžˆλ‹€.
StringBufferλŠ” Thread Safe ν•˜μ§€λ§Œ, StringBuilderλŠ” κ·Έλ ‡μ§€ μ•Šλ‹€.
StringBufferλŠ” synchronized ν‚€μ›Œλ“œκ°€ μ„ μ–Έλ˜μ–΄ 있기 λ•Œλ¬Έμ— λ©€ν‹°μŠ€λ ˆλ“œμ—μ„œ μ•ˆμ „ν•˜μ§€λ§Œ μ†λ„λŠ” StringBuilder에 λΉ„ν•΄ λŠλ¦¬λ‹€.

StringStringBuilderStringBuffer
modifiableXOO
thread safeOXO
synchronizedXXO
performanceλΉ λ¦„λΉ λ¦„λŠλ¦Ό

Wrapper

πŸ’‘ λž˜νΌν΄λž˜μŠ€λŠ” κΈ°λ³Έ νƒ€μž…μ˜ 데이터λ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€.
예λ₯Ό λ“€μ–΄ νŠΉμ • λ©”μ†Œλ“œκ°€ λ§€κ°œλ³€μˆ˜λ‘œ 객체 νƒ€μž…λ§Œ μš”κ΅¬ν•˜κ²Œ 되면 κΈ°λ³Έ νƒ€μž…μ˜ 데이터λ₯Ό λ¨Όμ € μΈμŠ€ν„΄μŠ€λ‘œ λ³€ν™˜ ν›„ λ„˜κ²¨μ€˜μ•Όν•œλ‹€.
이 λ•Œ 8가지에 ν•΄λ‹Ήν•˜λŠ” κΈ°λ³Έ νƒ€μž…μ˜ 데이터λ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•  수 μžˆλ„λ‘ ν•˜λŠ” 클래슀λ₯Ό 래퍼클래슀 (Wrapper class) 라고 ν•œλ‹€.
(μ£Όλ°©μ—μ„œ μ‚¬μš©ν•˜λŠ” 랩(Wrap)κ³Ό 같은 의미둜 κ°μ‹Όλ‹€λŠ” μ˜λ―Έμ΄λ‹€.)

래퍼 클래슀 μ’…λ₯˜

κΈ°λ³Έ νƒ€μž…λž˜νΌ 클래슀
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

λ°•μ‹±(Boxing)κ³Ό μ–Έλ°•μ‹±(UnBoxing)

  • λ°•μ‹±(Boxing)κ³Ό μ–Έλ°•μ‹±(UnBoxing)
    • κΈ°λ³Ένƒ€μž…μ„ 래퍼클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ μΈμŠ€ν„΄μŠ€ν™” ν•˜λŠ” 것을 λ°•μ‹±(Boxing)이라 ν•œλ‹€.
    • 래퍼클래슀 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κΈ°λ³Έ νƒ€μž…μœΌλ‘œ λ³€κ²½ν•˜λŠ” 것을 μ–Έλ°•μ‹±(UnBoxing)이라고 ν•œλ‹€.

  • μ˜€ν†  λ°•μ‹±(AutoBoxing)κ³Ό μ˜€ν†  μ–Έλ°•μ‹±(AutoUnBoxing)
    • JDK 1.5λΆ€ν„°λŠ” λ°•μ‹±κ³Ό 언박싱이 ν•„μš”ν•œ μƒν™©μ—μ„œ μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ 이λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ€€λ‹€.
    • μžλ™ν™”λœ λ°•μ‹±κ³Ό 언박싱을 μ˜€ν† λ°•μ‹±, μ˜€ν†  μ–Έλ°•μ‹± 이라고 λΆ€λ₯Έλ‹€.

Time νŒ¨ν‚€μ§€

  • Javaμ—μ„œ 기본적으둜 μ‚¬μš©ν–ˆλ˜ λ‚ μ§œμ™€ μ‹œκ°„μ„ λ‹€λ£¨λŠ” APIλŠ” java.util.Date 와 java.util.Calendar μ˜€λ‹€.

  • ν•˜μ§€λ§Œ Date, Calendar λŠ” μ‚¬μš©ν•˜κΈ° λΆˆνŽΈν•˜κ³  μ—¬λŸ¬κ°€μ§€ λ¬Έμ œκ°€ λ§Žμ•„μ„œ JDK 8 μ—μ„œ κ°œμ„ λœ λ‚ μ§œμ™€ μ‹œκ°„ API(java.time νŒ¨ν‚€μ§€)λ₯Ό μ œκ³΅ν•˜μ˜€λ‹€.

  • 이 μ±•ν„°μ—μ„œλŠ” 기쑴의 μ‹œκ°„/λ‚ μ§œ κ΄€λ ¨ νŒ¨ν‚€μ§€λ₯Ό κ°„λ‹¨ν•˜κ²Œ 보고 κ°œμ„ λœ 이후 달라진 점을 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€.

Date 와 Calendar 클래슀

Date ν΄λž˜μŠ€λŠ” Deprecated

πŸ’‘ Date ν΄λž˜μŠ€λŠ” JDK 1.0 λΆ€ν„° λ‚ μ§œλ₯Ό κ°€λ³κ²Œ μ·¨κΈ‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ˜ 클래슀(java.util 에 μ†ν•œ 클래슀)이닀.
μ§€κΈˆμ€ μƒμ„±μžλ₯Ό λΉ„λ‘―ν•΄ λŒ€λΆ€λΆ„μ˜ λ©”μ†Œλ“œκ°€ Deprecated λ˜μ–΄μžˆλ‹€.

Deprecatedλž€?
ν–₯ν›„ 버전이 μ—…λ°μ΄νŠΈ λ˜λ©΄μ„œ μ‚¬λΌμ§€κ²Œ 될 κΈ°λŠ₯μ΄λ‹ˆ 가급적이면 μ‚¬μš©μ„ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμ΄λ‹€.
ν•˜μ§€λ§Œ ν•˜μœ„ λ²„μ Όμ˜ ν˜Έν™˜μ„± λ•Œλ¬Έμ— ν•œ λ²ˆμ— 제거된 것은 μ•„λ‹ˆκ³  λ‚¨κ²¨λ‘μ—ˆκΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

  • Date λŠ” JDK1.0 λΆ€ν„° 제곡된 λ‚ μ§œ/μ‹œκ°„ κ΄€λ ¨ ν΄λž˜μŠ€μ΄λ‹€. ν•΄λ‹Ή 클래슀의 κΈ°λŠ₯은 정말 κΈ°λŠ₯이 μ μ–΄μ„œ κ°œλ°œμ— μ μš©ν•˜κΈ° 쉽지 μ•Šμ•˜λ‹€.
  • κ·Έλž˜μ„œ μžλ°”μ—μ„œλŠ” JDK 1.1 λΆ€ν„° Calendar λΌλŠ” μƒˆλ‘œμš΄ 클래슀λ₯Ό μ œκ³΅ν•˜μ˜€λ‹€.
  • Date ν΄λž˜μŠ€λŠ” κ°„λ‹¨ν•˜κ²Œ μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜λŠ” λ°©λ²•λ§Œ 보도둝 ν•˜κ² λ‹€.

Calendar 클래슀

πŸ’‘ Calendar ν΄λž˜μŠ€λŠ” JDK 1.1 λΆ€ν„° μƒˆλ‘­κ²Œ μ œκ³΅λ˜λŠ” μ‹œκ°„κ³Ό λ‚ μ§œμ— κ΄€ν•œ 처리λ₯Ό λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€.
Calendar ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λ©΄μ„œ Date의 λ§Žμ€ λ©”μ†Œλ“œλŠ” Deprecated λ˜μ—ˆλ‹€.

  • Calendar ν΄λž˜μŠ€κ°€ λ“±μž₯ν•˜λ©΄μ„œ Date ν΄λž˜μŠ€λ³΄λ‹€λŠ” λ§Žμ€ 보완이 λ˜μ—ˆμ§€λ§Œ, μ—¬μ „νžˆ λ‹€μ–‘ν•œ 단점이 μ‘΄μž¬ν•˜κ³  μžˆμ—ˆλ‹€.
  1. Calendar μΈμŠ€ν„΄μŠ€λŠ” λΆˆλ³€κ°μ²΄κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 값을 μˆ˜μ •ν•  수 μžˆλ‹€.

    set λ©”μ†Œλ“œλ₯Ό 톡해 값을 λ³€κ²½ν•  수 있기 λ•Œλ¬Έμ— μ–΄λŠ 흐름에 쀑간에 값이 바뀐닀고 ν•˜λ©΄ μ•Œμ•„μ±„κΈ°κ°€ νž˜λ“€κ³  μ‚¬μ΄λ“œ μ΄νŒ©νŠΈκ°€ λ°œμƒν•  κ°€λŠ₯성이 λ†’λ‹€.
    λ˜ν•œ λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.

  2. 윀초(leap second)λ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€.

    μœ€μ΄ˆλž€?
    ν˜‘μ • μ„Έκ³„μ‹œμ—μ„œ μ‚¬μš©ν•˜λŠ” μ„ΈμŠ˜ μ›μž μ‹œκ³„μ™€ μ‹€μ œ μ§€κ΅¬μ˜ μžμ „/곡전 속도λ₯Ό κΈ°μ€€μœΌλ‘œ ν•œ νƒœμ–‘μ‹œμ˜ 차이둜 인해 λ°œμƒν•œ 였차λ₯Ό λ³΄μ •ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ν•˜λŠ” 1μ΄ˆμ΄λ‹€. 12μ›” 31일의 λ§ˆμ§€λ§‰μ— μΆ”κ°€ν•˜κ±°λ‚˜, ν˜Ήμ€ 6μ›” 30일의 λ§ˆμ§€λ§‰μ— μΆ”κ°€ν•œλ‹€. μœ€μ΄ˆλŠ” μ‚¬μ†Œν•΄ λ³΄μ΄μ§€λ§Œ μ‹€μ œ 2012λ…„ λ§ν¬λ“œμΈ κ³Ό 같은 λŒ€κ·œλͺ¨ μ„œλΉ„μŠ€μ˜ μ„œλ²„λ₯Ό λ§ˆλΉ„μ‹œν‚¨ 버그λ₯Ό λ°œμƒν•œ 적 도 μžˆλ‹€.

  3. Calendar ν΄λž˜μŠ€λŠ” 월을 λ‚˜νƒ€λ‚Ό λ•Œ 0 λΆ€ν„° 11κΉŒμ§€λ‘œ ν‘œν˜„ν•˜λŠ” λΆˆνŽΈν•¨μ΄ μžˆλ‹€.

    ν•˜μ§€λ§Œ 일주일을 λ‚˜νƒ€λ‚΄λŠ” μˆ«μžλŠ” 1λΆ€ν„° μ‹œμž‘μ΄λ‹€. 즉, 일관성이 λΆ€μ‘±ν•˜λ‹€.

  • μ΄λŸ¬ν•œ 단점듀이 μ‘΄μž¬ν•¨μ—λ„ Calendar 와 Date ν΄λž˜μŠ€λŠ” κ½€λ‚˜ μ˜€λž«λ™μ•ˆ μ‚¬μš©λœ 클래슀이기 λ•Œλ¬Έμ— 아직도 μ‚¬μš©λ˜λŠ” 곳이 생각보닀 많이 μ‘΄μž¬ν•œλ‹€.

  • λ”°λΌμ„œ Calendar 둜 κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” μ†ŒμŠ€λ„ 이해할 수 μžˆμ„ μ •λ„λŠ” λ˜μ–΄μ•Ό ν•œλ‹€. κ°„λ‹¨ν•˜κ²Œ 예제λ₯Ό 톡해 μ•Œμ•„λ³΄λ„λ‘ ν•˜μž.

μ™œ 1970λ…„ 1μ›” 1일 0μ‹œ 0λΆ„ 0초 μΈκ°€μš”?

  • 수직으둜 νƒœμ–‘μ΄ λ– μ˜€λ₯΄λŠ” μ‹œκ°„μ„ μ •μ˜€(12μ‹œ)둜 κ³„μ‚°ν•˜λŠ” 방법을 νƒœμ–‘μ‹œλΌκ³  λΆ€λ₯Έλ‹€. κ·Έλ¦¬λ‹ˆμΉ˜ μ²œλ¬ΈλŒ€μ˜ μ²œλ¬Έν•™μ  업적을 기리고자 κ·Έλ¦¬λ‹ˆμΉ˜ μ²œλ¬ΈλŒ€λ₯Ό κΈ°μ€€μœΌλ‘œ νƒœμ–‘μ΄ 수직으둜 λ– μ˜€λ₯΄λŠ” μ‹œμ μ„ 12μ‹œλ‘œ μΈ‘μ •ν•œ μ‹œκ°„λŒ€κ°€ GMT μ‹œκ°„λŒ€μ΄λ‹€. ν•˜μ§€λ§Œ νƒœμ–‘μ‹œλŠ” μ˜€μ°¨κ°€ λ°œμƒν•  수 μžˆλ‹€. νƒœμ–‘λΉ›μ΄ μ§€κ΅¬κΉŒμ§€ μ˜€λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μ€ 8λΆ„ 12초 ~ 8λΆ„ 28초 이기 λ•Œλ¬Έμ— νƒœμ–‘μ‹œλŠ” μ‹€μ œ νƒœμ–‘ μœ„μΉ˜μ™€ μœ‘μ•ˆμœΌλ‘œ μΈ‘μ •ν•œ μ‹œκ°„μ˜ μ˜€μ°¨κ°€ λ°œμƒν•  수 밖에 μ—†μ—ˆλ‹€. λ˜ν•œ 지ꡬ가 23.5도 κΈ°μšΈμ–΄μ Έ 있고 곡전이 타원 κΆ€λ„λ‘œ 돌기 λ•Œλ¬Έμ— κ³„μ ˆμ— 따라 μ‘°κΈˆμ”© λ‹€λ₯Ό 수 밖에 μ—†λ‹€.

  • μ΄λŸ¬ν•œ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” 방식보닀 쑰금 더 μ •λ°€ν•œ μΈ‘μ • 방법도 μ‘΄μž¬ν•˜λŠ”λ° 맀우 μž‘μ€ μ›μžκ°€ λ°”λ‹₯κ³Ό λ“€λœΈ μƒνƒœλ₯Ό 주기적으둜 λ°˜λ³΅ν•˜λŠ” 것을 μ΄μš©ν•˜μ—¬ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” 방법이 μžˆλ‹€. 특히 μ„ΈμŠ˜ μ›μžμ˜ 경우 1μ΄ˆλ™μ•ˆ μ§„λ™ν•˜λŠ” νšŸμˆ˜κ°€ μ‹€μ œ 1μ΄ˆμ™€ μœ μ‚¬ν•˜μ—¬ 30λ§Œλ…„μ— 1초의 였차λ₯Ό λ³΄μ΄λŠ” 정확성을 보인닀. λ”°λΌμ„œ μ„Έκ³„μ μœΌλ‘œ λ™μΌν•œ μ‹œκ°„λŒ€λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν˜‘μ •ν•œ μ‹œκ°„μ„ ν˜‘μ • μ„Έκ³„μ‹œ UTC 라고 ν•œλ‹€.

  • ν•˜μ§€λ§Œ 물리적으둜 λ„ˆλ¬΄ μ •ν™•ν•˜λ‹€λ³΄λ‹ˆ μ‹€μ œ μ‘΄μž¬ν•˜λŠ” 지ꡬ와 νƒœμ–‘κ°„μ˜ 곡전/μžμ „μ— λ”°λ₯Έ 였차λ₯Ό λ°˜μ˜ν•΄μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ 윀초λ₯Ό 두고 μ„ΈμŠ˜ μ›μž μ‹œκ³„μ™€ νƒœμ–‘μ‹œμ˜ 였차λ₯Ό λ³΄μ •ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€. 이것이 μ •ν•΄μ§„ λ‚ μ§œλŠ” 1972λ…„ 1μ›” 1일이며, 세계 ν‘œμ€€μ‹œλ₯Ό κΈ°μ€€μœΌλ‘œ 1972λ…„μœΌλ‘œ κ³„μ‚°ν•˜κΈ°μ—λŠ” λ­”κ°€ λ”± λ§žμ•„ λ–¨μ–΄μ§€μ§€ μ•Šμ•„
    1970λ…„ 1μ›” 1일 0μ‹œ 0λΆ„ 0초λ₯Ό κΈ°μ€€μœΌλ‘œ μ»΄ν“¨ν„°μ—μ„œλŠ” μ‹œκ°„λŒ€λ₯Ό κ³„μ‚°ν•˜κΈ°λ‘œ ν•œ 것이닀.

  • Date와 Calendar κ°„μ˜ λ³€ν™˜

    • μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ Calendar ν΄λž˜μŠ€κ°€ μΆ”κ°€λ˜λ©΄μ„œ Date의 λ§Žμ€ λ©”μ†Œλ“œκ°€ deprecatedκ°€ λ˜μ—ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  Date λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ 있기 λ•Œλ¬Έμ— μ„œλ‘œ λ³€ν™˜ν•˜λŠ” 방법도 κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄μž

      public static void main(String[] args) {
      
          /* Calendar λ₯Ό Date 둜 λ³€ν™˜ */
          Calendar calendar = Calendar.getInstance();
      
          System.out.println("calendar = " + calendar);
          
          Date date = new Date(calendar.getTimeInMillis());
      
          System.out.println("date = " + date);
      }
    • μ‹€ν–‰κ²°κ³Ό

      calendar = java.util.GregorianCalendar[time=1665536333516,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=22,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=285,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=58,SECOND=53,MILLISECOND=516,ZONE_OFFSET=32400000,DST_OFFSET=0]
      date = Wed Oct 12 09:58:53 KST 2022
public static void main(String[] args) {

    /* Date λ₯Ό Calendar 둜 λ³€ν™˜ */
    Date date = new Date();

    System.out.println("date = " + date);
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);

    System.out.println("calendar = " + calendar);
}
  • μ‹€ν–‰κ²°κ³Ό
    date = Wed Oct 12 10:01:20 KST 2022
    calendar = java.util.GregorianCalendar[time=1665536480924,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=22,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=285,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=1,SECOND=20,MILLISECOND=924,ZONE_OFFSET=32400000,DST_OFFSET=0]

Time νŒ¨ν‚€μ§€

  • μ§€κΈˆκΉŒμ§€ κ°„λ‹¨ν•˜κ²Œ Date, Calendar ν΄λž˜μŠ€μ— λŒ€ν•΄ κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄μ•˜λ‹€.

  • JDK 1.8 버전에 μΆ”κ°€λœ Time νŒ¨ν‚€μ§€λŠ” 기쑴에 Date, Calendar κ°€ κ°€μ§€κ³  μžˆλŠ” 단점듀을 ν•΄μ†Œν•˜κΈ° μœ„ν•΄μ„œ νƒ„μƒλ˜μ—ˆλ‹€.

  • Time νŒ¨ν‚€μ§€λŠ” 4개의 ν•˜μœ„ νŒ¨ν‚€μ§€λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

νŒ¨ν‚€μ§€μ„€λͺ…
java.timeλ‚ μ§œμ™€ μ‹œκ°„ κ΄€λ ¨ ν΄λž˜μŠ€λ“€μ„ μ œκ³΅ν•œλ‹€
java.time.chronoISO-8601 에 μ •μ˜λœ 외에 달λ ₯ μ‹œμŠ€ν…œμ„ μœ„ν•œ ν΄λž˜μŠ€λ“€μ„ μ œκ³΅ν•œλ‹€
java.time.formatλ‚ μ§œμ™€ μ‹œκ°„ νŒŒμ‹±κ³Ό ν˜•μ‹ν™” κ΄€λ ¨ ν΄λž˜μŠ€λ“€μ„ μ œκ³΅ν•œλ‹€
java.time.temporalλ‚ μ§œμ™€ μ‹œκ°„μ˜ ν•„λ“œμ™€ λ‹¨μœ„ κ΄€λ ¨ ν΄λž˜μŠ€λ“€μ„ μ œκ³΅ν•œλ‹€
java.time.zoneμ‹œκ°„λŒ€ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€μ„ μ œκ³΅ν•œλ‹€
  • Time νŒ¨ν‚€μ§€μ˜ κ°€μž₯ 큰 μž₯점은 Date와 Calendar와 λ‹€λ₯΄κ²Œ λΆˆλ³€ν•˜λ‹€. 즉 String 처럼 λ‚ μ§œμ™€ μ‹œκ°„μ„ 변경을 ν•˜λ©΄ 기쑴의 객체가 λ³€κ²½λ˜λŠ” 것이 μ•„λ‹Œ μƒˆλ‘œμš΄ 객체가 λ°˜ν™˜λœλ‹€. λΆˆλ³€ν•¨μœΌλ‘œ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜λ‹€.

Time νŒ¨ν‚€μ§€μ˜ 핡심 클래슀

클래슀λͺ…μ„€λͺ…
LocalTimeμ‹œκ°„ κ΄€λ ¨ μž‘μ—…ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 클래슀. LocalTime κ°μ²΄λŠ” 두 개의 정적 λ©”μ†Œλ“œλ₯Ό 톡해 λ°˜ν™˜ 받을 수 μžˆλ‹€.
LocalDateλ‚ μ§œ κ΄€λ ¨ μž‘μ—…ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 클래슀. LocalDate 객체도 두 개의 정적 λ©”μ†Œλ“œλ‘œ λ°˜ν™˜ λ°›λŠ”λ‹€.
LocalDateTimeμ‹œκ°„κ³Ό λ‚ μ§œλ₯Ό ν•¨κ»˜ μž‘μ—…ν•΄μ•Όν•  λ•Œ μ‚¬μš©ν•˜λŠ” 클래슀
ZonedDateTimeμ‹œκ°„λŒ€(Time Zone) 을 ν™œμš©ν•œ μž‘μ—…ν•΄μ•Όν•  λ•Œ μ‚¬μš©ν•˜λŠ” 클래슀
profile
μ—”μ§€λ‹ˆμ–΄λ‘œμ˜ μ„±μž₯일지

0개의 λŒ“κΈ€