Java-컬렉션, 예외처리

3 분 소요

컬렉션

  • 컬렉션 종류
    • List (인터페이스) : 순서가 있는 데이터 집합을 의미 (ArrayList, LinkedList, Stack로 List인터페이스 구현), 데이터의 중복을 허용한다.
    • stack (클래스) : 순서가 있는 데이터집합을 LIFO(후입선출법)방식으로 관리하는 자료구조
    • queue (인터페이스) : 순서가 있는 데이터집합을 FIFO(선입선출법)방식으로 관리하는 자료구조(LinkedList클래스로 구현함)
    • set (인터페이스) : 순서가 없는 데이터 집합 / 중복을 허용안함 (Hashset으로 구현)
    • map (인터페이스) : 사전과 같은 자료구조, key와 value값으로 구성된 데이터들의 집합

      key value
      firstname gildong
      lastname hong
      location seoul

ArrayList - 클래스

  • ArrayList 클래스
    • 데이터가 삽입, 삭제될 때마다 새로운 배열 생성.
    • 검색이 많이 발생하는 자료는 ArrayList 자주 씀.
    • 컬렉션 중 가장 많이 사용되는 클래스
    • 기존의 Vector 클래스를 개선한 클래스
    • 비효율적인 메모리 사용
  • 객체생성
      ArrayList<String> list = new ArrayList<String>();
    
  • 메소드 종류
      //리스트에 자료 추가하기
      list.add("양파");
      list.add("양파");
      list.add("양파");
      //리스트의 특정 인덱스 자료 삭제하기
      list.remove(1);
      //해당 인덱스 값 가져오기.
      list.get(0);
      //해당 인덱스값을 뒤의 문자열로 수정
      list.set(1, "상추");
    

LinkedList - 클래스

  • LinkedList클래스
    • 데이터가 삽입, 삭제될 때마다 해당 칸만 추가/삭제하고 기억하고 있는 위치만 변경
    • 수정이 많이 일어나는 자료는 LinkedList 자주 씀.
    • 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.
    • 데이터가 많을수록 접근성이 떨어짐.

ArrayList vs LinkedList

  1. 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
  2. 중간 데이처를 추가/삭제하는 경우는 LinkedList가 ArrayList보다 빠르다.

Stack - List인터페이스를 구현하는 클래스

    class Coin {
            private int value;
            public Coin(int value) {
                    super();
                    this.value = value;
            }
            public int getValue() {
                    return value;
            }
            public void setValue(int value) {
                    this.value = value;
            }
    }
  • 객체생성
      Stack <Coin> coinBox = new Stack <Coin>();
    
  • 메소드 종류
      //스텍에 객체 넣기
      coinBox.push(new Coin(500));
      coinBox.push(new Coin(600));
      coinBox.push(new Coin(800));
      //스텍에서 객체 꺼내오기
      coinBox.pop();
    

Queue - 인터페이스 - LinkedList클래스로 구현

  • 이건 참조할 클래스 예시 (stack내용 아님)
      class Msg {
              String command;
              String to;
              public Msg(String command, String to) {
                      super();
                      this.command = command;
                      this.to = to;
              }
      }
    
  • 객체생성
      Queue<Msg> msgQueue = new LinkedList<Msg>();
    
  • 메소드 종류
      //큐에 객체 넣기
      msgQueue.offer(new Msg("sendMail", "김명관"));
      msgQueue.offer(new Msg("sendSMS", "김유민"));
      msgQueue.offer(new Msg("sendKAKAO", "김정욱"));
        
      msgQueue.peek(); //-> 큐에서 객체를 하나 가져옴, 객체를 큐에서 제거는 안함.
      msgQueue.poll(); //-> 큐에서 객체를 하나 가져옴, 객체를 큐에서 제거.
    

Set - 인터페이스 - HashSet클래스로 구현

  • 객체생성
      Set<String> set = new HashSet<String>();
      Set<String> set2 = new HashSet<String>();
    
  • 메소드 종류
      //셋에 데이터 넣기
      set.add("우유");
      set.add("우유");
      set.add("머핀");
      set.add("우유");
      set.add("커피");  // 이렇게 넣어도 셋에는 우유,머핀,커피 이 3가지만 저장됨
        
      //합집합
      set.addAll(set2); //set과 set2의 합집합이 있는지없는지 boolean값을 리턴, 그리고 그 합집합을 set에 저장
        
      //교집합
      set.retainAll(set2); //set과 set2의 교집합이 있는지없는지 boolean값을 리턴, 그리고 그 교집합을 set에 저장
    

