🐯[TIL] 250617-012

byoΒ·2025λ…„ 6μ›” 17일

πŸ’« JAVA

βœ”οΈ Lambda

βœ… μ •μ˜

  • μžλ°” 8λΆ€ν„° λ„μž…λœ ν•¨μˆ˜ν˜• μŠ€νƒ€μΌ 문법
  • ν•¨μˆ˜ 이름 없이 μΈμˆ˜μ™€ 본체만으둜 ν‘œν˜„
  • μΌνšŒμ„± κ°„λ‹¨ν•œ λ‘œμ§μ„ κ°„κ²°ν•˜κ²Œ κ΅¬ν˜„ν•  수 있음

ℹ️ κΈ°μ‘΄ λ°©μ‹μ˜ ν•œκ³„

  • λ‹¨μˆœ λ‘œμ§μ„ μœ„ν•΄ 맀번 클래슀 μ •μ˜ + 객체 생성은 λ²ˆκ±°λ‘œμ›€
  • 읡λͺ… ν΄λž˜μŠ€λ„ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§
  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λžŒλ‹€μ‹μœΌλ‘œ ν•΄κ²° κ°€λŠ₯

βœ… 문법
(a, b) -> { result; }
(λ§€κ°œλ³€μˆ˜) -> { μ‹€ν–‰λ¬Έ }


βœ… ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ (Functional Interface)

  • λžŒλ‹€μ‹μ€ 였직 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œκ°€ μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯
  • @FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš© μΆ”μ²œ
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

✏️ λžŒλ‹€μ‹ μ‹€μŠ΅: λ§μ…ˆκ³Ό κ³±μ…ˆ
λžŒλ‹€μ‹μ„ μ‚¬μš©ν•œ κΈ°λ³Έ μ—°μ‚° μ˜ˆμ œμž…λ‹ˆλ‹€.

MathOperation add = (a, b) -> a + b;
MathOperation multiply = (a, b) -> a * b;
System.out.println(add.operate(5, 3)); // 8
System.out.println(multiply.operate(5, 3)); // 15

πŸ‘ λžŒλ‹€μ‹μ˜ μž₯점

  • μ½”λ“œκ°€ κ°„κ²°ν•˜κ³  가독성이 μ’‹μŒ
  • 읡λͺ… ν΄λž˜μŠ€λ³΄λ‹€ 더 μ§§κ³  직관적
  • μ»¬λ ‰μ…˜, 슀트림 API와 ꢁ합이 μ’‹μŒ

πŸ‘Ž λžŒλ‹€μ‹μ˜ ν•œκ³„

  • μƒνƒœ(ν•„λ“œ)λ₯Ό κ°€μ§ˆ 수 μ—†μŒ
  • 디버깅이 μ–΄λ €μšΈ 수 있음
  • λ³΅μž‘ν•œ λ‘œμ§μ—λŠ” 뢀적합

βœ”οΈ Try Catch

βœ… Try catch

  • μ‹€ν–‰ 쀑 λ°œμƒν•  수 μžˆλŠ” μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜λŠ” ꡬ쑰
  • ν”„λ‘œκ·Έλž¨μ΄ 비정상 μ’…λ£Œλ˜μ§€ μ•Šλ„λ‘ λ„μ™€μ€Œ
  • μ˜ˆμ™Έ(Exception)λ₯Ό κ°μ‹Έμ„œ 흐름을 μ œμ–΄

✏️ 기초 μ‹€μŠ΅: λ‚˜λˆ—μ…ˆ
10을 0으둜 λ‚˜λˆ„μ–΄ μ—λŸ¬λ₯Ό μœ λ„ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;

        try { //try-catch : μ˜ˆμ™Έ 상황을 try-catch둜 κ°μ‹Έμ„œ μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

            int result = a / b;
            System.out.println("result is " + result);
        } catch (ArithmeticException e) {
            System.out.println("ArithmeticException : " + e);
            System.out.println("Error : Divide by zero");
        } catch (Exception e) {
            System.out.println("Exception : " + e);
        }
    }
}
▢️
ArithmeticException : java.lang.ArithmeticException: / by zero
Error : Divide by zero

βœ… catch

  • catch λΈ”λ‘μ˜ λ§€κ°œλ³€μˆ˜ eλŠ” μ˜ˆμ™Έ 정보λ₯Ό λ‹΄κ³  있음
  • e.getMessage()λ₯Ό 톡해 μ—λŸ¬ 상세 정보 확인 κ°€λŠ₯

