Java의 컬렉션 프레임워크의 상속구조 입니다.

컬렉션 : 요소들의 저장소이다. 요소의 개수에 따라 크기가 자동 조절된다. 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동.-> 배열이 가진 고정 크기의 단점을 극복하기 위해 객체들을 쉽게 삽입 삭제 검색 할 수 있는 가변 크기의 컨테이너이다.

가변 크기의 컨테이너 답게 add 함수를 이용해서 초기 값을 넘겨 추가를 해도 계속 삽입 되어진다.

 

 

자주쓰는 프레임워크 : LIst , ArrayList

 

배열과 컬렉션의 차이점 배열은 고정 크기 이상의 객체를 관리할 수 없고, 중간에 객체가 삭제되면 응용프로그램에서 자리를 옮겨야 한다. 하지만 컬렉션은 가변 크기로서 객체의 개수를 염려할 필요가 없고 컬랙션 내의 한 객체가 삭제되면 컬렉션이 자동으로 자리를 옮겨준다.

 

컬렉션의 특징 : 컬렉션 자체가 제네릭 기법으로 구현되어있고, 컬렉션의 요소는 객체만 가능하다.

ArrayList<E> 에서 E 대신 구체적인 타입을 지정하면 그 값만 저장하는 ArrayList를 사용할 수 있다. 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 컬렉션을 일반화시키기 위해 <E>를 사용하는 것. <E> 자체를 타입 매개변수라고 부르고 타입 매개변수를 일반화 시킨 타입을 제네릭 타입이라고 부른다.

 

제네릭 타입 매개변수 컬렉션(ArrayList의 부모) 클래스에서 타입 매개변수로 사용하는 문자는 다른 변수와 혼동을 피하기 위해 일반적으로 하나의 대문자를 사용 ex(E :element T : type V : value K : key)

 

제네릭 컬렉션 활용

ArrayList**<E>** : 배열을 가변 크기로 다룰 수 있게 하고 객체의 삽입 삭제 이동이 쉽도록 구성한 컬렉션 클래스이다. ArrayList는 삽입되는 요소의 개수에 따라 자동으로 크기를 조절하고, 요소의 삽입과 삭제에 따라 자동으로 요소들의 자리를 이동.

 

ArrayList<E>

가변 크기의 배열을 구현한 컬렉션 클래스. 경로명은 java.util.ArrayList, Vector 클래스와 거의 동일.차이점은 ArrayList는 스레드 간에 동기화를 지원하지 않기 때문에 다수의 스레드가 동시에 ArrayList에 요소를 삽입하거나 삭제할 때 ArrayList의 데이터가 훼손될 우려가 있다. 하지만 멀티스레드 동기화를 위한 시간 소모가 없기 때문에 ArrayList는 Vector보다 속도가 빨라, 단일 스레드 응용에는 더 효과적이다.

선언 , 생성

ArrayList<String> a = ArrayList<>() ; >> 자료형 선언 후, 생성 시에는 생략 가능.

ArrayList의 크기 알아내기 int len = a.size() //

ArrayList의 값 추가 a.add( (index) , value) >

ArrayList의 요소 전체 삭제 유사. a.clear(); -> 모든 요소를 삭제하는 메소드

ArrayList의 요소 삭제 a.remove(index or value) > 인덱스 또는 값 하나만 삭제

ArrayList의 해당 인덱스의 값 반환 a.get(index)

ArrayList의 해당 인덱스 값 변경 a.set(index, value)

ArrayList의 해당 값의 인덱스 반환하기 a.indexOf(value) >> 해당 인덱스가 없다면 -1 반환

ArrayList의 해당 값 존재 여부 확인 a.contains(value) >> true & false

제네릭 다시 설명

• 어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍 하는 것을 '제네릭(Generic) 프로그래밍' 이라고 한다.

• 여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고 클래스나 메서드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식

public class TestGene<T>
{
	public T sample;

	public void showYourType(){
		if(sample instanceof Integer)
			System.out.println("Integer 타입 입니다");
		else if(sample instanceof String)
			System.out.println("String 타입 입니다");
	}
}

위의 코드에서 T 는 현재 타입이 정해져 있지 않습니다 (Type 의 약자)

T 는 TestGene의 인스턴스가 생성 될 때 결정이 됩니다.

public class Main{
	public static void main(String[] args) {
		TestGene<String> stringType = new TestGene<String>();
		TestGene<Integer> integerType = new TestGene<Integer>();

		stringType.sample = "Hello";
		integerType.sample = 1;

		stringType.showYourType();
		integerType.showYourType();
	}
}

<String> , <Integer> 부분이 타입 입니다.

제네릭은 기본 자료형 ( long , int … ) 에 대해서는 지정이 불가능 합니다. 다만 기본 타입을 객체 타입으로 사용하는 Wrapper 클래스 (Integer, Boolean … ) 에는 제네릭 사용이 가능합니다.

public class Data<T>{
	public T data;

	public Data(T data){
		this.data = data;
	}
}

public class Main{
	public static void main(String[] args) {
		Data data = new Data("Hello");
		Data<String> data2 = new Data("Hello World");
	}
}

Data 클래스의 생성자에 매개변수로 자료형을 T (제네릭)으로 설정하게 된다면

Data 인스턴스 생성 시에

여러 참조 자료형을 사용할 수 있다는 것이 장점이라고 하는데, ArrayList 사용시 한정으로 가급적이면 상속 관계를 가지고 있는 클래스들로 제한해서 사용하는 것이 좋을 듯 하다 (내 생각)

 

'더존 노션 필기 옮기기 > Java' 카테고리의 다른 글

Java 아직 미작성한 챕터  (1) 2022.08.30
Java 7일차 다형성  (1) 2022.08.30
Java 6일차 객체배열, 상속  (0) 2022.08.30
Java 5일차 객체  (0) 2022.08.30
Java 4일차 배열  (0) 2022.08.30

+ Recent posts