상세 컨텐츠

본문 제목

[JAVA] 제네릭(Generic), 컬렉션 자료구조(list, set, map)

Programming language/JAVA

by 주초위왕 2023. 8. 31. 20:54

본문

제네릭이란?

 

제네릭이란 뜻이 "일반적인" 이라는 뜻인데, '데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법'이다.

동작은 같지만 데이터 타입은 같다(많이 등장함.)


제네릭 타입을 왜 사용하는가?

 

 - 제네릭타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있기 때문.

 - 제네릭 코드를 사용하면 타입을 국한하기 때문에 요소를 찾아올 때 타입 변환을 할 필요가 없어 프로그램 성능이 향상되는 효과를 얻을 수 있다.

 - 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고 매우 유용하기도 하다. 즉, 코드 관리가 편하다는 점.


제네릭 사용법

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

 

예제1)

<>안에 들어갈 타입을 지정해준다.

ArrayList<Integer> list1 = new ArrayList<Integer>()
ArrayList<String> list2 = new ArrayList<Integer>()
 
LinkedList<Double> list3 = new LinkedList<Double>()
LinkedList<Character> list4 = new LinkedList<Character>()

 

왜, 쓰는가?

어떤 자료구조를 만들어 배포하려 할 때, String 타입도 지원하고싶고 Integer타입도 지원하고 싶고 많은 타입을 지원하고 싶다. 그러면 String에 대한 클래스, Integer에 대한 클래스 등 하나하나 타입에 따라 만들 것인가? 그건 너무 비효율적이다. 이러한 문제를 해결하기 위해 제네릭이라는 것을 사용한다.


보통 아래의 타입들을 많이 쓴다.

<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

 

클래스 및 인터페이스 선언

기본적으로 클래스 및 인터페이스를 아래와 같이 선언한다.

public class ClassName <T> { ... }
public Interfa InterfaName <T> { ... }


제네릭 타입을 두개 두기

public class ClassName <T, K> { ... }
public Interface InterfaceName <T, K> { ... }

제네릭 클래스를 사용하고 싶을 떄, 객체를 생성하게 되는데 이 때, 구체적인 타입을 명시를 해주어야 한다.

 

public class ClassName <T, K> { ... }
 
public class Main {
	public static void main(String[] args) {
		ClassName<String, Integer> a = new ClassName<String, Integer>();
	}
}

* T는 String이 되고, K는 Integer *

 * 주의할 점은 *

파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다.

즉, int, double, char 같은 primitive type은 올 수 없다는 것이다.


제네릭을 이용하여 자바의 컬렉션 프레임워크 배워보기.

 

컬렉션 프레임워크란?

널리 알려져 있는 자료구조로부터 객체들을 효율적으로  추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들을 java.util 패키지에 포함시켜 놓았다. 컬렉션 프레임워크는 몇 가지 인터페이스를 통해서 다양한 컬렉션 클래스를 이용할 수 있도록 설계 되어 있다. 주요 인터페이스로는 List, Set, Map이 있다.

 - List(ArrayList, Vector, LinkedList)

 

 - Set(HashSet, YreeSet)

   List 컬렉션은 저장 순서를 유지하지만,Set 컬렉션은 저장 순서가 유지되지 않는다.

   또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있는 단점과 인덱스로 관리하지 않기 때문에 인덱스를 파     라미터로 갖는 메소드가 없습니다.

---------------------------------------------------------------------

 

 - Map(HashMap, Hashtable, TreeMap, Properties)

 

List와 Set는 객체를 추가, 삭제, 검색하는 방법에 있어서 공통된 메소드만 따로 모아 Collection인터페이스로 정의해 두고 상속하고 있다. Map은 구조와 사용 방법이 다르다.


예제1) List(ArrayList)

1.  ArrayList는 객체를 담기 위한 클래스입니다. 해당 클래스는 java.util패키지에 존재하니,

이를 사용하기 위해서는 import를 통해 해당 클래스를 가져와야 한다.(import hava.util.ArrayList)

 

2. ArrayList를 사용하기 위해 객체를 만들어야 하는데, 저장할 객체의 타입을 꺽쇠<>안에 적어 주어야 합니다.

이러한 기법을 제네릭 이라고 한다. 

 

3. ArrayList객체가 만들어지면 객체를 추가하거나 가져오는 등의 작업을 할 수 있다.

 

names에 객체를 추가 하기 위해서 .add메소드를 사용해("kim")문자열 넣기

get이라는 메소드를 사용하여 0번째 값을 가져오기

객체수를 반환하고 싶을 때 쓰는size메소드 사용하기

 

예제1) List(Vector)

Vector의 값을 추가하기 위해서는 add()메서드를 사용하고, 값을 변경하려면 set()메소드를 사용합니다.

add()매소드의 사용방법에는 두 가지가 있는데 기본적으로 마지막에 데이터가 추가되지만,

add(int Index, Object) : Vextor의 Index위치에 데이터를 추가합니다

Vector 값  제거하기

원하는 값을 삭제하는 방법은 remove(int Index)를 사용하여 삭제.

만약 값을 한꺼번에 삭제하려면 removeAllElements(), clear() 메서드를 사용하여 삭제할 수 있습니다.

 

예제1) List(LinkedList)

Class, Integer, String, Character 등의 타입으로 선언이 가능.

LinkedList의 값을 추가하기 위해서는 add() 메서드를 사용하며, add(Object) : 기본적으로 add를 사용하여 추가하면 LinkedList의 마지막에 데이터를 추가하는 방법과, add(int Index, Object) : LinkedList의 Index에 데이터를 추가하는 방법이 있습니다.

 

LinkedList의 값을 변경하는 방법은 set() 메서드를 사용하며,  Index를 알아야 변경이 가능합니다

set(int Index, Object)로 변경할 수 있습니다

 

LinkedList 값 삭제하기

removeFirst(), removeLast() : LinkedList에서 첫 번째와 마지막 데이터를 삭제합니다.

remove() : 첫 번째 데이터를 삭제합니다

remove(int Index) : Index 위치의 데이터를 삭제

clear() : List의 모든 데이터를 삭제 -> removeAll(LinkedList)로도 모든 데이터 삭제가 가능.

 

반응형

관련글 더보기

댓글 영역