프로그래밍/Java 기초

자바 제네릭(Generics)과 컬렉션(Collections)

수니모스 2017. 11. 27. 10:17

 안녕하세요. 이번 글은 자바의 제네릭과 컬렉션에 대하여 간결하게 작성하였습니다.


1. 자바 컬렉션(Java Collections Framework)


 자바 컬렉션(Java Collections Framework)은 자료 구조를 사용하기 편하게 작성해놓은 클래스들의 집합이라고 보시면됩니다. 자료 구조를 배우려면 FIFO(First In First Out), LIFO(Last In First Out) 등으로 시작해서 여러가지 알고리즘과 head, body(data), tail 등으로 구성된 그림들을 많이 접해보셔야 할 것입니다. 자바에서는 이 모든 것을 간단하고 쉽게 사용할 수 있도록 구현되어 있습니다. 물론 위의 내용들이 필요없다는 것은 절대 아닙니다.[각주:1] 많이 알수록 편한건 어딜가나 마찬가지죠. 자바 컬렉션에는 여러가지 인터페이스와 그를 구현한 클래스, 알고리즘 등이 포함됩니다. 


2. 제네릭 (Generics)

  제네릭은 자바 1.5버전에서 추가된 내용입니다. 현재는 1.5 미만의 버전을 쓰는 곳은 없을테니(있을리가...?) 무조건 포함된다고 보시면 되겠네요. 제네릭은 특정 형식 옆에 꺽쇠 기호(<>)로 추가되며 꺽쇠 기호 안에 특정 형식(type)을 지정하여 사용합니다. 제네릭으로 형식을 지정하면 지정한 형식의 데이터밖에 입력받을 수 없습니다. 왜 자바 컬렉션과 제네릭을 같이 설명하는지는 아래의 예제를 통해 살펴보도록 하겠습니다.


package com.tistory.sunimohs.study;

import java.util.ArrayList;
import java.util.List;

public class MainClass {
  public static void main(String[] args) {
    List noGenericsList = new ArrayList();
    List<String> strList = new ArrayList<>();
    
    noGenericsList.add("aaaaaa");
    noGenericsList.add(1111);
    
    strList.add("문자다");
    strList.add("알기쉬운 문장이다");
    
    try {
      for (int i = 0; i < noGenericsList.size(); i++) {
        // 제네릭을 지정하지 않아 어떤 데이터 형식인지 판단하려면 입력된 곳을 찾아가야 알 수 있다.
        String str = (String) noGenericsList.get(i);
        System.out.println("index [" + i + "] 데이터 : " + str);
      }
    } catch (Exception e) {
      System.out.println("오류가 발생하였다네..");
    }
    
    for (int i = 0; i < strList.size(); i++) {
      String str = strList.get(i);
      System.out.println("index [" + i + "] 데이터 : " + str);
    }
  }
}


 위의 예제를 보면 제네릭을 지정하지 않은 List와 제네릭으로 String형식을 지정한 List를 각각 만들었습니다. 실행해보면 아래와 같은 결과가 나오며 제네릭을 사용하지 않은 곳은 오류가 발생함을 알 수 있습니다. 물론 예외를 발생시키기 위해 명시적으로 String 형식으로 타입 캐스팅을 하였지만 말이죠. 예제는 바로 위에 값을 저장하는 구문이 있어서 한 눈에 보이지만 코드가 길어지면 찾는 것도 많은 일이 될 것이 자명합니다(암요, 그렇고 말고요 ㅋㅋ).


index [0] 데이터 : aaaaaa
오류가 발생하였다네..
index [0] 데이터 : 문자다
index [1] 데이터 : 알기쉬운 문장이다

 제네릭을 사용하면 위와 같은 불상사를 최소화할 수 있겠죠. 제네릭은 형식 선언부에는 꺽쇠(<>)안에 특정 형식을 넣고 객체 생성시에는 꺽쇠(<>)를 비워놓아도 됩니다. 꺽쇠를 비워두면 형식 선언에서 입력된 형식이 자동으로 할당되죠. 동일한 형식을 입력하는 불필요한 반복 동작을 자바에서 최소화 시켜줍니다.

 ex) ArrayList<String> arrayList = new ArrayList<>();


3. Collections 클래스


 지난 블로그 중 배열과 관련된 글에서 Arrays 클래스를 소개한 적이 있습니다. Collections 클래스도 자바에서 제공되는 유틸리티 클래스 중 하나인데요. 마찬가지로 다양한 기능들을 제공하고 있습니다. 제 블로그에서는 역순 정렬을 하는 메소드만 실행해보도록 하겠습니다. 기타 다른 기능은 자바 docs[각주:2]에서 확인하실 수 있습니다.


package com.tistory.sunimohs.study;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsStudy {
  private List<String> strings = new ArrayList<>();
  
  public CollectionsStudy() {
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");
    strings.add("e");
    strings.add("f");
    strings.add("g");
  }
  
  public void printWithComma() {
    printWithComma(strings);
  }
  
  private void printWithComma(List<String> list) {
    System.out.print("print result : ");
    
    for(int i = 0; i < list.size(); i++) {
      String str = list.get(i);
      
      System.out.print(str);
      
      if (i + 1 < list.size()) {
        System.out.print(", ");
      }
    }
    
    System.out.println();
  }
  
  public void printReverse() {
    List<String> copyList = new ArrayList<>();
    
    for(String str : strings) {
      copyList.add(str);
    }
    
    Collections.reverse(copyList);
    
    printWithComma(copyList);
  }
}


 위의 내용처럼 CollectionsStudy 클래스를 정의하고 MainClass에 아래와 같이 코드를 입력하여 실행해 보았습니다.


    CollectionsStudy cs = new CollectionsStudy();
    
    cs.printWithComma();
    cs.printReverse();


 결과 화면은 아래와 같습니다.


print result : a, b, c, d, e, f, g
print result : g, f, e, d, c, b, a

 Collections.reverse() 메소드를 통해 매우 간단하게 역순 정렬되는 것을 확인할 수 있었습니다. 


 소스가 필요하신 분은 링크를 클릭하여 다운 받으실 수 있습니다. 


CollectionsStudy.zip



  1. 배움의 길은 끝이 없고 ... 쏼라쏼라... 하기 때문입니다. ^^; [본문으로]
  2. https://docs.oracle.com/javase/8/docs/api/ [본문으로]

'프로그래밍 > Java 기초' 카테고리의 다른 글

값 전달 방식(Call by value, Call by reference)  (0) 2017.11.30
어노테이션(Annotation)  (0) 2017.10.13