NOW OR NEVER
[JAVA] 예외 처리 & Collection 본문
예외 처리
- 예외: 프로그램 실행 중에 사용자의 부주의 등으로 인하여 예기치 않는 상황이 발생하는 것
- 예외 처리: 위에서 설명한 예외를 처리하는 것
- 자바에서는 대부분의 발생할 수 있는 예외에 대하여 이미 클래스로 만들어져 있다. 그 상황이 되면 자동으로 new ArrayIndexOutOfBoundsException()으로 예외객체가 생성된다.
- 자바에서는 대부분의 예외에 대하여 이미 클래스로 만들어져 있고 그 상황이 되면 자동으로 예외 객체가 생성된다.
- 예외가 발생할 만한 코드를 그대로 두게 되면 사용자로부터 신뢰를 잃게 된다.
- 모든 예외 중에 제일 조상은 Exception 이다.
- ArrayIndexOutOfBoundsException 과 NumberFormatException은 is a 관계
- 세분화 하지 않아도 된다면 Exception 클래스 하나만으로도 처리할 수 있다.
- 모든 exception의 결과를 받아 하나로 처리할 수 있다.
1. try catch
try{
예외가 발생할 만한 명령어(들)
} catch(예외클래스명1 변수명){
예외가 발생되었을 때 처리할 명령어(들)
} catch(예외클래스명2 변수명){
예외가 발생되었을 때 처리할 명령어(들)
}
- 하나의 try문에 대한 여러 개의 catch문이 올 수 있다.
- 반드시 범위가 작은 순서대로 와야 한다.
2. finally
- 예외가 발생하거나 예외가 발생하지 않거나 반드시 동작시켜야 할 명령어들을 두는 곳
- catch 맨 뒤에 작성
3. method 안에서의 예외 처리
java.io, java.net, java.sql 등 대부분의 생성자와 메소드들은 예외릂 포함하고 있어 예외처리를 해야 한다.
어떤 메소드에서 예외가 발생할 때에 그 메소드 안에서 예외 처리를 하지 않고 메소드 호출하는 쪽으로 예외를 전파하고자 할 때에 메소드이름 뒤에 throws 예외클래스명을 써서 전달한다.
method 안에서 직접 try catch로 처리
public void 메소드이름(매개변수) {
try {
예외가 발생할 만한 명령어들
} catch (예외 클래스명 변수) {
예외 발생 시 실행할 명령어
}
}
public static void main(String[] args) {
메소드();
}
method가 호출되는 곳으로 예외 처리를 맡기기(전파한다)
public void 메소드이름(매개변수) throws 예외클래스명1, 예외클래스명2{
예외가 발생할 만한 명령어들
}
public static void main(String[] args) {
try {
메소드();
} catch (예외 클래스명 변수) {
예외 발생 시 실행할 명령어
}
}
- method 옆에 throws 작성, 그리고서 그 method 사용하는 곳 가서 try catch 작성
- throw로 여러 개의 예외클래스명 작성 가능
- 대체로 예외처리를 메소드 안에서 직접하게 되면 코드가 뚱뚱해지므로 메소드가 호출되는 곳으로 예외 처리를 맡기는 것이 낫다.
4. RunTimeException
후손: ArithmeticException, InputMismatchException,NumberFormatException, ArrayIndexOutOfBoundsException 등
RunTimeException 및 후손들은 사용자가 특별히 예외처리를 하지 않아도 컴파일이 가능하고 자바가 예외처리를 해준다(빨간색 글자로) 또한 필요하다면 사용자가 직접 예외 처리를 할 수 있다.
후손이 아닌 경우는 사용자가 직접 예외 처리를 해야 한다. 만약 사용자가 예외처리(생성자를 사용하는 쪽에서)를 하지 않으면 컴파일이 되지 않는다. ex)MalformedURLException, IOException 등
FileWriter의 생성자는 다음과 같이 예외를 포함하고 있다.
FileWriter객체.write(파일 내 작성할 내용); : 작성 내용 포함한 파일 생성,
FileWriter객체.close(); : 파일 생성 완료
public FileWriter(String fileName) throws IOException
IOException은 RunTimeException의 후손이 아니기 때문에 사용자가 반드시 예외 처리를 해야 컴파일이 된다.
try { FileWriter fw = new FileWriter("c:/temp/hello.txt"); } catch (IOException e /*or Exception e*/) { System.out.println("예외가 발생되었습니다." +e.getMessage() ); }
5. throw
- throw new 예외클래스이름();
- 사용자가 강제로 예외를 발생시켜야 할 필요가 있다면 throw 키워드를 사용한다,
- throws와 throw의 차이점
- throws : 메소드 안에서 예외가 발생이 될때 메소드 호출하는 쪽으로 예외 전파
- throw: 강제로 예외 발생
6. 사용자 정의 예외
class 예외클래스이름 extends Exception {
public 예외클래스이름(String msg) {
super(msg);
}
}
- 흔한 예외는 만들어져있지만 시스템 내에서 특별한 경우의 예외는 자바는 모른다. 그래서 그 경우를 정의하고자 강제로 예외를 발생 시킬 수 있다.
- 대부분의 일반적인 예외에 대해서는 자바가 이미 클래스로 만들어 두었지만 내가 만드는 시스템에서의 특별한 예외에 대해서는 자바가 모른다. 그럴 때에 사용자가 예외 클래스를 만들 수 있고 그런 상황이 되어도 자바는 모르기 때문에 직접 예외객체를 생성해야 한다.
- 예외클래스명은 의미있는 이름으로 설정한다.
- 강제로 예외 발생은 throw를 이용하여 다른 예외와 동일하게 발생시킨다.
- 사용자 정의 예외는 RunTimeException의 후손이 아니기 때문에 반드시 예외 처리를 해야 한다.
Java의 Collection
많은 양의 데이터를 처리하기위해서는 "배열"을 이용한다. 배열의 단점을 보완하기 위하여 자바에서 더 좋은 배열을 제공한다. 그것을 "컬렉션"이라고 부른다
- 배열의 단점
- 배열은 자료형이 같아야 한다.
- 배열의 크기가 고정되어 있어 처음 정해진 크기가 더 많은 데이터를 저장하기 어렵다.
- 데이터의 추가, 삭제가 빈번한 경우 처리하기 어렵다.
- 배열의 단점
컬렉션에 자료 형이 다른 것도 담을 수 있다.
컬렉션은 동적인 배열로써 자료의 추가, 삭제하기가 용이하다.
데이터를 담는 것만큼 혹은 데이터를 삭제하는 것 만큼 크기가 줄어들거나 늘어난다.
종류
java,util 클래스에 인터페이스로 존재
Set
- 중복된 자료 허용 x
- 객체.add : 데이터 담는 메소드
- 종류
- HashSet : 순서 무시
- LinkedHashSet : 순서 유지
- TreeSet : 사전 식으로 정렬, 일이 가장 많은 set으로 꼭 정렬이 필요한 경우에만 사용하는 것이 좋음
List
중복된 자료 허용
예전에는 Vector을 많이 사용하였으나 최근에는 ArrayList를 가장 많이 사용한다
메소드
- 객체.get(index) : 해당 리스트의 인덱스 위치한 인자 가져옴
- 객체.remove : 해당 리스트의 인덱스 위치한 인자 지움
- 객체.add(index, 추가할 인자) : 해당 리스트의 인덱스에 해당 인자 추가됨
종류
ArrayList
- 중복을 허용하며 순서 유지
- 동작 방식 : 기차 처럼 연결되어 있다. 칸에 하나씩 들어가 있는 꼴이다. 내부적으로는 배열처럼 동작한다. 추가할 데이터가 천 개가 있다면 천 개만큼 루프(반복문)가 돌아야 한다.
LinkedList
- ArrayList와 사용법이 동일하다.
- 데이터 구조가 연속된 메모리가 아니다.
- 메모리의 주소를 가리키는 방식
ArrayList와 LinkedList 차이 : 사용하는 방법은 둘다 동일하지만 내부적으로 동작하는 것이 다르다. 자료의 중간에 추가 삭제가 빈번할 경우에는 LinkedList가 더 용이하다.(효율성이 좋다)
- Map
- 데이터에 접근하기 위해서 인덱스가 아닌 key에 의해서 접근하는 방식이다.
- key와 value가 한 쌍으로 이루어지는 자료 구조
- 인덱스보다 키로 접근하는 것이 더 직관적일 수 있다. 이러한 키로 자료구조를 만드는 자료형이 map이다.
- key의 중복을 허용하지 않는다.
- 키가 중복이 되고 값 다시 입력시 원래 있던 키를 반환하되 값을 변경한다.
- 중복된 key에 값을 추가하면 원래의 데이터를 반환하고 value를 새로운 값으로 변경한다.
- 존재하지 않는 key의 값을 요구하면 null 반환
- 메소드
- 객체.put(key,value) : 키와 값 입력
- 객체,put(key) : 객체에서 해당 키에 해당되는 값 가져옴
- 종류
- HashMap: 입력한 순서를 유지하지 않는다.
- LinkedHashMap: 입력한 순서를 유지한다.
- TreeMap: key를 기준으로 정렬
Tips
- 문제 해결은 반복문과 선택문의 조합으로 이루어진다.
- 버그 : 논리적인 오류
- eclipse에서 main 메소드의 매개변수인 String[] args 활용해서 콘솔처럼 실행하기
- Run configurations - Arguments - program arguments
- unreachable catch : 해당 catch에 도달할 리 없다.
- 클래스 명 바꾸기 : 바꾸고 싶은 클래스 오른쪽 클릭 - Refactor - rename
- 에러변수(e).getMessage로 어떤 부분에서 에러가 발생했는지 알 수 있다.
- unhandled exception : 예외처리가 안되어 있다.
'Back-End > JAVA' 카테고리의 다른 글
[JAVA] Thread (0) | 2022.04.13 |
---|---|
[JAVA] GUI(Graphical User Interface) (0) | 2022.04.12 |
[JAVA] 상속성 & 문자열 처리 (0) | 2022.04.07 |
[JAVA] Keyword와 객체 지향 프로그래밍의 다형성 (0) | 2022.04.06 |
[JAVA] method 호출 방식과 객체 지향 프로그래밍의 상속성 (0) | 2022.04.05 |