본문 바로가기
부트캠프/백

11.10 enum, 제네릭, 예외, 컬렉션 프레임워크

by 티코딩 2022. 11. 14.

ㅇ enum(enumerated type) -- 열거형

여러 상수들을 보다 편리하게 관리할수 있게 한다. 보통 상수형은 final을 붙혀 선언가능함. 

열거형은 여러가지 변하지 않는 값들을 다루는데 사용함.

상수명이 중복되는 문제는 인터페이스로 해결 가능하지만, 타입안전성이라는 문제가 생긴다.

interface Seasons{
    int SPRING = 1, SUMMER = 2, FALL = 3, WINTER = 4;
}
interface Frameworks{
    int DJANGO = 1, SPRING = 2, NEST = 3, EXPRESS = 4;
}

코드가 이렇게 되면 Seasons의 SPRING과 Frameworks의 SPRING은 다른개념이다.

이 문제를 해결하기 위해선 서로 다른 객체로 만들어줘야 한다.

class Seasons{
    public static final Seasons SPRING = new Seasons();
    //...
}
class Frameworks{
   public static final Frameworks SPRING = new Frameworks();
   // ...
}

 

 

이렇게되면 코드가 길어지므로 enum을 사용해준다.

enum Seasons{SPRING,SUMMER,FALL,WINTER};
enum Frameworks{DJANGO,SPRING,NEST,EXPRESS};

 

 

 

 

 

ㅇ 열거형의 사용

enum 열거형이름 {상수명1, 상수명2, . . .};

접근방법은 << 열거형이름.상수명 >>

 

ㅇ 제네릭

이해하는데 굉장히 오래걸렸다. 그리고 100프로 이해한것도 아닌듯하다.

일단 제네릭이란, 클래스나 메서드 작성할때, 타입을 추후에 지정할 수 있도록 일반화 해두는 것이다.

class Basket<T> {
    private T item;
}

T를 임의의 타입으로 사용할 수 있다. 만약 여러개사용하려면

class Basket<T,V> {
    private T item;
}

<>안에 추가해주면 된다.

제네릭 클래스에서 타입 매개변수를 임의의 타입으로 사용하는데, 클래스 변수(static)에는 사용불가.

타입 매개변수에 치환될 타입으로 기본타입을 지정할 수 없음. 그래서 래퍼클래스를 써야함.(String,Integer etc)

Basket<String> basket1 = new Basket<String>("Hello");
Basket<Integer> basket2 = new Basket<Integer>(10);

ㅇ 제네릭 메서드

클래스 전체를 제네릭선언할 수 있지만, 클래스 내부의 특정 메서드만 제네릭으로 선언 가능하다. 제네릭 메서드의 타입 매개변수선언은

반환타입 앞에서 이뤄짐

class Basket<T>{    //여기의 T와
    public <T> void add(T element){ . . . } //여기의 T는 다르다.
}

저 T들이 서로 다른 이유는 타입 지정시점이 다르기 때문. 클래스의 T는 클래스가 인스턴스화 될때, 메서드의T는 메서드가 호출될때.

메서드에선 static메서드에서 사용가능!

 

ㅇ 와일드카드

어떤 타입으로든 대체될수있는 타입 파라미터

<? extends T>  아래로 -- 상한제한 : 하위클래스타입만 타입파라미터로 

<? super T>  위로 -- 하한제한 : 상위클래스만 타입 파라미터로

<?>  모든 클래스 타입 파라미터로 받기 가능!

 

ㅇ 예외처리

코딩하다 생기는 에러에 대응할 수 있는 코드를 미리 작성해 비정상적인 종료 방지한다.

에러의 종류로 컴파일에러 - 프로그램 실행전 IDE에서 미리 알려주는 오류

런타임 에러 - 런타임시 발생함.

예외와 에러도 다르다. 예외는 수정 가능한 가벼운 오류고 에러는 복구하기 힘든정도의 오류.

 

ㅇ 예외 클래스

자바에선 예외가 발생하면 예외 클래스로부터 객체 생성 후 해당 인스턴스를 통해 예외처리한다.

