[Java/자바] 3. java.util 패키지, Collection, Generics

java.util 패키지

  • 자바 프로그램 개발 시 유용한 기능들을 모아놓은 패키지
  • 클래스:

    Object
        - Data
        - Calendar
        - Vector
        - HashMap
        - Formatter
        - Enumeration
        - ... etc.
        
  • 이 패키지를 이용하면 반복적으로 작성해야하는 복잡한 코드를 간단하게 구현 가능

Date 클래스

  • 형식이 있는 날짜/시간을 출력하는 클래스
  • JDK 업그레이드로 Deprecate된 메소드들도 많아졌다. Deprecate된 메소드는 호환성이 떨어지고, 이후 버전에서는 지원되지 않을 수 있으니 사용하지 않는 것이 좋다.
  • 주요 메소드

    • boolean after(Date when):when의 날짜가 현재 날짜 이후면 true, 아니면 false 반환
    • boolean before(Date when):when의 날짜가 현재 날짜 이전이면 true, 아니면 false 반환
    • int compareTo(Date anotherDate): 다른 날짜 객체와 비교하여 음수, 양수, 0 중 하나를 return
    • int compareTo(Object o): 다른 객체와 비교하여 음수, 양수, 0 중 하나를 return
    • boolean equals(Object obj): 날짜의 값을 비교하여 결과 return
    • long getTime(): 1970년 1월 1일 0시 0분 0초로부터의 시간을 1/1000초 단위로 반환
    • id setTime(long time): time의 시간을 1970년 1월 1일 0시 0분 0초로부터의 시간을 1/1000초 단위로 설정
    • String toLocaleString(): 현재의 날짜, 시간을 해당 국가에 맞는 문자열로 변환

Calendar 클래스

  • Date 클래스 처럼 이 클래스도 날짜와 시간에 관한 정보를 출력할 때 사용
  • Calendar 클래스는 추상 클래스 이므로 직접 객체 생성불가 - getInstance()메소드를 이용해 객체 생성 가능

    Calendar cal2 = Calendar.getInstance();
  • 주요 메소드

    • boolean after(Object when):when의 날짜가 현재 날짜 이후면 true, 아니면 false 반환
    • boolean before(Object when):when의 날짜가 현재 날짜 이전이면 true, 아니면 false 반환
    • boolean equals(Object obj): 날짜의 값을 비교하여 결과 return
    • int get(int field): 현재 객체의 주어진 값의 필드에 해당하는 상수 값을 return
    • static Calendar getInstance(): 현재 날짜와 시간 정보를 가진 Calendar 객체를 생성
    • Date getTime(): 현재의 객체를 Date 객체로 변환
    • long set(int field, int value): 현재 객체의 특정 필드를 다른 값으로 설정
    • void set(int year, int month, int date, int hour, int minute): 현재 객체의 년, 월, 일, 값을 다른 값으로 설정
  • 예시

    import java.util.Calendar;
    
    public class CalendarTest{
        public static void main(String[] args){
            Calendar cal = Calendar.getInstance();
            int year = cal.get(Calendar.YEAR);
        }
    }

Formatter 클래스

  • 형식화된 문자열을 출력하기 위해서 C언어의 printf()와 같은 기능의 Formatter 클래스를 제공
  • Formatter 클래스는 형식 문자열을 제공하고, 이문자열에서 지정한대로 데이터가 형식화되어 출력된다.
  • Formatter 클래스 객체 생성 과정

    //구문
    Formatter formatter = new Formatter(Appendable a);
    // - Formatter에서 형식화된 문자열을 만들었을 때 결과가 저장되는 곳
    // - Appendable인터페이스를 구현한 대표적인 클래스는 ``StringBuffer``
    
    //사용 예시
    StringBuffer sb = new StringBuffer();
    Formatter formatter = new Formatter(sb);
    //- StringBuffer클래스의 객체에 대해 Formatter를 지정하는 문장
    //- Formatter 객체에서 적용한 출력 format 결과가 StringBuffer 객체에 저장된다.
    
    // 출력 방법 - 구문
    Formatter format(String format, Object... obj)
    //String format: %로 시작하는 format 전달
    //ex) 데이터 타입별 {%B - TRUE/FALSE 형태 출력, %C - 문자열 데이터 출력, %d - 10진수 정수형 출력 등등}
    //    날짜 {%tA - 요일 출력,$tY - 4자리 년도 출력, %tB - 월 이름 출력, %tm - 01~12로 표현하는 월 출력 %tK - 0~23으로 표현하는 시 출력 등등}
    
    //Object... obj: 데이터 개수를 확정할 수 없어 가변적 매개변수 사용
    
    // 예시
    // 현재 날짜를 표현하기 위해 날짜형 형식화 인자를 사용하는 예
    StringBuffer sb = new StringBuffer();
    Formatter formatter = new Formatter(sb);
    Calendar c = Calendar.getInstance();
    
    formatter.format("현재 날짜는 %tY년 %tB월 %te일 %n", c, c, c);

