예외처리
개발자가 프로그램을 작성하는 과정에서 실수를 하거나 사용자가 잘못된 값을 입력하면
오류가 발생 할 수 있다. 다양하게 발생하는 오류 중 개발자가 해결할 수 있는 오류를
'예외(exception)', 이러한 예외가 발생했을 때 이를 적절히 처리하는것을 '예외 처리' 라고한다.
문법 설명에 대한 예제)
import java.util.Scanner;
public class Exception01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자 입력 : ");
int a = sc.nextInt();
System.out.print("숫자 입력 : ");
int b = sc.nextInt();
System.out.println(" a / b = " + (a / b));
//입력받는 것을 종료한다.
sc.close();
}
}
import java.util.Scanner;
public class Exception02 {
public static void main(String[] args) {
System.out.println("프로그램 시작~");
Scanner sc = new Scanner(System.in);
try{
//예외가 발생할 소지가 있는 코드를 작성.
System.out.print("숫자 입력 : ");
int a = sc.nextInt();
System.out.print("숫자 입력 : ");
int b = sc.nextInt();
System.out.println(" a / b = " + (a / b));
//try문에서 예외가 발생 됬을 때만 catch문 실행
} catch(Exception e){
//예외가 발생했을 때 처리 코드 작성
//예외가 발생해도 코드 끝까지 진행
System.out.println("예외가 발생 했습니다.");
//예외 발생 이유를 문자열로 리턴
System.out.println(e.getMessage());
//예외 발생 위치, 이유를 출력 -> 통상적으로 많이씀
e.printStackTrace();
}
System.out.println("프로그램 종료~");
}
}
import java.util.InputMismatchException;
import java.util.Scanner;
public class Exception03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("프로그램 시작~");
try{
//try문에서는 예외가 발생되면 그 즉시 catch문으로 이동한다.
System.out.print("숫자 입력 : ");
int a = sc.nextInt();
System.out.print("숫자 입력 : ");
int b = sc.nextInt();
System.out.println("a / b = " + (a / b));
//Exception e : 예외 발생에 대한 정보가 담기는 객체
//Exception는 모든 ""+Exception클래스의 상위 클래스
//자료형 일치 catch()에 자료형이 일치 하지않으면 오류
} catch(InputMismatchException e){
System.out.println("입력값이 이상해요.");
e.printStackTrace();
} catch(ArithmeticException e){
System.out.println("0으로 나누면 안되요.");
} finally {
//예외가 발생하든, 발생하지 않든 무조건 실행되는 코드
sc.close();
}
System.out.println("프로그램 종료~");
}
}
==========================================================================================
래퍼클래스(wrapper class)
java.lang 패키지의 클래스들 중 기본형(primitive type)변수를 감싸는 클래스들이다.
Description는 다음과 같다.
래퍼클래스의 필요성)
- 메서드에 전달된 arguments를 수정하기 위해서는 기본형 변수들을 참조형 변수로 변환해야한다.기본형 변수는 값으로 전달되기 때문이다.
- java.util 패키지의 클래스들은 참조형 변수만을 다루기 때문이다.
- CF의 자료구조인 ArrayList와 Vector는 참조형 변수만을 다루기 때문이다.
- 멀티쓰레딩에서 동기화를 지원하려면 참조형변수가 필요하다.
래퍼 클래스의 생성자)
================================================================================
컬렉션 프레임워크(Collection Framework)
많은 양의 데이터를 효율적으로 관리(쓰기, 일기)하는 기능을 제공하는
인터페이스와 클래스
컬렉션 프레임워크 종류)
- 데이터를 읽고 쓰는 방식에 따라 크게 4가지를 제공
- Set, List, Queue, Map 인터페이스
Set : 데이터에 순번이 없고(for문 불가), 중복 불가.
List : 데이터에 순번이 존재하고, 중복 가능
->List 인터페이스를 구현하여 제공하는 클래스 2종.
1. ArrayList(클래스명) : 표준 배열보다는 느리지만 배열에서 많은 조작이 필요한 경우 유용하게 사용.
List 인터페이스에서 상속받아 사용.
ArrayList는 객체가 추가되어 용량을 초과하면 자동으로 부족한 크기만큼 용량이 늘어남.
2.LinkedList(클래스명) : LinkedList란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있음.
이 클래스는 데이터가 연속된 위치에 저장되지 않고 모든 데이터가 데이터 부분과
주소 부분을 별도로 가지고 있음.
데이터는 포인터와 주소를 사용하여 연결.
각 데이터는 노드라 불리며 배열에서 자주 삽입, 삭제가 이루어지는 경우 용이하여
ArrayList보다 선호됨.
하지만 ArrayList보다 검색에 있어서는 느림.
문법 설명에 대한 예제1)
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class List01 {
public static void main(String[] args) {
//ArrayList 사용
//데이터가 여러개 저장될 수 있는 공간을 생성
//같은 자료형의 데이터만 들어갈 수 있음.
//<>안에는 저장할 데이터의 자료형을 지정.
//뒤의<>안에는 생략가능 통상적으로 생략
ArrayList<String> list1 = new ArrayList<String>();
//통상적으로 쓰는 방법 인터페이스<자료형> 객체 = new ArrayList<>();
List<String> list = new ArrayList<>();
//데이터 저장
list.add("java");
list.add("c++");
list.add("python");
list.add("python");
//데이터 삭제
//참고 index의 시작은 0이다.
list.remove(0);
//데이터 읽기
list.get(0);
System.out.println(list.get(0));
//List에 저장된 데이터의 개수
System.out.println(list.size());
//list에 저장된 모든 데이터 출력
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
System.out.println(list);
}
}
문법 설명에 대한 예제2)
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class List02 {
public static void main(String[] args) {
//정수를 여러개 저장할 수 있는 list
//List의 저장될 데이터의 자료형으로 기본 자료형은 불가
//기본 자료형은 래퍼클래스를 사용
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(5);
list.add(100);
}
}
문법 설명에 대한 예제3)
import java.util.ArrayList;
import java.util.List;
public class List03 {
public static void main(String[] args) {
//Man 객체가 다수 저장될 수 있는 리스트 생성
List<Man> list = new ArrayList<>();
//Man에 대한 객체 생성
Man m1 = new Man("김", 20);
Man m2 = new Man("이", 30);
Man m3 = new Man("박", 40);
//리스트에 객체 저장
list.add(m1);
list.add(m2);
list.add(m3);
//list에 저장된 모든 Man 객체의 정보 출력
for(int i = 0; i<list.size(); i++){
//list의 저장되 있는 자료형Man의 i번째 정보 출력
//get을 사용하면 toString이 실행. get()뒤에 .toString이 숨겨져 있음
System.out.println(list.get(i));
}
//복습 : 자료형 e : 반복할 배열 -> 반복할 배열에서 하나씩 빼서 e에 대입
for(Man e : list){
System.out.println(e);
}
//list에 저장된 사람들 중에 이름이 "김"인 사람을 찾아서
//그 사람의 나이를 출력하세요.
for(int i = 0; i < list.size(); i++){
//list에서 i번째 사람을 뽑아서 그 사람의 이름을 읽은뒤 "김"과 같은지 비교
if(list.get(i).getName().equals("김")){
System.out.println(list.get(i).getAge());
}
}
//list에서 사람을 차례 대로 뽑아 자료형 Man에 객체e에 대입
for(Man e : list){
if(e.getName().equals("김")){
System.out.println(e.getAge());
}
}
}
}
class Man{
private String name;
private int age;
//매개변수 값으로 초기값을 갖는 생성자
public Man(String name, int age) {
this.name = name;
this.age = age;
}
//getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString() 오버라이딩
@Override
public String toString() {
return "Man{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Stu{
//이름, 나이, 전공
private Man man;
private String major;
public Stu(String name, int age, String major) {
this.major = major;
//name이랑 age의 매개변수를 받아 Man클래스에 이름과 나이를 초기화
this.man = new Man(name, age);
}
public void showInfo(){
//전공 출력하는 코드
System.out.println("전공 : " + major);
//이름출력
System.out.println("이름 : " + man.getName());
//나이출력
System.out.println("나이 : " + man.getAge());
}
}
================================================================================
예제1)
import java.util.ArrayList;
import java.util.List;
public class Ex1 {
public static void main(String[] args) {
List<Name> list = new ArrayList<>();
Name n1 = new Name("김");
Name n2 = new Name("이");
Name n3 = new Name("나");
list.add(n1);
list.add(n2);
list.add(n3);
for(Name e : list){
System.out.println(e);
}
}
}
class Name{
private String name;
public Name(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Name{" +
"name='" + name + '\'' +
'}';
}
}
예제2)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class Ex2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 5; i++) {
System.out.print("숫자 입력 : ");
list.add(sc.nextInt());
}
int sum = 0;
for(int i = 0; i<list.size(); i++){
sum += list.get(i);
}
System.out.println("저장된 수의 총합은 : "+sum);
}
}
예제3)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Ex3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<String> list = new ArrayList<>();
for(int i = 0; i < 3; i++) {
list.add(sc.next());
}
for(int i = 0; i<list.size(); i++){
String name;
System.out.print("찾을 이름을 입력하세요 : ");
name = sc.next();
if(list.get(i).equals(name)){
System.out.println("해당 이름이 존재합니다.");
break;
}
else{
System.out.println("해당 이름이 존재하지않습니다.");
break;
}
}
}
}
예제4)
import java.util.ArrayList;
import java.util.List;
public class Ex4 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
//10개의 1~100까지의 랜덤한 수 저장
for(int i = 0; i<10; i++) {
list.add((int)(Math.random() * 100 + 1));
}
System.out.print("리스트에 저장된 모든 데이터 : ");
for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i)+" ");
}
System.out.println();
//모든 데이터 출력과 동시에 짝수의 개수 카운트
int index = 0;
System.out.print("리스트에 저장된 모든 짝수 데이터 : ");
for(int i = 0; i < list.size(); i++){
if(list.get(i)%2==0){
index++;
System.out.print(list.get(i)+" ");
}
}
System.out.println();
System.out.println("짝수의 개수는 : " + index);
}
}
==========================================================================================
기타
기본자료구조상식)
stack 구조(L.I.F.O) - 자료를 순서대로 차곡차곡 저장하고 자료를 꺼낼 때는 나중에 들어간 데이터 부터 꺼내는 방식
Queue 구조(F.I.F.O) - 자료를 순서대로 차곡차곡 저장하고 자료를 꺼낼 때는 처음에 들어간 데이터 부터 꺼내는 방식
'코딩 > JAVA' 카테고리의 다른 글
23.02.07 Map, Set (0) | 2023.02.07 |
---|---|
21.02.06 컬랙션프레임워크 (0) | 2023.02.07 |
23.02.02 String, interface (2) | 2023.02.02 |
23.02.01 상속, Object클래스, toString클래스 (0) | 2023.02.01 |
23.01.31 (method overloading, static, 상속) (0) | 2023.01.31 |
댓글