본문 바로가기
공부기록

4월 21일 Java - 예외 처리2, 컬렉션 프레임워크

by project100 2023. 4. 21.

메소드로부터 값을 전달받는 방법

1. return

2. 멤버필드 활용

3. 예외 객체의 메시지

 

예외사항 처리를 활용한 메시지(문자열) 전송

Exception 클래스를 상속받아 새로운 예외사항 객체를 만들 수 있는데, 이 객체에 메시지를 담아서 던지면(throw) 메시지를 전달하는데 활용할 수 있다.

throw 명령어 - 예외 인스턴스를 전송하는 명령어

 

public class ThrowExceptionEx {
    public static void main(String[] args) {
        int res = 0;
        String rstr = null;
        try {
            res = method1(10, 0);
            rstr = "결과 : " + res;
        } catch (MessageException e) {
            rstr = e.getMessage();
        }

        System.out.println(rstr);

        try {
            ecMethode();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    static int method1(int a, int b) throws MessageException {
        int r = 0;
        try {
            r = a / b;
        } catch (Exception e) {
            throw new MessageException("0으로 나눌 수 없습니다.");
        }
        return r;
    }

    static void ecMethode() throws Exception {
        // 예외사항 인스턴스 생성 시 메시지를 삽입
        Exception ex = new Exception("보낼 메세지");
        // 예외사항 전송
        throw ex;
    }
}

// 상속
// 메시지 전송을 목적으로 하는 예외객체(예외가 아님)
class MessageException extends Exception {
    public MessageException(String msg) {
        super(msg);
    }
}

Collection Framework(CF, 컬렉션 프레임워크)

Collection : 데이터 처리용 여러 객체를 모아 놓은 것(최상위 인터페이스)

Framework : 정형화된 프로그래밍 도구 = 라이브러리

 

java.util 패키지 소속 클래스 및 인터페이스 집합

 

핵심 인터페이스

1. List : 순서가 있는 객체의 집합을 정의하기 위한 인터페이스

순서로 구별되기 때문에 중복을 허용한다.

구현클래스 - ArrayaList, LinkedList, Stack, Vector, Queue 등

2. Set : 순서가 없이 모아놓은 객체의 집합을 정의하기 위한 인터페이스.

중복을 허용하지 않는다. 마지막 입력값으로 덮어쓴다.

구현클래스 - (순서가 없기 때문에 구별하기 위해서 해시함수 이용) HashSet, TreeSet 등

3. Map : 키 key와 값 value의 쌍으로 구성되는 데이터 집합을 정의하기 위한 인터페이스(사전형태)

키는 중복을 허용하지 않으나, 값을 중복을 허용.

구현클래스 - HashMap, TreeMap, HashTable(표형태), Properties 등

 

예) 이미 완성되어 있는 클래스, 어떤 데이터를 넣을지 알 수 없지만 클래스를 만들 수 있다.

추상화 어떤 것이 될지 모르지만 만드는 것이 비슷, 다형성x

실제로 처리되어야 할 데이터의 형태로 바뀌어야 하기 때문에 제네릭스를 사용

ArrayLIst<String> strArry = new ArrayList<>(); 문자열 저장

ArrayList<Integer> intArray = new ArrayList<>(); 정수 저장 

ArrayList<Object> objArray = new ArrayList<>() 뭐든지 저장 가능

 

제네릭스(Generics)

클래스 코드 작성 시 자료형을 지정하지 않고, 컴파일(클래스 사용) 시 자료형을 체크하여 지정하는 기능

 

장점 : 객체 자료형의 안정성을 높이고, 형 변환의 번거로움을 줄여준다.

 

import java.util.ArrayList;

public class GnericsEx {
    public static void main(String[] args) {
        Book b1 = new Book();
        b1.name = "우동 한 그릇";
        b1.price = 10000;

        Cloth c1 = new Cloth();
        c1.brand = "나이키";
        c1.size = "M";
        c1.kind = "티셔츠";

        Box box1 = new Box();
        box1.setItem(b1); // 책 상자

        Box box2 = new Box();
        box2.setItem(c1); // 옷 상자

        // 여기는 다른 메소드라고 가정
        // 책을 꺼내서 사용
        Object obj = box1.getItem();
        if(obj instanceof Book){
            // 형변환하는 것과 동일
            Book b2 = (Book) obj;
        } else if(obj instanceof Cloth){
            Cloth c2 = (Cloth) obj;
        }

        //-------------------------
        //제네릭스 박스를 이용, 형변환을 하지 않아도 사용 가능
        Gbox<Book> box3 = new Gbox<>();
        Gbox<Cloth> box4 = new Gbox<>();
        box3.setItem(b1);
        box4.setItem(c1); // 옷만 가능, 책X

        Book b3 = box3.getItem();
        Cloth c3 = box4.getItem();

        ArrayList<Book> bList = new ArrayList<>();
        bList.add(b1);
    }
}

// Object를 상속 받음
class Book {
    String name;
    int price;
}

class Cloth {
    String brand;
    String size;
    String kind;
}

// 다형성을 활용하여 어떤 인스턴스라도 저장 가능한 객체 생성
class Box {
    private Object item;

