Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240629 JAVA 4주차 본문

개발Article

[TIL]20240629 JAVA 4주차

최밤빵 2024. 6. 30. 00:27

4주차 강의는 사전과정 때도 못 들어서 강의를 딱 한번 들었다. 

제네릭과 예외처리는 꼭 알아야한다고 해서 한번은 들어보자 했는데! 짧은 강의시간에 비해 내용은 어려웠고,

Spring 시작하고 다시 공부해야하는 부분이였다.... 제네릭은 그저 <T>, 예외처리는 예외 

딱 이 정도만 알고있어서 중간중간 다시 공부하면서 정리하는게 많이 힘들다 ㅠㅠㅠㅠㅠㅠ

그렇다고 지금도 잘 알고있는건 아니지만 동료분들의 조언을통해 필요할 때 마다 찬찬히 이해해가는 중....!

 

▶ 프로그램 오류 

 

프로그램이 실행 중 어떤 원인에 의해서 오작동 하거나 비정상적으로 종료되는 경우가 있는데, 이런 결과를 초래하는 

원인을 프로그램 에러 or 오류라고 한다. 

발생 시점에 따라 컴파일 에러, 런타임 에러 로 나눌 수 있는데, 컴파일 에러는 컴파일 할 때 발생하는 에러이고, 프로그램

실행 도중에 발생하는 에러를 런타임에러,  컴파일도 잘 되고 실행도 잘 되지만 의도와 다르게 동작하는 경우를 논리적 에러라고 한다. 

 

소스코드를 컴파일 하면 컴파일러가 소스코드에 대한 오타나 잘못된 구문, 자료형을 체크 하는 등의 기본적인 검사를 수행해서 오류가 있는지를 알려준다. 컴파일러가 알려준 에러들을 수정해서 컴파일을 성공적으로 마치면 클래스 파일이 생성되고 생성된 클래스 파일을 실행 할 수 있다. 하지만.. 컴파일을 성공적으로 마쳤다고 해도 프로그램 실행 시 에러가 발생하지 않는건 아니라서, 컴파일은 잘 되었어도 실행 중 에러에 의해 잘못된 결과를 얻거나 비정상 적으로 종료될 수 있다. 

런타임 에러를 방지 하기위해서는 프로그램 실행 도중 발생할 수있는 경우의 수를 고려해서 대비 하는 것이 필요하다. 

 

문제상황을 구분하기 위해서 사용하는 기준은 일반적으로 회복가능여부이다.

java에서는 실행(runtime)시 발생할 수 있는 프로그램 오류를 에러와 예외(exception) 두 가지로 구분한다 .

 

▷ 에러(error) 

일반적으로 회복이 불가능한 문제. 프로그램 코드에 의해서 발생하는 경우도 있지만, 수습 될 수 없는 심각한 오류. 

메모리 부족, 스택오버플로우 

▷ 예외(exceptoin)

일반적으로 회복이 가능한 문제.  회복이 가능하다는 전제는 그 예외가 발생할 수 있다는 걸 인지하고 대응할 수 있다. 프로그램 코드에 의해서 수습될 수 있는 비교적 덜 심각한 것. 현실적으로 코드 레벨에서 할 수 있는 문제상황에 대한 대응은 예외처리에 속한다. 

 

에러와 예외는 모두 실행 시 발생하는 오류이다. (runtime) 

 

▶ 예외처리 (exception handling)

프로그램 실행 시 발생할 수있는 예외의 발생에 대비한 코드를 작성하는 것. 

목적은 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것이다. 

 

▶ try -catch문

예외를 처리하기 위해서는 try - catch문을 사용한다. 

try {
    // 예외가 발생할 가능성이 있는 문장들을 넣는다.
        } catch (Exception1 e1) {
    // Exception1 e1이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다.
        } catch (Exception2 e2) {
    //   // Exception2 e2이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다.
        }

하나의 try블럭 다음에 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch블럭 이 올수있고, 여기서 발생한 예외 종류와 일치하는 단 한 개의 catch블러만 수행된다. 발생한 예외종류와 일치하는 catch블럭이 없으면 예외는 처리되지않는다. 

 

▷ try블럭 내에서 예외가 발생한 경우

발생한 예외와 일치하는 catch블럭이 있는지 확인한다. 

일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try -catch문을 빠져나가서 그 다음 문장을 수행. 일치하는 catch블럭을 찾지못하면, 예외는 처리되지 못한다. 

 

▷ try블럭 내에서 예외가 발생하지 않은 경우 

catch블럭을 거치지 않고 전체 try -catch문을 빠져나가서 수행을 계속한다. 

 

▶ finnally 블럭 

예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다. try-catch문의 끝에 선택적으로 덧붙여 사용할 수 있고, try - catch - finally의 순서로 구성된다. 

try {
        // 예외가 발생할 가능성이 있는 문장들을 넣는다.
        } catch(Exception1 e1) {
        // 예외 처리를 위한 문장
        } finally {
        // 예외의 발생여부와 관계없이 항상 수행되어야 하는 문장들을 넣는다.
        // finally블럭은 try-catch문의 맨 마지막에 위치해야 한다.
        }

예외가 발생 한 경우에는 try - catch - finally 순으로 실행되고 , 예외가 발생하지 않는 경우에는 try - finally의 순으로 실행 된다. 

 

▶ 제네릭(Generics)

다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능. 

객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다. 

// Bread객체만 저장할 수 있는 ArrayList를 생성
ArrayList<Bread> breadList = new ArrayList<Bread>();

breadList.add(new Bread());
breadList.add(new Cake()); // 컴파일 에러. Bread 외에 다른 타입은 저장 불가 

ArrayList로 예를 들면, 다양한 종류의 객체를 담을 수 있지만, 보통 한 종류의 객체를 담는 경우가 많다. 
예시 처럼 ArrayList를 생성 할 때 저장할 객체의 타입을 지정해주면 지정한 타입 외에 다른 타입의 객체가 저장되면 에러가 발생한다. 

ArrayList breadList = new ArrayList<>();

breadList.add(new Bread());
Bread b = (Bread)breadList.get(0);

 

→ 제네릭을 적용하지 않은코드 

ArrayList<Bread> breadList = new ArrayList<Bread>();

breadList.add(new Bread());
Bread b = (Bread)breadList.get(0); // 형변환 불필요!

→ 제네릭을 적용한 코드

저장된 객체를 꺼낼 때는 형변환 할 필요가 없어 편리하다. 이미 어떤 타입의 객체들이 저장되어 있는지를 알고있기 때문!

 

▷ 제네릭의 장점 

1. 타입 안정성 제공

2. 타입체크와 형변환을 체크할 수 있어서 코드가 간결해진다. 

 

 

정리가 잘 안되는 부분이 많아서 중간중간 공부하고 수정하는 중...!

새로운거 공부하면서 되돌려 공부하려니 이해가 되는 부분도 있는 반면, 과부하가 오는 것 같다. 

사전과정때 미리 공부해뒀다면 좋았을거 같은데, 객체도최근에 조금 이해한 나라서 그저 열심히 해보는 중...