예외 클래스

에러(error) : 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것

예외(exception) :

  • 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
  • 예외가 발생하면 프로그램이 곧바로 종료된다는 점에서 에러와 비슷
  • 그러나 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지된다는 점에서 에러와 차이가 있다.

예외 클래스 : 자바에서는 예외를 클래스로 관린한다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.

 

< 예외의 두가지 종류 >

일반 예외 (exception) : 컴파일러 체크 예외. 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생함

실행 예외 (runtime exception) : 컴파일러 넌체크 예외. 실행 시 예측할 수 없이 갑자기 발생. 따라서 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다.

 

실행 예외

  • 오로지 개발자의 경험에 의해서 예외처리 코드를 작성해야 한다.
  • 프로그램에서 예외가 발생하면 예외 메시지가 콘솔뷰에 출력된다.
  • 콘솔뷰에서는 어떤 예외가 어떤 소스의 몇 번째 코드에서 발생했는지 알 수 있다.

NullPointerException : 객체 참조가 없는 상태

 예를 들어, String s = null; 인데 s.toString() 메소드를 호출하는 경우

ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과할 경우 발생.

예를 들어, int[ ] arr = new int [3] 배열에 arr[3] 의 값을 넣으려고 하는 경우

NumberFormatException : 숫자로 변환될 수 없는 문자를 숫자로 변환하려 할 때 발생

  • String to int : Integer.parseInt(String s)
  • String to double : Double.parseDouble(String s)

예를 들어, String s = "a100"; 이라는 문자열을 숫자로 변환하려고 하는 경우

 

ClassCastException : 상위 클래스와 하위 클래스간 타입 변환시 발생하는 오류. 타입 변환 전에 변환이 가능한지 instanceof 연산자로 확인하는 것 이 좋다. 

 

Animal animal = new Dog();
Dog dog = (Dog) animal;
  • 위와 같은 경우 Animal 타입 변수에 대입된 객체가 Dog이므로 다시 Dog로 변환하는 것은 아무런 문제가 없다.
  • 그러나 다시 Cat 클래스로 타입변환을 한 경우 대입된 객체가 아닌 다른 클래스 타입으로 변환되었기 때문에 예외가 발생한다.

 

예외 처리 코드

예외 처리 : 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 것

 

try - catch - finally 블록 : 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.

 

https://tutorial.eyehunts.com/java/try-catch-finally-java-blocks-exception-handling-examples/

  • try 블록에 예외 발생 가능 코드가 위치한다.
  • try 블록의 코드가 정상 실행 된다면 바로 finally  블록의 코드를 실행하고, 만약 예외가 발생한다면 바로 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행한다. 그리고 finally 블록의 코드를 실행한다.
  • finally블록은 생략 가능하다. 예외 발생 여부와 관계없이 항상 실행할 내용이 있을 경우에만 작성해주면 된다.

 

다중 catch 블록 

  • try 블록 안에 다양한 예외가 발생할 수 있다.
  • try 블록에서 특정 타입의 예외가 발생하면 catch 블록에서도 그 타입에 맞는 예외 처리가 실행된다.
  • try 블록에서 예외가 발생했을 때, 예외를 처리해 줄 catch블록은 위에서부터 차례대로 검색된다.
  • 따라서, catch 블록이 여러 개라 할지라도 해당되는 단 하나의 catch 블록만 실행된다.
  • 주의할 점은, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다는 것 (아래 사진 참조)

  • 위의 왼쪽 사진에서 ArrayIndexOutBoundsException은 Exception을 상속받기 때문에 첫 번째 catch 블록만 선택되어 실행이 된다. 따라서 두 번째 catch 블록은 어떤 경우라도 실행되지 않는 문제가 있다. 올바르게 사용한 예시는 오른쪽이라고 할 수 있다.

③ 예외 떠넘기기 - throws

  • 메소드 내부에서 예외 처리를 할 때 try - catch 블록으로 처리하는 것이 기본이지만,
  • 경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
  • throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
  • 그러면 메소드를 호출하는 곳에서 try-catch 블록을 사용해 예외 처리를 해줘야 한다.
  • main()메소드에선 throws Exception을 사용하는 것이 바람직하지 않기 때문에, try-catch 예외를 최종 처리해주는 것이 좋다.

