πŸ“š Chap 11: κΈ°λ³Έ API 클래슀


✨ 11-1 java.lang νŒ¨ν‚€μ§€

πŸ“‹ java.lang νŒ¨ν‚€μ§€μ— μ†ν•˜λŠ” μ£Όμš” 클래슀 & μš©λ„

image


πŸ› οΈ 1) Object 클래슀

  • λͺ¨λ“  μžλ°” 클래슀의 μ΅œμƒμœ„ 쑰상 클래슀
  • 직접 μƒμ†ν•˜μ§€ μ•Šμ•„λ„, extends Objectκ°€ μžλ™μœΌλ‘œ 적용됨
  • μ£Όμš” λ©”μ„œλ“œ:
    1. equals(Object obj)
      • 객체가 μ €μž₯ν•˜λŠ” β€œλ°μ΄ν„°μ˜ 동일성” νŒλ‹¨
      • κΈ°λ³Έ κ΅¬ν˜„: μ°Έμ‘° 비ꡐ (==)
      • μ»€μŠ€ν…€ ν΄λž˜μŠ€μ—μ„œλŠ” μž¬μ •μ˜(override)ν•˜μ—¬ β€œν•„λ“œ κ°’ 비ꡐ” 둜직 μž‘μ„±
    2. hashCode()
      • 객체λ₯Ό 식별할 수 μžˆλŠ” μ •μˆ˜κ°’(ν•΄μ‹œμ½”λ“œ) λ°˜ν™˜
      • equals()λ₯Ό μž¬μ •μ˜ν•  λ•Œ λ°˜λ“œμ‹œ hashCode()도 μž¬μ •μ˜ν•΄μ•Ό 함
    3. toString()
      • 객체λ₯Ό λ¬Έμžμ—΄(String)둜 ν‘œν˜„ν•œ κ°’ λ°˜ν™˜
      • κΈ°λ³Έ κ΅¬ν˜„: ν΄λž˜μŠ€μ΄λ¦„@16μ§„μˆ˜_ν•΄μ‹œμ½”λ“œ
      • λŒ€ν‘œμ μΈ μ˜ˆμ‹œ:
        • Date: ν˜„μž¬ λ‚ μ§œ/μ‹œκ°„μ„ μ‚¬λžŒμ΄ 읽기 쒋은 ν˜•νƒœλ‘œ λ°˜ν™˜
        • String: 객체에 μ €μž₯된 λ¬Έμžμ—΄ 자체λ₯Ό λ°˜ν™˜

πŸ’‘ Member ν΄λž˜μŠ€μ—μ„œ equals()λ©”μ„œλ“œ μž¬μ •μ˜ 예제

image

πŸ’‘ μ—°μŠ΅λ¬Έμ œ

image

πŸ’‘ toString() μ˜€λ²„λΌμ΄λ”© 예제

image


πŸ› οΈ 2) System 클래슀

  • System 클래슀λ₯Ό μ΄μš©ν•˜λ©΄ μš΄μ˜μ²΄μ œμ™€ JVM 일뢀 κΈ°λŠ₯을 ν™œμš©ν•  수 있음
  • μ£Όμš” ν•„λ“œ & λ©”μ„œλ“œ:
    1. ν‘œμ€€ μž…μΆœλ ₯
      • System.out : ν‘œμ€€ 좜λ ₯ 슀트림 (PrintStream)
      • System.err : ν‘œμ€€ 였λ₯˜ 좜λ ₯ 슀트림 (PrintStream)
      • System.in : ν‘œμ€€ μž…λ ₯ 슀트림 (InputStream)
    2. ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
      • System.exit(int status) : JVM κ°•μ œ μ’…λ£Œ
        System.exit(0);  // 정상 μ’…λ£Œ
        System.exit(1);  // 비정상 μ’…λ£Œ (κ΄€λ‘€μ μœΌλ‘œ 0 이외 값은 였λ₯˜)
        
    3. ν˜„μž¬ μ‹œκ° 읽기
      • System.currentTimeMillis() : 1970λ…„ 1μ›” 1일 00:00:00 UTC 이후 κ²½κ³Όν•œ λ°€λ¦¬μ΄ˆ(ms) λ°˜ν™˜
      • System.nanoTime() : JVM이 μ‹œμž‘λœ 이후 κ²½κ³Όν•œ λ‚˜λ…Έμ΄ˆ(ns) λ°˜ν™˜ (주둜 μ‹œκ°„ μΈ‘μ • μš©λ„)
        long start = System.nanoTime();
        // ... μ‹€ν–‰ν•  μ½”λ“œ ...
        long end = System.nanoTime();
        System.out.println("μ‹€ν–‰ μ‹œκ°„: " + (end - start) + " ns");
        
    4. λ©”λͺ¨λ¦¬ 관리 및 기타
      • System.gc() : JVMμ—κ²Œ κ°€λΉ„μ§€ 컬렉터 싀행을 μš”μ²­ (μ¦‰μ‹œ 싀행을 보μž₯ν•˜μ§€ μ•ŠμŒ)
      • System.getProperty(String key) : μ‹œμŠ€ν…œ ν”„λ‘œνΌν‹°(예: "user.home", "os.name") 쑰회

