컴공생의 발자취

[내일배움캠프 9일차 TIL] 예외처리 본문

🤝 활동/스파르타코딩클럽

[내일배움캠프 9일차 TIL] 예외처리

MNY 2024. 4. 25. 21:05
728x90
반응형
오늘의 진도 : Java 문법 종합반 4주차 완강 후 숙제 진행 중...

오늘도 내가 강의를 들으면서 새롭게 알게된 것 그 동안 애매했던 것을 오늘의 학습으로 정리하려고 한다.
오늘의 학습, 오늘의/지난 날의 궁금증, 숙제, 특강, 코드카타, 오늘의 회고 이렇게 6개의 큰 틀로 나누어 정리할 것이다.

 

💡 오늘의 학습 키워드

- 4주차 -
오류 & 예외
throws & throw
try ~ catch ~ fianlly
Chained Exception
initCause & getCause
실제 예외 처리
generic


 

 

오류 & 예외

  • 오류(Error) : 회복이 불가능한 문제
  • 예외(Exception) : 회복이 가능한 문제
    - 컴파일 에러(확인된 예외) : 문법 오류
    - 런타임 에러(미확인된 예외) : 컴파일O -> 프로그램 실행 도중 맞닥뜨리는 예외

 

throws & throw

  • throws
    • 메서드 이름 뒤에 붙어 어떤 예외사항을 던질 수 있는지 알려주는 예약어
    • 여러 종류의 예외사항 적을 수 있음
  • throw
    • 메서드 안에서, 실제로 예외 객체를 던질 대 사용하는 예약어
    • 실제로 던지는 예외 객체 하나와 같이 사용
    • 일반 메서드의 return 키워드와 비슷하게 throw 아래의 구문들은 실행되지 않고 종료
public void thisMethodIsDangerous() throws OurBadException {
        // custom logic~!
        if (just) {
            throw new OurBadException();
        }
    }
    
public class OurBadException extends Exception {
    public OurBadException() {
        super("위험한 행동을 하면 예외처리를 꼭 해야함!");
    }
}

 

try ~ catch ~ finally

: 일단 try해. 그리고 예외가 발생하면 그걸 잡아(catch). 그리고 정상적으로 수행되든, 예외가 발생하든 finally를 수행해.

try {
    // 시도할 내용
    ourClass.thisMethodIsDangerous();
} catch(OurBadException e) {
    System.out.println(e.getMessage());
} finally {
    // 무조건 여기는 거쳐요!!!
    System.out.println("finally");
}

 

Chained Exception

  • 예외는 다른 예외를 유발할 수 있음
  • 예외 연결 : 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시킴
  • 여러 예외를 하나의 큰 분류로 묶어 다루기 위해
  • checked excepton -> unchecked exception : 코드를 줄이기 위해(포장)

 

initCause & getCause

  • initCause() : 지정한 예외를 원인 예외로 등록하는 메소드
  • getCause() : 원인 예외를 반환하는 메소드
더보기
// 연결된 예외 
public class main {

    public static void main(String[] args) {
        try {
            // 예외 생성
            NumberFormatException ex = new NumberFormatException("가짜 예외이유");

            // 원인 예외 설정(지정한 예외를 원인 예외로 등록)
            ex.initCause(new NullPointerException("진짜 예외이유"));

            // 예외를 직접 던집니다.
            throw ex;
        } catch (NumberFormatException ex) {
            // 예외 로그 출력
            ex.printStackTrace();
            // 예외 원인 조회 후 출력
            ex.getCause().printStackTrace();
        }

        // checked exception 을 감싸서 unchecked exception 안에 넣습니다.
        throw new RuntimeException(new Exception("이것이 진짜 예외 이유 입니다."));
    }
}

// 출력
Caused by: java.lang.NullPointerException: 진짜 예외이유

 

실제 예외 처리

  1. 예외 복구 : 최소한 대응 / 자주 사용X
  2. 예외 처리 회피
  3. 예외 전환 : 적절한 방법
public void someMethod() throws IOException { ... }

public void someResponsibleMethod() throws MoreSpecificException {
    try {
        this.someMethod();
    } catch (IOException e) {
        throw new MoreSpecificException(e.getMessage());
    }
}

 

generic

: generalized(일반화) + genetic(유전적인)

public class Generic<T(= 타입 변수)> { ... }
Generic<타입> stringGeneric = new Generic<>();
더보기
// 1.
public class Generic<T> {
    // 2.
    private T t;
    // 3.
    public T get() {
        return this.t;
    }

