[Day 10] Java 0408 - 내용 정리

Doyeon Kim·2022년 4월 9일
1

Java

목록 보기
12/16
post-thumbnail

🌞예외처리

  • 프로그램 실행 중에 사용자의 부주의 등으로 인하여 예기치 않는 상황이 발생하는 것을 "예외"라고 하며 이것을 처리하는 것을 "예외처리" 라고 한다.
  • 자바에서는 대부분의 예외에 대하여 이미 클래스로 만들어져 있고 그 상황이 되면 자동으로 예외 객체가 생성된다.
  • 예외처리를 위해서는 try~catch문을 이용한다.
try {
		예외가 발생할 만한 문장()
	} catch(예외자료형 변수명) { //여기서 캐치
		처리할 문장
	} catch(예외자료형 변수명) { //여기서 캐치
		처리할 문장
	} catch(예외자료형 변수명) { //여기서 캐치
		처리할 문장
	}
  • 하나의 try에 여러 개의 catch가 올 수 있다.
  • 반드시 범위가 작은 순서대로 와야 한다. (예외자료형 변수명에서 Exception이 가장 조상)

🌞finally

  • 예외가 발생하거나 예외가 발생하지 않거나 반드시 동작시켜야 할 명령어들을 두는 곳

🌞메소드에서의 예외처리

  • 메소드 안에서 직접 try~catch로 처리한다.
  • 메소드를 호출하는 쪽은 예외처리를 맡긴다.(전파한다.)
public void pro() throws 예외클래스명1, 예외클래스명2... { //여러개 전파가능
	
	예외가 발생할 만한 명령어()
	
	}
  • java.io, java.net, java,sql
  • 대부분의 생성자와 메소드들은 예외를 안고있다.

🌞RuntimeException

  • RuntimeException의 후손들은 사용자가 예외처리하지 않아도 컴파일이 가능하고, 자바가 예외처리를 해준다.
  • 필요하다면 사용자가 직접 예외처리 할 수도 있다.
  • 그러나, RuntimeException의 후손이 아닌 것들은 사용자가 직접 예외처리를 해야한다.
  • 만약, 사용자가 예외처리를 하지 않으면 컴파일이 되지 않는다.

🌞FileWriter

	public static void calcDiv(int a, int b) throws ArtithmeticException
  • ArtithmeticException이 RuntimeException이기 때문에 calDiv 메소드를 호출하는 쪽에서 예외처리를 따로 하지 않아도 컴파일된다.
public FileWriter(String fileName) throws IOException 
  • RuntimeException의 후손이 아니기 때문에 직접 예외처리를 해줘야 한다.

  • FileWriter의 생성자는 다음과 같이 예외를 포함하고 있다.

public FileWriter(String fileName) throws IOException
  • IOException은 RuntimeException의 후손이 아니기 때문에 FileWriter 생성자를 사용하는 쪽에서 반드시 IOException 예외처리를 해야 컴파일이 된다.

🌞throw와 throws

  • 자바에서는 대부분의 예외에 대하여 이미 클래스로 만들어져 있고 그 상황이 되면 자동으로 예외 객체가 생성된다.
  • 어떤 메소드에서 예외가 발생할 때에 그 메소드 안에서 예외처리를 하지 않고 메소드 호출하는 쪽으로 예외를 전파하고자 할 때 메소드 이름 뒤에 throws 예외클래스명 을 써서 전달한다.
  • 때로는 사용자가 강제로 예외를 발생시켜야 할 필요가 있다면 throw 키워드를 사용한다.(throws를 사용하면 안됨.)

throw new 예외클래스이름();

🌈throws

  • 메소드 안에서 예외가 발생이 될 때에 메소드를 호출하는 쪽으로 예외를 전파

🌈throw

  • 강제로 예외를 발생

🌞사용자 정의 예외

  • 대부분의 일반적인 예외에 대해서는 자바가 이미 클래스로 만들어 두었지만 내가 만드는 시스템에서의 특별한 예외에 대해서는 자바가 모른다.
  • 그럴 때에 사용자가 예외 클래스를 만들 수 있고, 그런 상황이 되어도 자바는 모르기 때문에 직접 예외 객체를 생성해야 한다.

🌈사용자 정의 예외 만들기

class 예외클래스명 extends Exception {
		예외클래스명(String msg) {
			super(msg);
		}
	}
  • throw new 예외클래스이름();
  • 사용자 정의 예외는 RuntimeException의 후손이 아니기 때문에 반드시 예외처리를 해야한다.

🌞자바의 컬렉션

  • 많은 양의 데이터를 처리하기 위해서는 "배열"을 이용한다.
  • 그러나 배열은 다음의 단점을 가지고 있다.
    - 배열은 자료형이 같아야 한다.
    - 배열의 크기가 고정되어 있어 처음 정해진 크기가 더 많은 데이터를 저장하기가 어렵다.
    - 데이터의 추가, 삭제가 빈번한 경우 처리하기가 어렵다.
    int []data = {10, 20, 30, 40, 50};
  • 이와 같은 단점을 보완하기 위해서는 자바에서는 더 좋은 배열을 제공한다. 그것을 "컬렉션" 이라고 한다.
  • 컬렉션은 자료형이 다른 것도 담을 수 있다.
  • 컬렉션은 동적인 배열로써 자료의 추가, 삭제하기가 용이하다.
  • 데이터를 담는 것 만큼 혹은 데이터를 삭제하는 것 만큼 자동으로 크기가 늘어나고 줄어든다.