πŸ’‘ System μ˜ˆμ‹œ μ½”λ“œ: μ‹œκ°„ μΈ‘μ • 및 μ’…λ£Œ

public class SystemExample {
    public static void main(String[] args) {
        System.out.println("ν”„λ‘œκ·Έλž¨ μ‹œμž‘ πŸ‘‰");

        // κ°„λ‹¨ν•œ μ‹œκ°„ μΈ‘μ • 예제
        long startMillis = System.currentTimeMillis();
        // μž„μ˜ 반볡문 (λ”œλ ˆμ΄λ₯Ό μœ„ν•œ 예제)
        int sum = 0;
        for (int i = 1; i <= 100_000; i++) {
            sum += i;
        }
        long endMillis = System.currentTimeMillis();
        System.out.println("1λΆ€ν„° 100,000κΉŒμ§€ ν•©: " + sum);
        System.out.println("μ‹€ν–‰ μ‹œκ°„: " + (endMillis - startMillis) + " ms");

        System.out.println("ν”„λ‘œκ·Έλž¨ μ’…λ£Œ πŸ‘‹");
        //System.exit(0); // 주석 ν•΄μ œ μ‹œ ν”„λ‘œκ·Έλž¨μ΄ μ¦‰μ‹œ μ’…λ£Œλ¨
    }
}

πŸ› οΈ 3) Class 클래슀

  • ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 메타데이터(metadata) λ₯Ό 관리
  • λŸ°νƒ€μž„μ— 클래슀의 정보λ₯Ό λ™μ μœΌλ‘œ μ‘°νšŒν•˜κ±°λ‚˜,
  • λ¦¬ν”Œλ ‰μ…˜(reflection)을 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λ¨
  • μ£Όμš” λ©”μ„œλ“œ:
    1. getClass() (Objectλ‘œλΆ€ν„° 상속)
      • μΈμŠ€ν„΄μŠ€κ°€ μ†ν•œ 클래슀의 Class 객체 λ°˜ν™˜
      • 예: String s = "Hello"; Class<?> cls = s.getClass();
    2. Class.forName(String className)
      • μ£Όμ–΄μ§„ 클래슀 이름(λ¬Έμžμ—΄)μœΌλ‘œλΆ€ν„° Class 객체λ₯Ό λ™μ μœΌλ‘œ λ‘œλ”©
      • 예: Class<?> cls = Class.forName("com.example.MyClass");
    3. λ¦¬ν”Œλ ‰μ…˜ ν™œμš©
      • cls.getDeclaredFields() : ν΄λž˜μŠ€κ°€ κ°€μ§„ ν•„λ“œ λͺ©λ‘ 쑰회
      • cls.getDeclaredMethods() : ν΄λž˜μŠ€κ°€ κ°€μ§„ λ©”μ„œλ“œ λͺ©λ‘ 쑰회
      • cls.getConstructor(...) : νŠΉμ • μƒμ„±μž 쑰회 및 newInstance() 호좜

πŸ’‘ Class μ˜ˆμ‹œ μ½”λ“œ: 동적 클래슀 λ‘œλ”©

import java.util.Arrays;
import java.lang.reflect.Modifier;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 1. String μΈμŠ€ν„΄μŠ€μ—μ„œ getClass() μ‚¬μš©
            String str = "Hello Reflection";
            Class<?> clazz1 = str.getClass();
            System.out.println("clazz1: " + clazz1.getName());  // java.lang.String

            // 2. Class.forName() μ‚¬μš©ν•˜μ—¬ 클래슀 λ‘œλ”©
            Class<?> clazz2 = Class.forName("java.util.ArrayList");
            System.out.println("clazz2: " + clazz2.getName());  // java.util.ArrayList

            // 3. λ¦¬ν”Œλ ‰μ…˜μœΌλ‘œ λ©”μ„œλ“œ λͺ©λ‘ 좜λ ₯
            System.out.println("=== ArrayList Methods ===");
            Arrays.stream(clazz2.getDeclaredMethods())
                  .filter(m -> Modifier.isPublic(m.getModifiers()))
                  .forEach(m -> System.out.println("- " + m.getName()));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