    public void set(T t) {
        this.t = t;
    }

    public static void main(String[] args) {
        // 4.
        Generic<String> stringGeneric = new Generic<>();
        // 5.
        stringGeneric.set("Hello World");
				
        String tValueTurnOutWithString = stringGeneric.get();

        System.out.println(tValueTurnOutWithString);
    }
}
  • 중복되거나 필요없는 코드 줄여줌
  • 타입 안정성을 해치지X
  • 클래스 or 메서드에 사용 가능
  • Generic 클래스 : 원시 타입
  • 객체의 static 멤버 사용X
    # 타입 변수는 인스턴스 변수로 간주, static은 인스턴스화 필요없이 사용가능한 특성으로 사용 불가능
  • 배열 생성X
  • 다수 타입 변수 사용 가능
  • 와일드 카드
  1. <? extends T> : T와 그 자손들만 사용가능
    public class ParkingLot<T extends Car> { ... }​
  2. <? super T> : T와 그 조상들만 가능
  3. <?> : 제한 없음

 


오늘의 궁금증

  • Q : 오버로딩 vs 오버라이딩?
    • A : 오버로딩 - 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의
    • A : 오버라이딩 - 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의
 

[Java]오버로딩 & 오버라이딩(Overloading & Overriding)

오버로딩(Overloading) 오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. C언어에서는 함수명이 고유하게 존재해야 한다. 즉 하나의 함수가 하나의 기능만을 구현해야 한다는 것

hyoje420.tistory.com

 

 

  • 아직 찾아보지 못 한 궁금증(더보기 ..Click!)
더보기
  • Q : 참조는 reference인데 자바는 call by value로만 동작하는 것 아닌가?
  • Q : wrapper클래스.. 그래서 무슨 기능들을 가지고 있는데?
  • Q : Object.equals와 str.equals의 차이? // 요건 공식 문서를 찾아봐야겠어..
  • + Q : 원시 타입이 뭐지?
  • + Q : generic에는 wrapper 클래스만 들어가나?
  • + Q : arrayList vs linkedList?

 


숙제

  • step4 힌트에서도 이해되지 않은 부분
    • 생성자 혹은 Setter를 사용하여 연산을 수행할 연산 클래스의 객체를 AbstractOperation 클래스 타입의 필드에 주입합니다.(다형성)
    • calculate 메서드에서는 더 이상 연산자 타입을 받아 구분할 필요 없이 주입 받은 연산 클래스의 operate 메서드를 통해 바로 연산을 수행합니다.
  • 내가 만들지 못한 부분
    • Calculator : Calculator, setOperation
    • Main
  • 만들지 못한 이유에 대한 고촬

그래서 Calculator의 생성자와 set함수에 대해 알지 못함. 이로인해 Main의 내용을 어떻게 작성할지 감을 못잡음. 
하지만, 힌트를 봤음에도 해당 개념을 정확하게 이해하고 활용하지 못함.
-> 생성자와 set함수의 활용법에 대한 이해부족

 


알고리즘 특강

효율적 알고리즘
- 적은 메모리
- 적은 연산 횟수

 


코드 카타 

* 프로그래머스로 진행

 

  • 알고리즘
    • 두 수의 차
    • 두 수의 곱
    • 몫 구하기
    • 나이 출력
  • SQL
    • 이름이 있는 동물의 아이디
    • 역순 정렬하기
    • 중복 제거하기
    • 동물의 아이디와 이름

 


오늘의 회고

  • 12시간 중 얼마나 몰입했는가?

어제와 비슷하게 몰입한 것 같다.

아니다! 어제보단 더욱 집중할 수 있었던 것 같다.

 

  • 오늘의 생각

아무래도 학습한 것에 있어서 활용을 제대로 하지 못하는 것 같다.

오늘도 4주차를 완강하고나서 숙제를 진행할 때 막히는 부분이 있었다.

3주차에서는 생성자와 getter & setter에 대해 활용이 미숙했고 4주차는 예외처리 활용에 대해 미숙한 것 같다.

아무래도 어떤 식으로 활용하는지 코드를 많이 접해보는 방식으로 접근하는게 좋을 것 같다.

 

  • 내일 학습할 것은 무엇인지

4주차 숙제를 마무리한 후 5주차 강의를 모두 다 들을 예정이다.

또한, 오전 중에 코드 카타와 알고리즘 특강을 들을 것이다.

그러고 시간이 된다면 개인과제를 시작해보려구 한다.

 

 

 

728x90
반응형