βœ… try-catch와 흐름 μœ μ§€

  • μ—λŸ¬ λ°œμƒμ—λ„ ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λ˜μ§€ μ•Šκ³  이후 μ½”λ“œκ°€ 싀행됨
  • μ‚¬μš©μž κ²½ν—˜ ν–₯상 및 μ•ˆμ •μ„± 확보

ℹ️ μ˜ˆμ™Έ 클래슀 계측 ꡬ쑰

  • Exception은 μ΅œμƒμœ„ μ˜ˆμ™Έ
  • NumberFormatException, ArithmeticException 등은 ν•˜μœ„ 클래슀
  • 보닀 ꡬ체적인 μ˜ˆμ™Έ ν΄λž˜μŠ€λΆ€ν„° μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŒ
Object
 └── Throwable
     β”œβ”€β”€ Error                (μ‹œμŠ€ν…œ 였λ₯˜, 보톡 catchν•˜μ§€ μ•ŠμŒ)
     └── Exception            ← μš°λ¦¬κ°€ 주둜 λ‹€λ£¨λŠ” μ˜ˆμ™Έμ˜ μ‹œμž‘μ 
         β”œβ”€β”€ IOException
         β”œβ”€β”€ SQLException
         └── RuntimeException
              β”œβ”€β”€ ArithmeticException
              β”œβ”€β”€ NumberFormatException
              └── NullPointerException λ“±

✏️ λ¬Έμžμ—΄ -> μ •μˆ˜ λ³€ν™˜ μ‹€μŠ΅
λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •μ—μ„œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

NumberFormatException 처리

  • λ¬Έμžμ—΄μ— μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ μ„žμ΄λ©΄ μ˜ˆμ™Έ λ°œμƒ
  • try-catch둜 포괄적 처리 κ°€λŠ₯
public class Main {
    public static void main(String[] args) {
        try {
            String input = "123a";
            int number = Integer.parseInt(input);
            System.out.println("당신이 μž…λ ₯ν•œ μˆ«μžλŠ” " + number + "μž…λ‹ˆλ‹€.");
        } catch (NumberFormatException e) {
            System.out.println("숫자 포맷이 μ•„λ‹™λ‹ˆλ‹€. Exception : " + e);
        }
    }
}
▢️
숫자 포맷이 μ•„λ‹™λ‹ˆλ‹€. Exception : java.lang.NumberFormatException: For input string: "123a"

↔️ 쑰건문 vs μ˜ˆμ™Έ 처리

  • μ‘°κ±΄λ¬ΈμœΌλ‘œλ„ μ˜ˆμ™Έ 상황을 막을 수 μžˆμ§€λ§Œ ν•œκ³„ 쑴재
  • μ˜ˆμ™Έ μ²˜λ¦¬λŠ” 보닀 포괄적이고 μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν•¨

μƒλ‚¨μžμ‹ μ½”λ”©μ—μ„œλŠ” ν•„μš”μ—†κ² μ§€λ§Œ
λ„€νŠΈμ›Œν¬, λ³΄μ•ˆ λΆ„μ•Όμ—μ„œλŠ” exeption 관리가 μ€‘μš”ν•  κ²ƒμž„

try-catchλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ μ—λŸ¬μ—λ„ ν”„λ‘œκ·Έλž¨μ˜ 흐름을 μœ μ§€ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.


βœ”οΈ Throws

βœ… throwsλž€?

  • μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” λ©”μ„œλ“œμ—μ„œ, 처리 μ±…μž„μ„ ν˜ΈμΆœμžμ—κ²Œ μœ„μž„
  • try-catchλŠ” μ˜ˆμ™Έλ₯Ό 직접 처리, throwsλŠ” μ˜ˆμ™Έλ₯Ό μ„ μ–Έλ§Œ 함

✏️ 예제
μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•˜λŠ” λ©”μ„œλ“œ μž‘μ„±

public static int convertToInt(String s) throws NumberFormatException {
    return Integer.parseInt(s);
}
try {
    int num = convertToInt("123");
    System.out.println("λ³€ν™˜ κ²°κ³Ό: " + num);
} catch (NumberFormatException e) {
    System.out.println("숫자 ν˜•μ‹ 였λ₯˜!");
}

πŸ’‘ throws μ‚¬μš©μ˜ λͺ©μ 

  • μ˜ˆμ™Έ 처리 μ±…μž„μ„ λ©”μ„œλ“œ μ™ΈλΆ€λ‘œ λ„˜κ²¨ μ½”λ“œ 뢄리 κ°€λŠ₯
  • 라이브러리, μœ ν‹Έλ¦¬ν‹°μ„± λ©”μ„œλ“œμ—μ„œ 많이 μ‚¬μš©