πŸ› οΈ 4) String 클래슀 πŸ“‘

  • String: λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κ³  λ‹€μ–‘ν•œ λ¬Έμžμ—΄ 처리 λ©”μ„œλ“œλ₯Ό 제곡

image

πŸ’‘ String μ£Όμš” λ©”μ„œλ“œ 예제

image

image


πŸ› οΈ 5) Wrapper 클래슀

Wrapper 클래슀 μ’…λ₯˜:

  • Byte, Short, Character, Integer, Float, Double, Boolean, Long
  1. λ°•μ‹±(Boxing) & μ–Έλ°•μ‹±(Unboxing)
    • λ°•μ‹±: κΈ°λ³Έ νƒ€μž…(primitive)을 Wrapper 객체둜 λ³€ν™˜
      int primitiveInt = 42;
      Integer boxedInt = Integer.valueOf(primitiveInt); // λͺ…μ‹œμ  λ°•μ‹±
      Integer autoBoxed = primitiveInt;                  // μžλ™ λ°•μ‹± (Auto-boxing)
      
    • μ–Έλ°•μ‹±: Wrapper κ°μ²΄μ—μ„œ κΈ°λ³Έ νƒ€μž… κ°’ μΆ”μΆœ
      Integer wrapperInt = 100;
      int unboxed = wrapperInt.intValue();  // λͺ…μ‹œμ  μ–Έλ°•μ‹±
      int autoUnboxed = wrapperInt;         // μžλ™ μ–Έλ°•μ‹± (Auto-unboxing)
      
  2. λ¬Έμžμ—΄ ↔ κΈ°λ³Έ νƒ€μž… λ³€ν™˜
    • λ¬Έμžμ—΄ β†’ κΈ°λ³Έ νƒ€μž…
      String strNum = "123";
      int value1 = Integer.parseInt(strNum);    // κΈ°λ³Έ νƒ€μž… int
      Integer value2 = Integer.valueOf(strNum); // Wrapper 객체
      double d1 = Double.parseDouble("3.14");
      Double d2 = Double.valueOf("3.14");
      
    • κΈ°λ³Έ νƒ€μž… β†’ λ¬Έμžμ—΄
      int num = 99;
      String s1 = String.valueOf(num);
      String s2 = Integer.toString(num);
      
  3. μž…λ ₯κ°’ 검사 (Input Validation)
    • μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λ¬Έμžμ—΄μ΄ μˆ«μžμΈμ§€ μ•„λ‹Œμ§€λ₯Ό 검사할 λ•Œ 유용
      String input = "456a";
      try {
          int parsed = Integer.parseInt(input);
          System.out.println("μ •μˆ˜λ‘œ λ³€ν™˜ 성곡: " + parsed);
      } catch (NumberFormatException e) {
          System.err.println("μœ νš¨ν•˜μ§€ μ•Šμ€ 숫자 ν˜•μ‹μž…λ‹ˆλ‹€: " + input);
      }
      
  4. 기타 μœ μš©ν•œ λ©”μ„œλ“œ
    • Integer.MAX_VALUE, Integer.MIN_VALUE (μ΅œλŒ“κ°’/μ΅œμ†Ÿκ°’ μƒμˆ˜)
    • Boolean.parseBoolean(String s) (λ¬Έμžμ—΄ β†’ boolean)
    • Character.isDigit(char ch), Character.isLetter(char ch) (문자 검사 λ©”μ„œλ“œ)

