- 제네릭(Generic)       

클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법이다.

 

 

- 제네릭을 사용하는 이유

  1. 다양한 타입의 객체의 재사용을 높일 수 있다.
  2. 클래스에서 사용할 타입을 외부에서 설정할 수 있다.
  3. 반복적인 코드, 불필요한 코드를 사용하지 않도록 한다.
  4. 강제적인 형변환을 발생시키지 않는다.

 

- 제네릭 타입

타입 의미
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

 

 

✔️ Object 클래스

자바의 모든 클래스의 최상위 조상 클래스이다.

모든 타입은 Object 클래스로 객체화시킬 수 있다.

기본 데이터 타입을 객체화 시킨 래퍼 타입으로 대입받을 수 있다.

 

 


제네릭 사용해보기!

 

package day08;

public class Generic1<K,V> {
    private K key;
    private V value;

    public void set(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() {
        return key;
    }

    public void setKey(K key) {
        this.key = key;
    }

    public V getValue() {
        return value;
    }

    public void setValue(V value) {
        this.value = value;
    }
}

 

메인 메소드

package day08;

public class GenericTest {
    public static void main(String[] args) {
        Generic1<String, Integer> generic = new Generic1<>();
        generic.set("백", 100);

        System.out.println("Key : " + generic.getKey());
        System.out.println("Value : " + generic.getValue());

        System.out.println("K 타입 : " + generic.getKey().getClass().getName());
        System.out.println("V 타입 : " +generic.getValue().getClass().getName());
    }
}

 

위 코드의 결과


- 컬렉션 프레임 워크(Collection FrameWork)

여러 가지 데이터를 메모리에 쉽고 효과적으로 처리할 수 있도록 제공하는 클래스들의 집합이다.

자료구조를 구현한 클래스들의 모음

 

 

✔️ 자료구조

데이터를 효율적으로 관리할 수 있는 데이터 구조를 의미한다.

데이터의 특성에 따라 체계적으로 구조화된다.

 

 

✔️ 알고리즘

어떤 문제를 풀기 위한 절차 및 방법을 의미한다.

어떤 문제에 대해 입력을 넣으면 원하는 출력을 얻을 수 있도록 만드는 프로그래밍이다.

 

 

- 컬렉션 프레임 워크의 종류

인터페이스 의미
List 인터페이스 순서가 있는 데이터의 집합
데이터 중복 허용 ⭕
Set 인터페이스 순서가 없는 데이터의 집합
데이터 중복을 허용하지 않음❌
Map 인터페이스 키와 값을 한 쌍으로 이루어지는 데이터의 집합
순서가 없음
키는 중복 ❌, 값은 중복 ⭕

 


 

- List 인터페이스 종류

Vector, ArrayList, Queue, Stack, LinkedList

 

 

- Vector 클래스

동적인 길이로 여러 데이터형을 저장하기 위해 사용한다.

자바 1.0부터 존재하는 레거시 클래스이다.

배열과 동일하게 정수 인덱스를 이용하여 액세스를 할 수 있다.

동기화되어 있으며, 한 번에 하나의 스레드만 벡터의 메소드를 호출할 수 있다.

 

 


Vector 사용해보기!

package day08;

import java.util.Vector;

public class Vector1 {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();

        System.out.println("BEFORE");
        System.out.println("벡터 데이터의 길이 : " + vector.size());
        System.out.println("벡터 크기 : " + vector.capacity());
        System.out.println("-----------------------------------------");

        vector.addElement("김사과");
        vector.addElement("오렌지");
        vector.addElement("반하나");
        vector.addElement("이메론");
        vector.addElement("이체리");
        vector.addElement("배애리");
        vector.addElement("반하나");
        vector.addElement("이메론");
        vector.addElement("배애리");
        vector.addElement("오렌지");
        vector.addElement("레몬");

        System.out.println("AFTER");
        System.out.println("벡터 데이터의 길이 : " + vector.size());
        System.out.println("벡터 크기 : " + vector.capacity());
        System.out.println("-----------------------------------------");

        for(int i = 0; i < vector.size(); i++) {
            System.out.print(vector.get(i) + " " );
        }
        System.out.println();
        System.out.println("-----------------------------------------");
        vector.removeAllElements();
        System.out.println("REMOVE");
        System.out.println("벡터 데이터의 길이 : " + vector.size());
        System.out.println("벡터 크기 : " + vector.capacity());
    }
}

위 코드의 결과

요소를 추가하기 전에 벡터의 크기가 기본적으로 10으로 되어있으며, 10 이상의 요소를 넣게 되면 크기가 커지는 것을 확인할 수 있다. 또한, 요소 전체를 다 삭제해도 커진 크기는 줄어들지 않는다.

 

 


- Vector 메소드

add(), addElement() : 두 메소드는 동일, 하지만 addElement는 벡터만 존재, 데이터 추가

size() : 저장된 값의 개수를 반환

capacity() : 현재 배열의 크기를 반환

remove() : 특정 인덱스의 데이터 삭제

removeAllElements() : 전체 데이터 삭제

clear() : 전체 데이터 삭제

 

 


- ArrayList 클래스

동적인 길이로 여러 데이터형을 저장하기 위해 사용한다.

배열과 동시에 정수 인덱스를 이용하여 액세스를 할 수 있다.

비동기식을 사용하며 멀티스레드를 지원한다. (벡터 클래스와의 차이점)

 

✔️ 동기식

프로그램을 차례(순서)대로 처리한다.

 

 

✔️ 비동기식

여러 개의 프로그램을 동시에 처리한다. 시간이 오래 걸리면 다음 문장으로 이동 후 동작하는 방식이다.

 

 


ArrayList 사용해보기!

package day08;

import java.util.ArrayList;