기본 Collection

Vector 클래스

  • 자바는 동적인 길이로 다양한 객체들을 저장하기 위해 Vector클래스를 제공
  • Vector는 저장되는 객체들에 대한 참조 값을 저장하는 일종의 가변 길이의 배열
  • 가변 배열에는 객체만 저장이 가능하다.
  • 가변 크기로 객체의 갯수를 미리 고려할 필요가 없다.
  • 한 객체가 삭제되면 컬렉션이 자동으로 빈공간이 없게끔 자리 이동시킨다.
  • 즉, 다양한 객체들이 Vector에 저장될 수 있고, 길이도 필요에 따라 자동으로 증가된다.

생성자

  1. Vector(): 10개의 데이터를 저장할 수 있는 길이의 객체를 생성하고 저장공간이 부족한 경우 10개씩 증가
  2. Vector(int size): size개의 데이터를 저장할 수 있는 길이의 객체를 생성하고 저장공간 부족할 때 size 만큼 증가
  3. Vector(int size, int incr): size개의 데이터를 저장할 수 있는 길이의 객체를 생성하고 저장공간이 부족한 경우 incr 개 만큼 증가

주요 메소드

  • void add(int index, Object element): Vector 내의 index위치에 element 객체를 저장
  • boolean add(Object o): o 객체를 Vector 내에 저장하고 그 결과 여부를 true, false로 반환
  • void addElement(Object obj): obj객체를 Vector객체에 저장
  • int capacity(): Vector의 용량 return
  • boolean contains(Object elem): 현재 Vector에 elem의 요소가 있는지 검사하여 true/false return
  • void copyInto(Object[] anArray): Vector 내용을 Object 배열로 복사
  • Object elementAt(int index): index 위치의 객체를 return
  • Enumeration elements(): 이 Vector의 Enumeration 생성
  • void insertElementAt(Object obj, int index): index위치에 obj 삽입
  • boolean isEmpty(): Vector이 비어있는지 true, false로 return
  • boolean remove(Object o): o 객체를 찾아서 Vector에서 제거

Enumeration 인터페이스 개요

  • 객체들의 집합(Vector)에서 각각의 객체들을 한 순간에 하나씩 처리할 수 있는 메소드를 제공
  • 인터페이스이므로, 직접 new 연산자를 사용하여 객체를 생성할 수 없다.
  • boolean hasMoreElements(): Vector로부터 생성된 Enumeration의 요소가 있으면 true, 없으면 false
  • Object nextElement(): Enumeration 내의 다음 요소 반환
  • ❗️Enumeration 인터페이스에 선언된 메소드는 그 인터페이스를 사용하는 클래스로 구현해서 사용해야 한다.

    • Vector 클래스의 elements() 메소드에 의해 생성
    • Enumeration객체 내의 메소드들은 모두 Vector 클래스에서 구현되어 있다.
  • 사용 예시

    import java.util.Enumeration;
    import java.util.Vector;
    
    class EnumerationTest{
        public static void main(String[] args){
            Vector list = new Vector(5);
            list.addElement(new Integer(10));
            list.addElement(new Double(10.0));
            list.addElement(new String("hi"));
            for(int i = 0; i<list.size();i++){
                System.out.println(list.elementAt(i));
            }
            
            Enumeration e = list.elements();
            while(e.hasMoreElements()){
                System.out.println(e.nextElement());
            }
        }
    }

Stack 클래스

  • LIFO 후입선출 방식의 자료구조
  • top

    • 가장 최근에 입력된 데이터로 삽입, 삭제, 읽기 동작이 발생
    • 데이터의 수에 따라 유동적으로 변한다.
    • 데이터가 삽입되면 증가, 삭제되면 감소
  • bottom

    • 가장 먼저 입력된 데이터
    • 0으로 값이 고정되어 있다.
  • push 기능: top을 하나 증가시킨 후, 새로운 데이터 삽입
  • pop 기능: top이 가리키고 있는 자료 삭제 후, top값을 하나 감소 시킨다.
  • peek 기능: top이 가리키는 데이터를 읽는 작업으로 top에는 영향이 없다.

    // 구문
    ArrayStack stack = new ArrayStack(5);