πŸ› οΈ 6) Math 클래슀

  • μˆ˜ν•™ κ΄€λ ¨ 정적 λ©”μ„œλ“œ 제곡
  • λŒ€ν‘œ λ©”μ„œλ“œ:
    1. μ‚Όκ°ν•¨μˆ˜
      • Math.sin(double a), Math.cos(double a), Math.tan(double a)
      • μΈμžλŠ” λΌλ””μ•ˆ(radian) λ‹¨μœ„
    2. μ§€μˆ˜ 및 둜그
      • Math.exp(double a) : (e^a)
      • Math.log(double a) : μžμ—°λ‘œκ·Έ(base (e))
      • Math.log10(double a) : μƒμš©λ‘œκ·Έ(base 10)
      • Math.pow(double a, double b) : (a^b)
    3. μ ˆλŒ€κ°’/반올림/μ ˆμ‚­
      • Math.abs(int/long/float/double)
      • Math.round(double a) : κ°€μž₯ κ°€κΉŒμš΄ μ •μˆ˜(μ†Œμˆ˜ 첫째 μžλ¦¬μ—μ„œ 반올림)
      • Math.ceil(double a) : 올림 (ex. 3.1 β†’ 4.0)
      • Math.floor(double a) : λ‚΄λ¦Ό (ex. 3.9 β†’ 3.0)
    4. λ‚œμˆ˜ 생성
      • Math.random() : [0.0, 1.0) λ²”μœ„μ˜ double λ‚œμˆ˜ λ°˜ν™˜
        double r = Math.random();   // 0.0 <= r < 1.0
        int randInt = (int)(Math.random() * 100) + 1; // 1 ~ 100 사이 λ‚œμˆ˜
        

πŸ’‘ Math μ˜ˆμ‹œ μ½”λ“œ

public class MathExample {
    public static void main(String[] args) {
        double x = 2.7;
        double y = -3.4;

        System.out.println("abs(" + y + ") = " + Math.abs(y));
        System.out.println("ceil(" + x + ") = " + Math.ceil(x));
        System.out.println("floor(" + x + ") = " + Math.floor(x));
        System.out.println("round(" + x + ") = " + Math.round(x));

        double base = 2.0, exponent = 3.0;
        System.out.println(base + "^" + exponent + " = " + Math.pow(base, exponent));

        double angle = Math.PI / 4;  // 45도
        System.out.println("sin(45Β°) = " + Math.sin(angle));
        System.out.println("cos(45Β°) = " + Math.cos(angle));

        // λ‚œμˆ˜ 예제
        System.out.println("Random [0.0,1.0): " + Math.random());
        System.out.println("Random Int [1,10]: " + ((int)(Math.random() * 10) + 1));
    }
}

✨ 11-2 java.util νŒ¨ν‚€μ§€

java.util νŒ¨ν‚€μ§€λŠ” λ‹€μ–‘ν•œ μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€μ™€ μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬λ₯Ό 제곡

πŸ•°οΈ 1) Date 클래슀

  • νŒ¨ν‚€μ§€: java.util.Date
  • μš©λ„:
    • λ‚ μ§œμ™€ μ‹œκ°„μ„ λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ μ €μž₯ν•˜λŠ” 클래슀
    • λ‚΄λΆ€μ μœΌλ‘œ 1970λ…„ 1μ›” 1일 00:00:00 UTC 이후 κ²½κ³Όν•œ μ‹œκ°„μ„ λ°€λ¦¬μ΄ˆλ‘œ ν‘œν˜„
    • λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λ‚ μ§œ/μ‹œκ°„ 정보 좜λ ₯
  • μ£Όμš” λ©”μ„œλ“œ:
    • κΈ°λ³Έ μƒμ„±μž new Date() : ν˜„μž¬ μ‹œμŠ€ν…œμ˜ λ‚ μ§œ/μ‹œκ°„μœΌλ‘œ μ΄ˆκΈ°ν™”
    • Date(long date) : 1970λ…„ 1μ›” 1일 UTC 이후 dateλ°€λ¦¬μ΄ˆλ§ŒνΌ μ§€λ‚œ λ‚ μ§œλ‘œ μ΄ˆκΈ°ν™”
    • toString() : μ‚¬λžŒμ΄ 읽기 쒋은 ν˜•νƒœλ‘œ λ‚ μ§œ/μ‹œκ°„ λ°˜ν™˜
    • getTime() : 내뢀에 μ €μž₯된 λ°€λ¦¬μ΄ˆ(long) κ°’ λ°˜ν™˜
    • after(Date when), before(Date when) : λ‚ μ§œ 비ꡐ