public class ArrayList1 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        System.out.println("list 사이즈 : " + list.size());

        list.add(80);
        list.add(90);
        list.add(65);
        list.add(70);
        list.add(99);
        list.add(100);

        System.out.println("list : " + list);
        System.out.println("list 사이즈 : " + list.size());

        System.out.println("반복문");
        for(int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
        System.out.println("--------------------------------------");

        list.remove(2);
        System.out.println("삭제 후 : " + list);

        list.set(2, 56);
        System.out.println("2번 인덱스에 새로운 값 : "  + list);

    }
}

위 코드의 결과

Vector와는 다르게 값을 추가하기 전에는 사이즈가 0인 것을 확인할 수 있다. 

 


- ArrayList 메소드

add() : 순서대로 데이터 추가

get(index) : 특정 인덱스의 데이터를 반환한다.

set(index, value) : 특정 인덱스의 데이터를 변경할 수 있다.

remove(index or value) : 특정 인덱스 나 데이터를 삭제한다.

clear() : 모든 데이터 삭제한다.

isEmpty() : list가 비었으면 true, 하나의 데이터라도 있으면 true 반환


- Queue 클래스

FIFO (First IN First OUT) 방식

큐의 한쪽 끝을 프런트로 정하여 삭제 연산만 수행한다.

다른 한쪽 끝을 리어로 정하여 삽입 연산만 수행한다.

푸시 메시지, 운영체제의 스케줄러에 쓰인다.

 

 

- Queue 클래스의 구조

 

출처 : 구글

 


Queue 사용해보기!

import java.util.LinkedList;
import java.util.Queue;

public class Queue1 {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();  
        queue.offer(10);                       
        queue.offer(20);                     
        queue.offer(50);
        queue.offer(80);
        queue.offer(70);
        queue.offer(90);

        System.out.println("Queue : " + queue);
        System.out.println("첫 번째 데이터 : " + queue.peek());   // 첫 번째 데이터를 반환
        System.out.println(queue);
        System.out.println("첫 번째 데이터 : " + queue.poll());    // 첫 번째 데이터를 반환 후 삭제
        System.out.println(queue);
        queue.clear();
        System.out.println("CLEAR" + queue);


    }
}

위 코드의 결과

 

 

Queue라는 클래스가 존재하지 않기 때문에 LinkedList 클래스 생성자를 통해 객체를 생성한다. 이는 다형성 때문에 가능하다.

 


- Queue 메소드

offer() : 주어진 객체 삽입

           성공 : true 반환, 실패 : false 반환

add() : 주어진 객체 삽입

          성공 : true 반환, 실패 : 예외 발생

peek() : 첫 번째 객체 반환

element() : 첫 번 째 객체 반환

poll() : 첫 번째 객체 반환 후 삭제

remove(E e) : 특정 객체 삭제

clear() : 전체 삭제


- Stack 클래스

LIFO(Last IN First OUT) 방식

한쪽 끝에서만 자료를 넣고 뺄 수 있는 형식의 자료구조

브라우저의 뒤로 가기, 앞으로 가기 버튼에 쓰인다.

 

 

- Stack 구조

출처 : 구글

 


Stack 사용해보기!

package day08;

import java.util.Stack;

public class Stack1 {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(50);
        stack.push(100);
        stack.push(70);
        stack.push(80);
        stack.push(60);
        stack.push(20);

        System.out.println("Stack : " + stack);
        System.out.println("마지막 데이터 : " + stack.peek());   // 마지막에 들어온 데이터를 반환
        System.out.println(stack);
        System.out.println("마지막 데이터 : " + stack.pop());    // 미지막에 들어온 데이터를 반환 후 삭제
        System.out.println(stack);
    }
}

위 코드의 결과

 


- Stack 메소드

push(value) : 데이터 추가

clear() : 전체 데이터 삭제

peek() : 마지막 데이터 반환

pop() : 마지막 데이터 반환 후 삭제


-LinkedList 클래스

각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식이다.

ArrayList에 비해 데이터의 추가나 삭제가 빠르다.

인덱스가 없기 때문에 특정 요소에 접근이 느리다.

탐색 속도가 떨어진다.

 


LinkedList 사용해보기!

package day08;

import java.util.LinkedList;

public class LinkedList1 {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("김사과");
        linkedList.add("오렌지");
        linkedList.add("이메론");
        linkedList.add("반하나");
        linkedList.add("배애리");
        linkedList.add("이체리");
        System.out.println("LinkedList : " + linkedList);
        System.out.println("first : " + linkedList.peek());      // 첫 데이터 반환
        System.out.println(linkedList);
        System.out.println("first : "  +linkedList.poll());      // 첫 데이터 반환 후 삭제
        System.out.println(linkedList);
        linkedList.remove("오렌지");           // 특정요소 삭제
        System.out.println("REMOVE : "  + linkedList);
    }
}

위 코드의 결과

 


- LinkedList 메소드

 

add() :객체를 추가

clear() : 모든 요소 삭제

peek() : 첫 번째 요소 반환

poll() : 첫 번째 요소 반환 후 삭제

remove(value) : 특정 요소 삭제


 

❗Iterator 인터페이스

컬렉션 프레임워크 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메서드를 정의하여 각 요소에 접근하도록 설계되어있다.

자바의 컬렉션에 저장되어 있는 요소들을 읽어오는 방법이다.

컬렉션으로부터 정보를 얻어내는 방법이다.

 

   iterator의 장단점

  • 장점 : 컬렉션 프레임워크 종류에 관계없이 일관성 있게 프로그래밍을 할 수 있다.
  • 단점 : size 메소드를 얻어와서 반복 처리하는 것보다 속도가 좋지 못하다.

 

 

 

복사했습니다!