↔️ throws vs try-catch

ꡬ뢄throwstry-catch
μ—­ν• μ˜ˆμ™Έ λ°œμƒ 'μ„ μ–Έ'μ˜ˆμ™Έ 직접 '처리'
μž₯μ†Œλ©”μ„œλ“œ μ„ μ–ΈλΆ€λ©”μ„œλ“œ λ³Έλ¬Έ
μ½”λ“œ νλ¦„ν˜ΈμΆœμžκ°€ μ±…μž„μ§λ°œμƒν•œ μœ„μΉ˜μ—μ„œ 처리

✏️ 예제
λ©”μ„œλ“œ 선언을 보고 λ©”μ„œλ“œ μ™„μ„±ν•˜κΈ°
public static int multiply(String input) throws _____ {

// κ³±μ…ˆ λ¬Έμž₯을 λ°›μ•„ split으둜 ν”Όμ—°μ‚°μžλ₯Ό μ–»μ–΄ μˆ«μžμΈμ§€ ν™•μΈν•˜κ³  μ•„λ‹ˆλ©΄ NumberFormatException throw
public class multiply {
    public static int multiply(String input) throws NumberFormatException {
        String[] operand = input.split("\\*");
        int[] nums = new int[operand.length];
        try {
            for (int i = 0; i < operand.length; i++) {
                nums[i] = Integer.parseInt(operand[i]);
            }
        } catch (NumberFormatException e) {
            System.out.println("wrong format : " + e.getMessage());
        }
        return nums[0]*nums[1];
    }
    public static void main(String[] args) {
        System.out.println(multiply("9*9"));
    }
}

throwsλŠ” μ˜ˆμ™Έ λ°œμƒ 사싀을 ν˜ΈμΆœμžμ—κ²Œ μ•Œλ¦¬κ³ , 처리 μ±…μž„μ„ μœ„μž„ν•˜λŠ” 선언적 λ„κ΅¬μž…λ‹ˆλ‹€.


βœ”οΈ Throw

βœ… 쑰건 체크 ν›„ throw

✏️ 쑰건을 κ²€μ‚¬ν•˜κ³  μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” throw μ‚¬μš© 예

public class Main {
    public static void main(String[] args) {
        String input = "13";
        try {
            boolean result = validateTokenCount(input);
            if (result) {
                System.out.println("숫자 2개");
            }
        } catch(NumberFormatException e) {
            System.out.println(e.getMessage());
        }
    }
    public static boolean validateTokenCount(String tokens) throws NumberFormatException {
        if (tokens.length() != 2) {
            throw new NumberFormatException("숫자 2κ°œκ°€ μ•„λ‹™λ‹ˆλ‹€.");
        } else {
            return true;
        }
    }
}
숫자 2개
숫자 2κ°œκ°€ μ•„λ‹™λ‹ˆλ‹€.

↔️ throws vs throw 비ꡐ

ν•­λͺ©throwsthrow
μ—­ν• μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯성을 μ„ μ–Έμ‹€μ œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΄
μœ„μΉ˜λ©”μ„œλ“œ μ„ μ–ΈλΆ€λ©”μ„œλ“œ λ³Έλ¬Έ λ‚΄λΆ€
κ°œμˆ˜ν•œ λ²ˆμ— μ—¬λŸ¬ 개 μ„ μ–Έ κ°€λŠ₯ν•œ λ²ˆμ— ν•˜λ‚˜λ§Œ μ‚¬μš© κ°€λŠ₯
μ‚¬μš© 예public void run() throws IOExceptionthrow new IOException();

βœ”οΈ finally

βœ… finallyλž€?

  • tryλ‚˜ catch λΈ”λ‘μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ“  μ•„λ‹ˆλ“ , System.exit(0) 같은 μ‹œμŠ€ν…œ μ’…λ£Œκ°€ μΌμ–΄λ‚˜μ§€ μ•ŠλŠ” 이상 finallyλŠ” 항상 싀행됨
  • λ¦¬μ†ŒμŠ€ 정리, 둜그 남기기 λ“± μ€‘μš”ν•œ ν›„μ²˜λ¦¬μ— μ‚¬μš©

✏️ 기초 μ‹€μŠ΅: finally 블둝 μ‹€ν–‰ 확인
정상 μ‹€ν–‰ μ‹œμ—λ„ finallyκ°€ ν˜ΈμΆœλ˜λŠ” 예제

public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int result = a / b;
            System.out.println("result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("Error: 0으둜 λ‚˜λˆ”.");
        } finally {
            System.out.println("Cleanup: 이 블둝은 항상 μ‹€ν–‰λ©λ‹ˆλ‹€.");
        }
    }
}

