컬쥐네 다락방

java - 제네릭 / 컬렉션 본문

웹 개발/Java,Spring

java - 제네릭 / 컬렉션

코딩하는 갱얼쥐 2021. 6. 2. 04:26

배경

자바의 컬렉션은 쉽게 말해서 객체들의 모음, 컨테이너입니다. 

자바의 JDK는 자료 구조들을 컬렉션으로 만들어 제공하고있다. 

컬렉션은 제네릭 기법으로 구현되어 있어서 두 개념을 공부할 필요가 있다! 

 

컬렉션

우리는 응용프로그램이 실행 중에 생겨나고 사라지는 객체들의 수를 예측하기가 어렵기 때문에 고정 크기의 배열을 사용한다면 에러가 발생할 때가 많다.

하지만 컬렉션은 이런 고정 크기의 배열이 가지는 단점을 극복하고 가변 개수의 객체(요소 Element)들을 쉽게 삽입하고 삭제하고 검색할 수있다. 들어갈 수 있는 공간이 정해진 틀이 아니라 마치 과일 바구니 같달까. ? 

 

기존 배열이 고정 크기 이상의 객체를 관리할 수 없고 배열의 중간 객체가 삭제되면 직접 자리를 옮겨줘야 했던 것과 다르게 컬렉션은 객체의 개수를 신경 쓸 필요가 없고, 중간 객체가 삭제되면 자동으로 자리를 옮겨줍니다. 

 

컬렉션을 위한 인터페이스와 클래스

컬렉션의 특징 

1. 컬렉션은 위에서 언급했듯 제네릭이라는 기법으로 구현된다.

그래서 위의 사진처럼 <E>,<K>,<V> 등이 포함되어 있다.

이들은 '타입 매개 변수'로 불리며 컬렉션의 요소를 일반화시킨 타입이다.

 

보통 구체적인 타입을 지정하면 List<String>은 스트링 값만 저장하는 리스트이고, List<Integer>은 정수 값만 저장하는 리스트이다. 하지만 특정 타입만 다루지않고 여러 타입으로 변하도록 컬렉션을 일반화 시켜 List<E> 처럼 사용한다.

그래서 E를 일반화 시킨 타입 혹은 제네릭 타입 이라고 부른다.

컬렉션은 여러 타입의 값을 다룰 수 있도록 변신이 가능한 구조이지만, 실행중에 컬렉션을 생성하고 사용할 때는 오직 한 탕비의 값만 저장하고 다룰 수 있다.

 

2. 컬렉션의 요소는 객체들만 가능하다.

int, char, double 등의 기본타입의 데이터는 컬렉션 요소로 불가능하다. 만약 기본 타입의 값이 삽입되면 자동 박싱(Auto boxing)에 의해 Wrapper 클래스로 변환되어 객체 형태로 저장한다. ex) int 를 Integer로, double을 Double로 

 

제네릭이란 ? 

제네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메소드를 타입 매개변수 를 이용하여 선언하는 기법이다. 자바의 제네릭은 클래스 코드를 찍어내듯이 생산할 수 있도록 일반화(generic)시키는 도구다.

Stack<E>클래스의 예를 들어보자. Stack<E>클래스는 제네릭 타입 <E>를 가진 제네릭 클래스이다.

Stack<E>에서 E에 구체적인 타입을 지정하면, 지정된 타입만 다룰 수 있는 구체화된 스택이 된다.

예를 들어, Stack<Integer>는 Integer 타입만 다루는 스택이 되고, Stack<Point>는 Point타입의 객체만 Push하고 pop할 수 있는 스택이 된다. 

 

제네릭 타입 매개변수

컬렉션 클래스에서 타입 매개변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용한다.

E :  Element를 의미하며 컬렉션에서 요소임을 나타냄.

T :  Type을 의미

V:   Value를 의미

K :  Key를 의미 

 

제네릭의 장점

- 동적으로 타입이 결정되지 않고 컴파일 시에 타입이 결정되므로 보다 안전한 프로그래밍 가능

- 런타임 타입 충돌 문제 방지

- 개발 시 타입 캐스팅 절차 불필요

- ClassCaseException 방지. 

 

제네릭 클래스 

제네릭 클래스 작성

타입 매개 변수 T를 가진 제네릭 클래스는 다음과 같이 선언

public class MyClass<T>{
	T val;
    void set(T a) {
    	val = a;
        }
    T get() {
    	return val;
    	}
}

제네릭 클래스 레퍼런스 변수 선언

ex) MyClass<String> s

MyClass<String> s = new MyClass<String>(); 

s.set("hello");

System.out.println(s.get());

'웹 개발 > Java,Spring' 카테고리의 다른 글

RESTful API 란?  (0) 2021.06.29
Spring MVC 란?  (0) 2021.06.14
컴파일 에러 VS 런타임 에러  (0) 2021.06.04
객체 지향 프로그래밍(OOP)이란?  (0) 2021.06.03
Java - List, Set, Map 의 차이점  (0) 2021.06.03