Queue 인터페이스

  • FIFO 선입선출 형태의 자료구조
  • 인터페이스이므로 직접 객체 생성 불가
  • front: 가장 먼저 입력된 데이터 - remove 기능 수행은 front에서.
  • rear: 가장 최근에 입력된 데이터 - insert 기능 수행은 rear에서.
  • front 값이 rear를 추월하게 되면 더 이상 제거할 데이터가 없는 빈 큐임을 의미한다.
  • 큐에서 front가 가리키는 데이터를 읽는 작업을 peek라고 하고, front에는 영향 없다.

    //구문
    Queue<String> queue = new LinkedList<String>(); // Queue를 구현한 클래스를 통해 객체 생성
    
    for(int i = 1;i<= 3; i++){
        queue.add(i);
    }
    Systme.out.println(queue.peek()); // front가 가리키는 데이터 확인
    Systme.out.println(queue.poll()); //front가 가리키는 데이터 하나씩 꺼내서 출력 == remove

Generics

❗️👀 자바에서 제공하는 다양한 컬렉션들(Vector, Stack, Queue 등)은 다른 타입의 Object를 저장하고 관리하는 기능을 제공한다. 하지만 실제 프로그램을 개발할 때에는 다른 타입의 데이터를 저장할 일이 거의 없다. 오히려 다른 타입의 데이터들을 컬렉션에 저장함으로써 문제가 발생되는 경우도 있다.

👉 이를 위해 컬렉션 객체가 특정 타입의 데이터만 저장하고 사용할 수 있도록 지원해야하는데, 자바에서는 그래서 Generics기능을 제공

Generics의 특징-장점-문법

  • 컬렉션에 저장할 객체의 타입을 제한해서 사용하도록 함으로써

    • 타입의 안정성 제공
    • 타입 체크와 형변환 과정 생략
    • 코드의 간결화
  • 제네릭스를 사용하기 위한 문법

    컬렉션<데이터 타입> 변수이름 = new 컬렉션<데이터 타입>();
    
    /*예*/
    Vector<Integer> list = new Vector<Integer>();
    list.addElement(new Integer(100)); //list에는 Integer 객체만 들어갈 수 있다.
    // list.addElement(new Double(99.5));는 컴파일 에러 발생

Collection을 사용하는 확장 for문

배열을 포함한 컬렉션을 쉽게 사용할 수 있도록 향상된 for문

  • 기존의 방식은 요소에 순차적으로 접근하기 위해서 Collection에 저장된 요소의 개수를 확인한 후, 그만큼 반복하거나 Enumeration을 이용해야 함
  • 확장된 방식은 Enumeration을 사용하지 않고도 순차적으로 접근 가능

    //구문
    for(데이터 타입 접근 변수명 : 배열이나 컬렉션 참조 변수명){
        반복 문장;
    }
    // 데이터 타입 접근 변수명은 배열이나 컬렉션이 가지고 있는 데이터와 같은 데이터 타입을 지정해야한다.
    
    
    //예시1
    public class ForTest{
        public static void main(String[] args){
            int[] scoreList = {50, 45, 99, 85, 100};
            int scoreSum = 0;
            for(int score : scoreList){
                scoreSum = scoreSum + score;
            }
        }
    }
    
    //예시2 - Collection에서 확장for문 사용
    public class ForTest{
        public static void main(String[] args){
            Vector<String> subjectList = new Vector<String>();
            subjectList.add("Java");
            subjectList.add("Python");
            subjectList.add("SQL");
            
            for(String subject : subjectList){
                System.out.println(subject);
            }
        }
    }
    
    //이 경우에는 가능하면 Generics를 사용하는 것이 좋다
    // 👍 접근 변수의 데이터 타입을 지정할 때 Generics클래스에서 지정한 데이터 타입으로 지정 가능
    // Collection이 아닌 경우에도 Generics를 사용할 수 있지만 접근 변수의 데이터 타입을 Object 클래스 타입으로 지정해야하며 접근 변수 사용 시 적절한 해당 클래스 타입으로 형변환시켜야 하는 단점이 있다.

Hi! I'm @Yeseul Lee
Passionate for what I love

GitHubLinkedIn