본문 바로가기
부트캠프 개발일기/Java

15일차: 컬렉션(Enum, Generic, Exception Handling)

by shyun00 2023. 3. 6.

❯ 열거형(Enum)

열거형(enum: enumerated type): 여러 상수(변하지 않는 값)들을 보다 편리하게 선언할 수 있도록 만들어진 자바 문법요소.

상수명의 중복을 피하고 타입에 대한 안정성을 보장함. switch문에서도 작동이 가능함

* switch문: 사용자 정의타입은 사용 불가

enum Seasons {SPRING, SUMMER, FALL, WINTER} // 값을 지정하지 않아도 자동으로 0부터 시작하는 정수값 할당
// 특정 상수에 접근하려면 열거형이름.상수명 으로 가능 ex. Seasons.SUMMER

❯ 제네릭(Generic)

타입을 구체적으로 지정하는 것이 아니라 타입 매개변수를 활용해 추후에 지정할 수 있도록 일반화 하는것.

작성한 클래스 혹은 메서드가 특정 타입에만 사용되지 않도록 해둔것을 의미함

제네릭 클래스

제네릭이 사용된 클래스를 제네릭 클래스라고 함. 타입 매개변수는 여러개도 사용할 수 있음

타입 매개변수는 기본타입은 지정 불가함. 래퍼 클래스(Wrapper Class)를 사용해야함.

    ⇒ 기본타입의 데이터를 객체로 취급해야할 때 이를 포장해주는 클래스.

class Person<T> { // 타입 매개변수 T 를 사용한 제네릭 클래스
  private T name;  // 인스턴스 생성시 T 타입이 적용됨
} // 타입 매개변수는 T(type), K(key), V(value), E(element), N(number), R(result)를 자주 사용

(주의) 클래스 변수(static 변수)에는 타입 매개변수를 사용할 수 없음

      -> 클래스 변수는 여러 객체가 공유하는 값인데, 타입 매개변수를 사용할 경우 인스턴스별로 변수의 타입이 바뀔 수 있음

Person<String> person1 = new Person<String>("John");
Person<String> person2 = new Person<>("Kate"); // new Person<>은 구체적 타입 생략 가능

제네릭 클래스에도 다형성 적용이 가능함

제한된 제네릭 클래스

위의 <T> 에는 어떠한 타입도 지정이 가능함.

만약 특정 클래스의 하위클래스만 지정하도록 제한하거나, 특정 인터페이스를 구현한 클래스만 타입으로 지정하도록 할 수 있음

class Person<T extends Teacher> {...} // Teacher를 상속받은 클래스만 타입으로 지정 가능
class Person<T extends Teacher & Male> {...}  // Teacher, Male을 상속(구현)한 클래스만 타입으로 지정 가능 (여러개 조건 적용시 & 사용)
// (2)의 경우 클래스명을 인터페이스명보다 앞에 작성해야함

제네릭 메서드

class Person{
    public <T> void add(T element) // 타입 매개변수 선언은 반환타입 앞에 위치함
    static <T> void setAge(T element) // 제네릭 클래스와 달리 static 메서드에도 사용 가능함

클래스 내부의 특정 메서드만 제네릭으로 선언할 수 있음. (클래스의 타입 매개변수와 다른것)

클래스 타입 매개변수는 인스턴스화될 때 타입이 지정되며, 메서드 타입 매개변수는 메서드가 호출될 때 타입이 지정됨

제네릭 메서드는 타입이 지정되기 전까지는 변수가 어떤 타입인지 알 수 없음. 따라서 String 타입 메서드처럼 특정 타입에서 사용되는 메서드는 정의 단계에서 사용 불가. 대신 모든 클래스의 상위 클래스인 Object의 메서드는 사용 가능함.

❯ 예외처리

프로그램의 비정상적인 종료를 방지하고 정상적인 실행상태를 유지하기 위해 예외처리(Exception Handling)를 해줌.

  • 컴파일 에러: 자바 컴파일러에 의해 발견됨. 오탈자 / ; 누락 / 잘못된 자료형 등 문법적 문제에서 발생하므로 Syntax Error라고도 함
          IDE 에서 밑줄로 표시되는 에러들이 해당. 비교적 쉽게 해결 가능
  • 런타임 에러: JVM에 의해 발견됨. 컴퓨터에게 수행할 수 없는 작업을 요청할 때 발생.

⇒ 프로그램 실행 시 문제를 Error 라고 명시했지만, 실제로는 Error 와  Exception(예외, 코드 수정을 통해 수습 가능)으로 구분됨. 

예외 클래스의 상속 계층

자바에서는 예외가 발생하면 예외 클래스로부터 객체를 생성하여 해당 인스턴스를 통해 예외처리를 함.

모든 예외의 최고 상위 클래스는 Exception 클래스임

  • 실행 예외 클래스(Runtime Exception): 런타임시 발생하는 예외 클래스와 그 하위클래스 (unchecked 예외)
  • 일반 예외 클래스(Exception): 실행 예외 클래스와 그 하위클래스를 제외한 모든 예외 클래스와 그 하위클래스 (checked 예외)

try-catch문

예외 처리를 통해 비정상적인 종료나 오류를 대비하는것.

try { // 예외가 발생할 가능성이 있는 코드 삽입
}
catch (ExceptionType1 e1) {
  // ExceptionType1 예외 발생 시 실행할 코드
}
catch (ExceptionType2 e2) {
  // ExceptionType2 예외 발생 시 실행할 코드
}
finally {
 // 예외 발생 여부와 관계 없이 실행할 코드. 반드시 작성해야하는 요소는 아님.
 }

이번 부분을 학습하면서 예외 처리의 중요성에 대해 생각해보게 됐다.

비즈니스 로직에서 다양한 에러(예외)가 발생할 수 있는데, 이 때 예외를 어떻게 처리하는지에 따라 프로그램의 사용성이 달라질 수 있을것같다. 코드에서 발생할 수 있는 다양한 예외상황에 대해 생각해보고 처리할 수 있는 능력을 길러야겠다.