예외 떠넘기기 참고 블로그 :

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=heartflow89&logNo=220985722731 

 

[JAVA/자바] 예외 던지기/떠넘기기 - throws

 이번 포스팅은 예외를 처리하는 두 번째 방법에 대해서 알아보려고 한다. 이전에 알아본 예외가 발생...

blog.naver.com

 

 

 

 

ArrayList.indexOf()
indexOf(Object o)는 인자로 객체를 받는다. 리스트의 앞쪽부터 인자와 동일한 객체가 있는지 찾으며, 존재한다면 그 인덱스를 리턴한다. 존재하지 않는다면 -1을 리턴한다.

 

 

다른 사람들의 풀이 

 

 

  • 이 분은 for문의 조건문에 .contain() 을 사용하셨다.
  • The contains() method of List interface in Java is used for checking if the specified element exists in the given list or not. 
  • 그리고 아래 새로운 배열에 값을 넣을때도 for each 문을 사용하여 list값을 [size++] 로 바로 넣어 주는 방식을 사용했다.

 

 

가장 많이 사용된 방식인데, HashSet이라는 클래스를 처음 접해서 뭔지 모르겠다.

알고리즘이 끝나면 차차 자료구조를 더 공부해야 할 것 같다.

특히 ArrayList, Hash Map, Stream 부분은 늦더라도 천천히 공부해야 할 것 같다.

 


※ 문자열 포함여부 확인 메소드

 

  • contains : 문자열에 검색하고자 하는 문자가 있는지 확인 : 포함 - true / 미포함 - false
  • indexOf : 문자열에서 검색하는 문자의 위치를 반환 : 포함 - 문자 위치 / 미포함 - ( -1 )
  • matches : 정규식을 이용하여 문자열을 검색한다, 특정 문자열을 검색할때 사용하기 보다는 한글, 숫자 등과 같이 해당 형태의 텍스트가 존재하는지 확인할때 사용하면 좋다 : 포함 - true / 미포함 - false

 

 

참고 블로그 : https://coding-factory.tistory.com/534

 

[Java] 문자열에 특정 문자 포함 / 검색하는 다양한 방법(indexOf, contains, matches)

프로그래밍을 하다보면 특정 문자열에서 원하는 문자가 포함되어 있는지 확인해야하는 소스를 넣을때가 종종 있습니다. 문자열을 찾는 방법은 String클래스의 indexOf(), contains(), matches()메소드를

coding-factory.tistory.com

 

'알고리즘' 카테고리의 다른 글

[36] 항해99 알고리즘 실전테스트  (0) 2022.11.24
알고리즘 잘 푸는 방법 !  (4) 2022.11.24
[34] 같은 숫자는 싫어 JAVA  (0) 2022.11.23
[33] 최소직사각형 JAVA  (0) 2022.11.22
[32] 3진법 뒤집기 JAVA  (0) 2022.11.22

 

 

다른 사람들의 풀이

 

 

 

 

  • for문을 돌리기 list 첫 인덱스 자리에 arr[0]을 넣어주었다.
  • 따라서 for문은 i = 1; 인덱스 첫자리 부터 배열 arr의 해당 수가 이 전과 다르면 list에 .add()로 추가를 해주면서 list를 만들어 준다.
  • 이 후 answer 이라는 배열을 list.size() 와 동일한 길이로 설정해주고,
  • 다시 for문을 돌려 list 안의 객체들을 하나씩 배열안으로 넣어준다.

 

 

  • 이 방법은 preNum이라는 변수에 10을 넣어주는데, 이는 arr이에 들어갈 객체의 범위가 1 =< arr[i] <= 9 이기 때문이다. 
  • 10이라는 숫자는 당연히 배열 arr의 객체와 다르므로 if문을 통해 tempList안에 arr 객체 숫자가 들어가고,
  • 바로 밑에 줄에서 다시 그 숫자를 preNum = num; 이라는 할당 연산자로 preNum에 값을 부여함으로써 tempList에 중복된 값이 들어가지 않도록 설계되었다.
  • 다음, answer이라는 배열을 tempList 길이만큼의 배열로 만들어주고, for문을 돌리면서 list 값을 배열안에 재배치 하였다.

