본문 바로가기

study/java

자바/Java 컬렉션 강의 정리(2)

이 글은 뉴렉쳐님의 강의를 듣고 정리하는 글입니다. youtube.com/playlist?list=PLq8wAnVUcTFWKOIbvo18pJZ9zsxtXz_-k

 

 

Object 타입의 배열을 만들면 모든 타입의 데이터를 만들 수 있지만, 반환할 때는, 어떤 타입인지 몰라 사용하기 어렵다. 그래서 "제네릭 Generic"이란 것이 등장했다. 제네릭은 데이터 타입을 일반화한다는(generalize) 것이다.

 

컬렉션을 만들 때, 자료형이 비어있는 리스트를 만든다. 그리고 타입을 정해준다. -> 자료형마다 컬렉션을 만드는 게 아니다.

 

이렇게 만든 컬렉션은 데이터를 넣고 뺄 때, 지정된 타입으로 변환해준다. 실제로는 Object 타입의 배열이 선언돼있지만, 지정된 타입으로 바꿔는 것이다.

 

형식을 전달받기 위해 <T> 키워드 클래스 선언부에 넣는다.(T는 다른 글자여도 괜찮지만, 보통 Type의 앞글자를 따 T를 많이 사용한다.) 이를 통해 제네릭 클래스임을 알 수 있다. <T1, T2>와 같이 여러 타입을 전달할 수도 있다.

 

그리고 클래스로 객체를 생성할 때, 꺽쇠 기호 안에 원하는 자료형을 넣어 그 자료형을 전달할 수 있다. 실제로 만들어진 객체에는 Object 타입의 배열이 생기지만, 값을 추가하고 반환할 때는 전달받은 타입으로 변환한다. 그래서 이렇게 만들어진 컬렉션으로부터 값을 반환 받을 때 타입을 바꿔주지 않아도 된다.

 

 

 

이전 글에서 작성한 정수만 담을 수 있었던 컬렉션을 수정한 코드이다.

public class GenList<T> {
	
	private Object[] numbers;
	private int current;
	
	public GenList() {
		numbers = new Object[3];
		current = 0;
	}

	public void add(T num) {
		numbers[current] = num;
		current += 1;
	}

	public void clear() {	
		current = 0;
	}

	public int size() {
		return current;
	}

	public T get(int index) {
		if(current <= index)
			throw new IndexOutOfBoundsException();
		return (T)numbers[index];
	}
	
}

/////////////////////////////////////////////////
//실제 사용

GenList<Integer> lis = new GenList<>();
lis.add(3);

 

 

 

지금까지 만든 컬렉션에는 문제가 있다. 배열의 크기가 정해져 있는 것이다. 이 문제를 해결하기 위해 배열의 용량을 크게 잡으면 메모리가 낭비될 수 있다.

 

해결방법은 적정한 양을 정해 용량이 꽉차면 정해진 양만큼 배열의 크기를 늘리는 것이다. 크기를 늘리는 방법은 새로운 크기의 배열을 만드는 것이다.

 

현재 코드에서 capacity라는 용량을 나타내는 변수와 amount라는 한번 추가할 때마다 늘어날 크기를 나타내는 변수를 추가한다. 그래서 capacity가 꽉차도 amount만큼 배열을 늘려 사용할 수 있도록 한다.

 

 

public class GenList<T> {
	
	private Object[] numbers;
	private int current;
	private int capacity;
	private int amount;
		
	public GenList() {
		numbers = new Object[3];
		current = 0;
		capacity = 3;
		amount = 5;
	}

	public void add(T num) {
		if(current == capacity) {
			capacity += amount;
			Object[] temp = new Object[capacity];
			for(int i = 0; i<numbers.length; i++) {
				temp[i] = numbers[i];
			}
			numbers = temp;
			
		}
		numbers[current] = num;
		current += 1;
	}

	public void clear() {
		current = 0;
	}

	public int size() {
		return current;
	}

	public T get(int index) {
		if(current <= index)
			throw new IndexOutOfBoundsException();
		return (T)numbers[index];
	}
	
}

'study > java' 카테고리의 다른 글

자바/JAVA 제네릭  (0) 2021.01.26
자바/Java 논리, 비트 연산자, 이름을 갖는 반복문  (0) 2021.01.22
자바/Java 컬렉션 강의 정리(1)  (0) 2021.01.21
자바/JAVA 자바 API  (0) 2021.01.13
자바/JAVA 예외 처리  (0) 2021.01.12