    public Object getItem() {
        return item;
    }

    public void setItem(Object item) {
        this.item = item;
    }
}

// 제네릭스를 활용한 Box 클래스
class Gbox<T> {
    private T item;
    public T getItem(){
        return item;
    }
    public void setItem(T item){
        this.item = item;
    }
}

각 인터페이스 별 핵심 클래스(보편적으로 많이 사용하는 클래스)

1. ArrayList - 배열 형식으로 저장하는 객체 목록 클래스, 순서가 존재, 중복된 객체 저장 가능

2. HashSet - 해시 코드를 사용하여 객체를 배치, 순서가 없음. 중복된 객체 저장 불가, 

순차적으로 사용해야 할 경우 iterator(순서를 부여하는) 구조체로 변환

저장할 객체에 equals 메소드를 재정의(override)해야 한다.

equals 메소드 : Object 클래스의 추상 메소드

String에서는 equals로 문자열의 실제 값을 비교하는 데 사용

3. HashMap - 해시코드를 사용하여 객체를 배치, 키(숫자나 문자열)와 값(객체)의 쌍으로 객체를 저장

 

Iterator 인터페이스

Collection의 순차적인 접근 방법을 제공하는 인터페이스

Set의 경우 비순차적으로 저장하기 때문에, Iterator를 활용

 

Iterator의 메소드

1) hasNext() : 처리할 원소가 있는지 여부 확인, 처리할 원소가 있으면 true, 없으면 false(While에서 활용)

2) next() : 해당 순번의 원소를 가져오는 메소드

3) remove() : 가져온 원소를 삭제

package setex;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetEx {
    public static void main(String[] args) {
        // 정수형 집합
        Set<Integer> iSet = new HashSet<>();
        // 집합에 데이터 입력 : add(값)
        iSet.add(1);
        iSet.add(2);
        iSet.add(3);
        iSet.add(4);
        iSet.add(5);
        System.out.println(iSet);
        System.out.println("원소 개수 : " + iSet.size());

        // 순서대로 출력되기도 하나 보장이 되지 않는다.
        for(int a : iSet){
            System.out.print(a + " ");
        }

        // 집합의 데이터 유무 확인 메소드 : contains();
        boolean b = iSet.contains(3);
        System.out.println("\n" + b);
        // 순서가 없기 때문에 실행불가
        // int i = iSet.indexOf(3);

        // 원소의 삭제 : remove(데이터);
        // 실제 값을 넣어서 지움
        iSet.remove(5);
        System.out.println(iSet);

        // Set 원소의 순자적인 사용 : iterator로 변환 후 사용
        Iterator<Integer> iter = iSet.iterator();

        while (iter.hasNext()){
            int n = iter.next();// 원소 꺼내기
            System.out.print(n + " ");

            if(n == 3){
                iter.remove();// 원소 제거
                break;
            }
        }
        System.out.println("\n" + iSet);
    }
}