본문 바로가기
코딩/JAVA

23.02.03 예외처리, 래퍼클래스, 컬렉션프레임워크

by Leedius 2023. 2. 6.

예외처리

개발자가 프로그램을 작성하는 과정에서 실수를 하거나 사용자가 잘못된 값을 입력하면

오류가 발생 할 수 있다. 다양하게 발생하는 오류 중 개발자가 해결할 수 있는 오류를

'예외(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) - 자료를 순서대로 차곡차곡 저장하고 자료를 꺼낼 때는 처음에 들어간 데이터 부터 꺼내는 방식

 

 

 

참고 : https://crazykim2.tistory.com/558

'코딩 > 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

댓글