πŸ’‘ Date μ˜ˆμ‹œ μ½”λ“œ

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {
        // ν˜„μž¬ λ‚ μ§œ/μ‹œκ°„ 객체 생성
        Date now = new Date();
        System.out.println("ν˜„μž¬ Date: " + now.toString());

        // 1일(24μ‹œκ°„) μ „ Date 객체 생성
        long ONE_DAY_MILLIS = 24L * 60 * 60 * 1000;
        Date yesterday = new Date(now.getTime() - ONE_DAY_MILLIS);
        System.out.println("μ–΄μ œ Date: " + yesterday.toString());

        // λ°€λ¦¬μ΄ˆ κ°’ κ°€μ Έμ˜€κΈ°
        long millis = now.getTime();
        System.out.println("ν˜„μž¬ λ°€λ¦¬μ΄ˆ: " + millis);

        // λ‚ μ§œ 비ꡐ
        if (yesterday.before(now)) {
            System.out.println("μ–΄μ œ(yesterday) λ‚ μ§œλŠ” ν˜„μž¬(now) λ‚ μ§œλ³΄λ‹€ μ΄μ „μž…λ‹ˆλ‹€.");
        }
    }
}

πŸ—“οΈ 2) Calendar 클래슀

  • νŒ¨ν‚€μ§€: java.util.Calendar (좔상 클래슀)
  • μš©λ„:
    • λ‚ μ§œμ™€ μ‹œκ°„ ν•„λ“œ(Year, Month, Day, Hour, Minute λ“±)λ³„λ‘œ μ„ΈλΆ€ μ‘°μž‘μ„ μ‰½κ²Œ ν•  수 μžˆλ„λ‘ 제곡
    • Date 보닀 νŽΈλ¦¬ν•˜κ²Œ λ‚ μ§œ μ—°μ‚°(λ”ν•˜κΈ°/λΉΌκΈ°), ν•„λ“œ 쑰회 등을 μˆ˜ν–‰
  • μ£Όμš” λ©”μ„œλ“œ & νŠΉμ§•:
    1. μΈμŠ€ν„΄μŠ€ 생성
      // 싱글톀 νŒ¨ν„΄μ²˜λŸΌ getInstance()둜 Calendar 객체 μ–»κΈ°
      Calendar cal = Calendar.getInstance();
      
    2. λ‚ μ§œ ν•„λ“œ 쑰회 및 μ„€μ •
      • cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)
        • Calendar.MONTHλŠ” 0-based (0: January, 1: February, …, 11: December)
      • cal.set(Calendar.DAY_OF_MONTH, 15) : 일(day) ν•„λ“œλ§Œ λ³€κ²½
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1; // 0-based β†’ 1월을 1둜 ν‘œν˜„
        int day = cal.get(Calendar.DAY_OF_MONTH);
        System.out.printf("Today: %d-%02d-%02d", year, month, day);
        
    3. λ‚ μ§œ μ—°μ‚°
      • cal.add(Calendar.FIELD, amount) : νŠΉμ • ν•„λ“œμ— amount 만큼 λ”ν•˜κ±°λ‚˜ 뺌
        cal.add(Calendar.MONTH, 1); // ν•œ 달 λ’€
        cal.add(Calendar.DAY_OF_MONTH, -7); // 7일 μ „
        
    4. getTime() & setTime(Date date)
      • cal.getTime() : Date 객체둜 λ³€ν™˜
      • cal.setTime(Date date) : Date κ°μ²΄λ‘œλΆ€ν„° Calendar ν•„λ“œ κ°’ μ„€μ •

πŸ’‘ Calendar μ˜ˆμ‹œ μ½”λ“œ

import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;

public class CalendarExample {
    public static void main(String[] args) {
        // 1) ν˜„μž¬ λ‚ μ§œ/μ‹œκ°„ Calendar μΈμŠ€ν„΄μŠ€ 생성
        Calendar cal = Calendar.getInstance();

        // 2) ν•„λ“œλ³„ λ‚ μ§œ 정보 κ°€μ Έμ˜€κΈ°
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1; // 0-based β†’ 1~12
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        int second = cal.get(Calendar.SECOND);

        System.out.printf("ν˜„μž¬: %d-%02d-%02d %02d:%02d:%02d
", 
                          year, month, day, hour, minute, second);

        // 3) λ‚ μ§œ μ—°μ‚° 예제: ν•œ 달 λ’€λ‘œ μ„€μ •
        cal.add(Calendar.MONTH, 1);
        System.out.println("ν•œ 달 λ’€: " + new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime()));

        // 4) νŠΉμ • λ‚ μ§œ μ„€μ • 예제: 2025λ…„ 12μ›” 25일 (크리슀마슀)
        cal.set(2025, Calendar.DECEMBER, 25); 
        Date xmas = cal.getTime();
        System.out.println("크리슀마슀: " + xmas);  // toString() 이용

        // 5) Date ↔ Calendar λ³€ν™˜
        Date now = new Date();
        cal.setTime(now);
        System.out.println("Date β†’ Calendar β†’ " + 
            cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH));
    }
}