Object -> Throwable -> Exceptions -> RuntimeExceptions, Other Exceptions

 

ㅇ try-catch문

try{
        //예외발생 가능성 있는 코드 삽입
        }
        catch (ExceptionType1 e1) {
        //ExceptionType1 유형의 예외 발생 시 실행할 코드
        }
        catch (ExceptionType2 e2) {
        // ExceptionType2 유형의 예외 발생시 실행할 코드
        }
        finally {
        //finally블럭은 옵셔널, 예외발생여부와 상관없이 실행

 

기본구조는 이렇고, catch블럭은 여러종류의 예외 처리가능하므로 여러개 사용 가능

 

ㅇ 예외 던지기

try-catch문 외에 예외를 호출할 곳으로 떠넘긴다. throws 를 사용함.

void ExampleMethod() throws Exception{
}

 

ㅇ컬렉션 프레임워크

정말 어려운 개념이었다. 어려운만큼 중요하다고 한다. 반복적으로 봐야할 개념이다.

컬렉션이란 데이터들의 집합이고, 컬렉션 프레임워크는 컬렉션을 다루기에 편한 메서드들을 정의해놓은 것.(주로 List, Set, Map제공)

 

ㅇ List

List중 자주쓰이는 두가지

ArrayList 클래스 - 객체를 추가하면 객체가 인덱스로 관리됨. 배열과 비슷하지만 배열과 다르게 자동으로 저장용량 늘어나고

데이터가 연속적으로 저장됨. 

//ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);
    ArrayList<String> container1 = new ArrayList<String>();    // 기본 초기저장용량은 10으로 저장됨

LinkedList 클래스 - 데이터를 효율적으로 추가, 삭제, 변경 하기 위해 사용함.

둘의 차이 - ArrayList : 데이터의 순차적인 추가,삭제 용이함. 하지만 중간에 데이터 추가하거나 삭제 비효율적

LinkedList : 중간에 데이터 추가 삭제 효율적. 고로 잦은 변경필요하면 LinkedList, 데이터 개수 변하지 않으면 ArrayList

 

ㅇ Iterator

반복자. 컬렉션 순회기능을 한다. iterator()를 호출하면, iterator타입의 인스턴스가 반환된다.

while 이나 for문이랑 같이 쓰인다.

ArrayList<String> list = …;
    Iterator<String> iterator = list.iterator();

    while(iterator.hasNext()) {
    String str = iterator.next();
    }

각 컬렉션들의 메서드는 검색해서 알아보자.

 

ㅇ Set

Set은 집합이다. 중복된값 허용하지 않고, 저장 순서를 유지하지않음.

HashSet, TreeSet이 자주 사용된다.

HashSet - Set의 대표적인 클래스. 고로 중복x, 저장순서 유지x

TreeSet - 이진 탐색트리, 중복x,저장순서x, 오른쪽에 부모보다 큰값,왼쪽에 작은값 저장.

 

ㅇ Map

키와 값으로 구성된 객체를 저장함. 이 객체는 Entry객체라고함.

키는 중복될수 없고 값은 중복저장이 가능함.

HashMap, HashTable이 주로 사용됨

 HashMap<String, Integer> map = new HashMap<>();
// Entry 객체 저장
        map.put("피카츄", 85);
                map.put("꼬부기", 95);
                map.put("야도란", 75);
                map.put("파이리", 65);
                map.put("피존투", 15);
HashTable<String, String> map = new Hashtable<String, String>();

    map.put("Spring", "345");
            map.put("Summer", "678");
            map.put("Fall", "91011");
            map.put("Winter", "1212");

 

 

 

'부트캠프 > ' 카테고리의 다른 글

11.14 Annotation, Lambda, Stream  (0) 2022.11.14
11.11 컬렉션 연습문제  (0) 2022.11.14
11.8 다형성 추상화  (0) 2022.11.09
11.7 상속, 캡슐화  (0) 2022.11.07
11.4 생성자,this, this()  (0) 2022.11.07