🌞컬렉션의 종류

🌈Set

  • 중복된 자료를 허용하지 않는다.
    - HashSet: 중복을 허용하지 않고 순서를 무시한다.
    - LinkedHashSet: 중복을 허용하지 않고 순서를 유지하며 출력한다.
    - TreeSet: 중복을 허용하지 않고 사전식으로 정렬한다.

🌈List

  • 중복된 자료를 허용한다.
  • 예전에는 Vector를 많이 사용하였으나 근래에는 ArrayList를 가장 많이 사용한다.
  • ArrayList와 사용법이 동일한 LinkedList가 있다.
  • 자료의 중간에 추가, 삭제가 빈번할 경우에는 LinkedList가 더 용이하다.
    - LinkedList: 중복을 허용하고 순서를 유지한다.
    - ArrayList: 중복을 허용하며 순서도 유지한다.
    - 위의 사용방법은 둘 다 동일하지만 데이터의 추가, 삭제가 빈번한 경우에는 내부적으로 동작하는 방식이 달라서 LinkedList가 더 효율성이 좋다.

🌈Map

  • 데이터에 접근하기 위해서 인덱스가 아닌 key에 의해서 접근하는 방식이다.
  • key와 value가 한 쌍으로 이루어지는 자료구조이다.
  • key의 중복을 허용하지 않는다.
  • 만약, 중복된 키의 값을 추가하게 되면 원래의 값을 반환하고 새로운 값으로 바꾼다.
    - HashMap: 순서를 유지하지 않는다.
    - LinkedHashMap: 순서를 유지한다.
    - TreeMap: 키를 기준으로 정렬해준다.

🌞예제

🌟예제1🌟

public class DivTest07 {

	// 두 개의 정수를 매개변수로 전달받아 나누기 한 결과를 출력하는 메소드
	public static void calcDiv(int a, int b) throws ArithmeticException { // 호출하는 쪽으로 예외를 전달

		int div = a / b;
		System.out.println("나누기 결과: " + div);

	}

	public static void main(String[] args) {

		try { //여기서 처리를 해준다.
			calcDiv(9, 0);
		} catch (ArithmeticException e) {
			System.out.println("0으로 나눌 수 없어요!");
		}
	}

}

🌟(FileWriter)예제2🌟

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterTest {

	public static void main(String[] args) {

		try {
			FileWriter fw = new FileWriter("c:/temp/hello.txt"); //해당 폴더에 파일을 생성
			fw.write("hello java"); //파일 내용에 hello java가 입력되어 있다.
			fw.close();
			
			System.out.println("파일을 생성하였습니다.");
		} catch (IOException e) {
			System.out.println("예외가 발생되었습니다." + e.getMessage()); // e.getMessage를 하면 예외의 메시지를 알 수 있다.
		}
	}

}

/*
 * public FileWriter(String fileName) throws IOException
 */

//FileWriter의 생성자는 다음과 같이 예외를 포함하고 있다.
//public FileWriter(String fileName)
//throws IOException
//IOException은 RuntimeException의 후손이 아니기 때문에 사용자가 반드시 예외처리를 해야 컴파일이 된다.

🌟(사용자 정의 예외)예제2🌟

class NotFoundException extends Exception { //사용자 정의 예외(RuntimeException의 후손이 아니기 때문에 예외처리를 해줘야함)
	public NotFoundException(String msg) {
		super(msg);
	}
}

class SearchArray {
	public void search(int []arr, int data) throws NotFoundException {
		

		int i;
		for(i=0; i<arr.length; i++) {
			if(data == arr[i]) {
				break;
			}
		}
		
		if(i == arr.length) {
			throw new NotFoundException("찾고자 하는 " + data + "가 배열에 없습니다."); 
		} else {
			System.out.println("찾고자 하는 " + data + "는 배열에 " + i + "번째에 있습니다.");
		}
	
	
	}}


public class SearchArrayTest {

	public static void main(String[] args) {
		
		try {
		int []a = {10,20,30,40,50};
		SearchArray sa = new SearchArray();
		sa.search(a, 20);
		sa.search(a, 100);
		}catch(NotFoundException e) {
			System.out.println("예외발생: " + e.getMessage());
		}
	}

}

🌟(HashSet)예제3🌟

import java.util.HashSet;

public class HashSetTest {

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>(); //중복을 허용하지 않고 순서를 무시한다.
		
		set.add("사과");
		set.add("포도");
		set.add("수박");
		set.add("딸기");
		set.add("포도"); //중복된 데이터 허용하지 않는다.
		System.out.println(set);

	}

}

🌞연습문제

👑연습문제1👑

국가의 이름을 키로 하고 수도를 값으로 하여 Map에 몇 개의 (키, 값)을 저장한다. Map에 저장된 전체 데이터를 출력하고 사용자로부터 국가 이름을 받아서 수도를 찾아서 출력해본다.

import java.util.LinkedHashMap;
import java.util.Scanner;

public class Practice07 {

	public static void main(String[] args) {
		LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); // 순서를 유지한다
		map.put("USA", "Washington");
		map.put("Japan", "Tokyo");
		map.put("China", "Beijing");
		map.put("UK", "London");
		map.put("Korea", "Seoul");

		String name;
		Scanner sc = new Scanner(System.in);

		System.out.print("국가이름을 입력하세요: ");
		name = sc.next();

		System.out.println(name + "의 수도: " + map.get(name));

	}

}
profile
꾸준히 성장하는 개발자✨

0개의 댓글