'알고리즘' 카테고리의 다른 글

알고리즘 잘 푸는 방법 !  (4) 2022.11.24
[35] 두 개 뽑아서 더하기 JAVA  (1) 2022.11.23
[33] 최소직사각형 JAVA  (0) 2022.11.22
[32] 3진법 뒤집기 JAVA  (0) 2022.11.22
[31] 항해99 10기 알고리즘 모의고사 풀이  (0) 2022.11.22

[오늘의 회고]

 

분수소리도 나는 사전스터디 16조 게더 광장

 

 

 

1. 어려웠던 부분 : 오늘은 알고리즘 모의고사가 있는 날이었다. 상중하 세 문제 중 한가지 문제를 선택하여 풀고 해설영상을 녹화하여 제출해야 했다. 일단 첫번째 문제는 처음에 자바의 Calender 클래스를 이용하면 뚝딱 해치울줄 알았는데, 예상한 값이랑 자꾸 다른 결과값이 나와서 패스하고, 두번째 문제를 풀었다. 두번째 문제는 생각보다 풀만 했는데, 마지막 문제는 너무 시간이 오래 걸릴 것 같기도 하고 길이가 유연한 배열을 생성하기위해 Arraylist를 이용해야 할 것 같았는데, 아직 공부가 부족해서 패스하였다. 

 

나름 금요일부터 4일 동안 열심히 알고리즘을 연습했던 것 같은데, 아직도 많 ~~~~이 부족하다. 

언제쯤 모든 문제를 무던한 마음으로 대할 수 있는 날이 올까

 

2. 느낀 점 : 오늘은 생각보다 집중이 잘 되지 않아서 알고리즘은 모의고사 포함 여섯개만 풀고 (못 푼 문제는 정리만 하고), 자바책을 폈다. 유독히 공부에 집중이 되지 않는 하루였는데, 피곤이 쌓여서 그런 것 같다. 오늘은 무조건 빨리 쉬어야 겠다. 

 

3. 새로 알게 된 내용 :

Calender 클래스나 LocalDate 클래스를 이용하면 디데이 계산을 쉽게 할 수 있다. 

JAVA의 필드 선언은 로컬 변수 선언과 차이가 있다.

최솟값 최댓값 문제는 Math.max() Math.min() 함수를 이용하자.

 

4. 셀프칭찬 (오늘 잘한 일)  : 걱정을 많이 했지만, 그래도 알고리즘 모의고사를 무사히 마쳤다. 누군가에겐 너무나 쉬운 부분일 수 있지만 시작하는 나에겐 모든게 아직 어색하고 어렵다. 우리반 잘하는 사람들을 보면, 비교하지 말아야지 하면서도 언제쯤 난 잘할 수 있을까 막연한 생각이 드는데, 그럴때마다 나도 전 직장에선 주니어크루들에게 그들과 같은 존재였을 거라 생각하며 마음을 잡고 있다. 조급하게 생각하지말고 지금처럼 차근차근 하면 잘 되겠지 !!! ~_~_~_~_~

 

 

5. 내일 할 일 : chap06-3 공부, 알고리즘 챌린지 도전! , Arraylist 정리 및 사용해보기, String 클래스 공부하기

 


[오늘 공부한 부분]

  • 알고리즘 정리
  • 자바 - 필드, StringBuilder 
  • 기술매니저님한테 디버깅 사용법을 배움

 

왜 아무도 안오나요 친정같은 게더 ~_~

 

 

주석에 오타가 있네요 ^^ 곱햇 -> 곱해

다른 사람들의 풀이

 

 

 

for each문, Math.max()와 Math.min()을 이용하여 간결하게 풀이하셨다.

왜 Math.max() 사용할 생각을 못했지 ...

+ Recent posts