[JAVA] 컬렉션(열거형, 제네릭, 예외 처리)

승 아·2023년 3월 9일
0

열거형(Enum)

  • 서로 연관된 상수들의 집합
    enum 열거형이름 { 상수명1, 상수명2, 상수명3, ...}

특징

  • 여러 상수들을 보다 편리하게 선언하고 관리할 수 있게함

  • 상수명의 중복을 피함

  • 타입에 대한 안정성을 보장

  • 관례적으로 대문자

  • 각각의 상수들에는 따로 값을 지정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당되어 각각의 상수를 가리킴

    enum Seasons {
    SPRING, //정수값 0 할당
    SUMMER, //정수값 1 할당
    FALL, //정수값 2 할당
    WINTER //정수값 3 할당
    }

열거형의 필요성

기존에는 public static final을 통해 전역변수로 상수를 설정

public static final int SPRING =1;

상수 이름이 중복되는 문제는 인터페이스를 사용함으로써 해결 가능하지만 타입 안정성이라는 문제 생김->의미적으로 다른 개념을 같게 인식하는 경우

if (Seasons.SPRING == Frameworks.SPRING)

제네릭(Generic)

제네릭이란 클래스나 메서드의 코드를 작성할 때, 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정할 수 있도록 일반화해두는 것을 말한다.
즉, 단 하나의 클래스만으로 모든 타입의 데이터를 저장할 수 있는 인스턴스를 만들 수 있다.

  • 클래스 변수에는 타입 매개변수를 사용할 수 없음->클래스 변수는 공유하는 성질을 갖고 있기 때문

    class Pocket {
    private T item1; // O
    static T item2; // X
    }

  • 타입 매개변수에 치환될 타입으로 기본 타입을 지정할 수 없음->래퍼클래스 활용

  • 다형성을 적용할 수 있음

래퍼 클래스(Wrapper class) : 프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스

  • 기본타입 래퍼클래스
    byte Byte
    short Short
    int Integer
    long Long
    float Float
    double Double
    char Character
    boolean Boolean

  • 박싱(Boxing) : 기본타입->래퍼클래스 인스턴스 변환과정

  • 언박싱(UnBoxing) : 래퍼 클래스 인스턴스에 저장된 값 -> 기본 타입의 데이터로 꺼내는 과정

제한된 제네릭 클래스

  • 특정 클래스를 상속받은 클래스만 타입으로 지정할 수 있도록 제한하는 것뿐만 아니라, 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한할 수도 있다. (extends 키워드 사용)

    class Pocket {
    private T item;
    }
    특정 클래스를 상속받으면서 동시에 특정 인터페이스를 구현한 클래스만 타입으로 지정할 수 있도록 제한->&를 사용

제네릭 메서드

  • 클래스 전체가 아닌 클래스 내부의 특정 메서드만 제네릭으로 선언

    class Pocket {
    ...
    public void add(T element) {
    ...
    }
    }
    제네릭 메서드의 타입 매개변수는 제네릭 클래스의 타입 매개변수와 별개의 것이다. 이는 타입이 지정되는 시점이 다르기 때문이다.
    클래스명 옆에 선언한 타입 매개변수는 클래스가 인스턴스화될 때 타입 지정
    제네릭 메서드의 타입지정은 메서드가 호출될 때 이루어짐

    static 메서드에서도 선언하여 사용 가능

와일드카드

  • 어떠한 타입으로든 대체될 수 있는 타입 파라미터,기호 ?로 와일드카드를 사용
  • 일반적으로 extends와 super 키워드를 조합하여 사용

예외 처리(Exception Handling)

예외처리는 예기치 않게 발생하는 에러에 대응할 수 있는 코드를 미리 사전에 작성하여 프로그램의 비정상적인 종료를 방지하고, 정상적인 실행 상태를 유지하기 위해 사용된다.

에러는 발생 시점에 따라 컴파일 에러(Compile Time Error), 런타임 에러(Run Time Error)로 구분할 수 있다.

컴파일 에러

  • 컴파일 할 때 발생하는 에러로, 문법적 문제를 가리키는 신택스 오류로부터 발생하여 신택스 에러라고 불림
  • 자바 컴파일러가 오류를 감지하여 사용자에게 알려줘서 수정할 수 있음

런타임 에러

  • 런타임 시 발생하는 에러로, 프로그램이 실행될 때 만나게 되는 에러
  • 개발자가 컴퓨터가 수행할 수 없는 특정한 작업을 요청할 때 발생
  • 자바 가상 머신(JVM)에 의해 감지된다.

자바에서는 코드 실행(run-time) 시 잠재적으로 발생할 수 있는 프로그램 오류를 크게 에러(error)와 예외(exception)으로 구분한다.

에러

  • 한번 발생하면 복구하기 어려운 수준의 심각한 오류
  • 메모리 부족(OutOfMemoryError), 스택오버플로우 (StackOverflowError) 등

예외

  • 잘못된 사용 또는 코딩으로 인한 상대적으로 미약한 수준의 오류로서 코드 수정 등을 통해 수습이 가능한 오류

  • 모든 예외의 최고 상위클래스는 Exception 클래스이고, Exception클래스는 일반 예외 클래스와 실행 예외 클래스로 나눌 수 있음

    • 일반 예외 클래스(Exception) : RuntimeException 클래스와 그 하위 클래스를 제외한 모든 Exception 클래스와 그 하위 클래스,
      컴파일러가 코드 실행 전에 예외 처리 코드 여부를 검사 O
    • 실행 예외 클래스(Runtime Exception) : RuntimeException 클래스와 그 하위클래스,
      컴파일러가 코드 실행 전에 예외 처리 코드 여부를 검사 X

자바에서 예외 처리는 try - catch 블럭을 통해 구현

try {
// 예외가 발생할 가능성이 있는 코드
}
catch (ExceptionType1 e1) {
// ExceptionType1 유형의 예외 발생 시 실행할 코드
}
finally {
// 예외 발생 여부와 상관없이 항상 실행
}

예외 전가

  • 예외를 호출한 곳으로 다시 예외를 떠넘기는 방법

반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
...
}

예외를 의도적으로 발생시키기

  • throw 키워드를 사용하여 의도적으로 예외를 발생시킴
profile
개발 공부를 기록하는 공간

0개의 댓글

관련 채용 정보