πŸ” finally 핡심 μš”μ•½

  • finallyλŠ” μ˜ˆμ™Έ λ°œμƒ 여뢀와 관계없이 항상 μ‹€ν–‰λ˜λŠ” λΈ”λ‘μž…λ‹ˆλ‹€.
  • 주둜 파일 λ‹«κΈ°, DB μ—°κ²° ν•΄μ œ, 둜그 기둝 λ“± μ€‘μš”ν•œ ν›„μ²˜λ¦¬μ— μ‚¬μš©λ©λ‹ˆλ‹€.
  • return문이 μžˆμ–΄λ„ finallyλŠ” μ‹€ν–‰λ˜λ©°, ν”„λ‘œκ·Έλž¨ 흐름을 λ§ˆλ¬΄λ¦¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  • μ˜ˆμ™Έ 처리 ꡬ쑰λ₯Ό μ•ˆμ „ν•˜κ³  ν™•μ‹€ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ κΌ­ ν™œμš©ν•΄μ•Ό ν•˜λŠ” ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€.

finallyλŠ” ν”„λ‘œκ·Έλž¨μ˜ 흐름과 관계없이 항상 μ‹€ν–‰λ˜μ–΄ μ€‘μš”ν•œ ν›„μ²˜λ¦¬λ₯Ό 보μž₯ν•΄μ£ΌλŠ” λΈ”λ‘μž…λ‹ˆλ‹€


πŸ’«CS

βœ”οΈ interrupts

βœ… μΈν„°λŸ½νŠΈλž€ 무엇인가?
μ‹€ν–‰ 쀑인 흐름을 μž μ‹œ λ©ˆμΆ”κ³  μ™ΈλΆ€ μš”μ²­μ„ λ¨Όμ € μ²˜λ¦¬ν•˜λŠ” 방식

βœ… 핡심 κ°œλ…:
β€’ CPU에 β€œμ§€κΈˆ 이거 ν•΄μ€˜!”라고 μš”μ²­
β€’ μ‹€ν–‰ 쀑 μ»¨ν…μŠ€νŠΈ μ €μž₯ β†’ μΈν„°λŸ½νŠΈ 처리 β†’ μ›λž˜ 흐름 볡귀

ex) Thread[] μ˜μƒ νŽΈμ§‘ ν”„λ‘œκ·Έλž¨ = {μ˜μƒ νŽΈμ§‘, μžλ§‰, μŒμ•…, 파일 λ‹€μš΄λ‘œλ“œ}

βœ… μΈν„°λŸ½νŠΈμ˜ 3단계

  • 1️⃣ 문제 λ˜λŠ” 이벀트 λ°œμƒ
    β†’ μ™ΈλΆ€ μž₯μΉ˜λ‚˜ μ†Œν”„νŠΈμ›¨μ–΄κ°€ μΈν„°λŸ½νŠΈ μ‹ ν˜Έλ₯Ό 보냄
    (예: ν‚€λ³΄λ“œ μž…λ ₯, 타이머 μ’…λ£Œ, μ‹œμŠ€ν…œ 콜 μš”μ²­ λ“±)
  • 2️⃣ CPUκ°€ μΈν„°λŸ½νŠΈ 처리
    β†’ ν˜„μž¬ μž‘μ—…μ„ μž μ‹œ λ©ˆμΆ”κ³ ,
    μ»¨ν…μŠ€νŠΈ μ €μž₯ β†’
    μΈν„°λŸ½νŠΈ μ„œλΉ„μŠ€ 루틴(ISR) μ‹€ν–‰
  • 3️⃣ 3. μ›λž˜ ν”„λ‘œκ·Έλž¨μœΌλ‘œ 볡귀
    β†’ μ»¨ν…μŠ€νŠΈ 볡원 ν›„, μ€‘λ‹¨λ˜μ—ˆλ˜
    지점뢀터 정상 흐름 재개

βœ… μΈν„°λŸ½νŠΈμ˜ μ’…λ₯˜μ™€ 처리 κ³Όμ •

process, process, process

profile
πŸ—‚οΈ hamstern

0개의 λŒ“κΈ€