Map - 인터페이스 - HashMap클래스로 구현

  • 객체생성
      Map<String, Integer> score = new HashMap<String, Integer>();
    
  • 메소드 종류
      //맵에 데이터 넣기
      score.put("kim", 96);
      score.put("hong", 86);
      score.put("park", 92);
    
  • set으로 넣어서 for문 돌려 다 순회해보기
      for (Map.Entry<String, Integer> e : score.entrySet()) {
        if (e.getValue() > maxScore) {
         maxScore = e.getValue();
          name = e.getKey();
           }  // 제일 큰 수 찾기 
      totalScore += e.getValue();
      }
      int avgScore = totalScore / score.size();
       System.out.println("평균 : " + avgScore);
       System.out.println("최고점수 : " + maxScore);
       System.out.println("최고점수득점자 : " + name);
    

예외처리

  • 예외 vs 에러
    • 에러 → 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생. JVM실행에 문제가 생김, 에러 대체 불가
    • 예외 → 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 발생하는 오류 → 이걸 해결하는게 예외처리
  • 예외의 종류
    • 일반예외 (Execption) - 컴파일러 체크 예외 : 컴파일과정에서 예외처리 코드 검사, 문법오류
    • 실행예외 (Runtime Execption) - 컴파일과정에서 예외처리 검사 안함, 문법오류없지만 실행은 x, 개발자의 경험에 의해서 처리, 실행예외에 대한 예외처리 코드가 없는 경우 해당예외가 발생하면 프로그램은 비정상 종료
  • 실행예외
    • NullPointerException → 객체가 없는 상태에서 객체를 사용하려고하면 발생하는 예외
    • ArrayIndexOutBoundsException → 배열에서 인덱스 범위를 초과하여 사용할 경우
    • NumberFormatException → 문자열을 숫자로 변환하려고 할 때 숫자로 변환할 수 없는 문자가 포함되어 있으면 발생
    • ClassCastException → 타입변환(상위→하위, 인터페이스→구현) 시 관계가 없는 타입으로 억지로 변환하려고 할 때 발생
  • 예외처리방법
    1. 예외가 발생했을 때 그 자리에서 프로그램의 갑작스러운 종료를 막고 정상실행을 유지할 수 있도록 처리하는 코드 (try-catch문)
        try {
      // 예외가 발생가능한 코드들
        } catch (Exception e) {
      // 예외가 발생하면 다 잡아줌 - 그러나 어떤 예외인지 알 수 없음
        } catch (ArrayIndexOutOfBoundsException e) {  
          // 해당 예외만 잡아줌                     
        } finally {
          //finally안에 있는 코드는 try블록이 끝나면 무조건 실행됨
          //예외가 발생하든 안하든 항상 실행되어야하는 코드는 finally에 넣을 수 있음
        }
      
    2. finally 는 무조건 실행!! 아무리 return이 있어도!
        public class FinallyTest {
           public static void main(String[] args) {
                   method();
           }
           public static void method() {
                   try {
                           System.out.println("메소드가 호출되었습니다.");
                           return;
                   } catch (Exception e) {
                           // TODO: handle exception
                           e.printStackTrace();
                   } finally {
                           System.out.println("메소의 finally블록이 실행되었습니다.");
                   }
           }
        }
      
    3. 니가 호출할 메소드가 예외를 가지고 있어.. 라고 미리 알려주는 방법
        class DivideByZeroException extends ArithmeticException{
           public DivideByZeroException() {
                   super("0으로 나눴을 때 발생하는 예외");
           }
        }
        public class DivideByZeroExceptionTest {
           public static void main(String[] args) {
                   try {
                           System.out.println(div(8,0));
                   } catch (DivideByZeroException e) {
                           e.printStackTrace();
                   }
           }
           public static double div(int x, int y) throws DivideByZeroException{
                   if (y==0) {throw new DivideByZeroException();}
                   return  x/y;
           }
        }
      

카테고리:

업데이트:

댓글남기기