다라다라V
article thumbnail
728x90
반응형

자바의 배열은 모두 동적 할당으로 메모리를 저장합니다. 그러나 배열은 처음 할당받은 크기 이상으로 접근할 수 없고, 중간에 요소를 삽입하거나 삭제하기 어렵습니다. 이러한 부가적 처리가 필요할 때 제네릭과 컬렉션을 이용합니다.

다수의 데이터를 한 덩어리로 처리할 때, 제네릭 타입의 컬렉션 클래스를 이용합니다. 일반화된 자료형인 제네릭 타입과 객체 요소들의 저장하는 컬렉션을 배워봅시다. 또한 자바 컬렉션 인터페이스의 예인 List나 Map, Set, Vector 등의 사용예제와 함께 사용법을 알아봅시다.

📚 제네릭(Generic)

  • 제네릭 타입은 자료형의 일반화
  • 어떤 데이터든 담을 수 있으나 한 번 담으면 해당하는 타입으로만 사용할 수 있음
  • 구체화된 일반 타입은 얼마의 메모리를 할당받는지나 코드화 하는 방법이 지정되어 있음
  • 제네릭 타입은 프로그램 소스 코드를 작성할 때는 몇 바이트를 할당받는지, 어떻게 코드화하는지가 지정되지 않음
  • 제네릭 타입은 컴파일 시 구체화 되어 사용됨

📚 기존의 처리 방법

(1) 개별 클래스를 개별적으로 만듦

  • 비슷한 내용의 클래스를 중복 구현하게 됨

 

(2) 하나의 클래스로 만듦

  • 메서드 오버로딩으로 다양한 자료형의 매개변수를 가지며 일관된 동작을 함
  • 모든 자료형을 미리 예측하여 구현할 수 없어 문제가 발생
  • Object 자료형을 이용하는 경우 모든 객체가 담기므로 실행 단계에서 문제가 발생
  • 원하지 않는 타입으로 저장되어도 컴파일시에는 문제를 알 수 없음

 

개별적 데이터들에 대한 처리를 하지만 중복된 코드 구현은 최소화 하고 싶은 경우가 존재합니다. 하나의 코드지만 각 객체를 명확히 자료형에 대해 구분해야 하는 경우가 존재할 수 있습니다. 이러한 경우 필요한 처리를 제네릭 타입으로 처리할 수 있습니다.


📚 제네릭 클래스의 처리 방법

  • 일반화된 타입을 갖는 클래스 정의
  • 객체 생성시 지정된 타입의 객체만 담을 수 있음
  • 컴파일 단계에서 확인 가능
  • 제제릭 타입으로 객체를 생성하는 순간에 제네릭 타입을 구체화된 타입으로 한정해 사용
  • 다양한 클래스에 의해 조작되는 것을 유연하고 모호하지 않게 작성함

📚 제네릭 클래스를 이용한 예제 코드

  • AppleBox, OrangeBox 를 개별적 클래스로 작성하면 타입체킹을 엄격히 할 수 있으나 중복된 내용이 많음
  • Object 타입으로 만든 FruitBox는 하나의 클래스로 효율적 관리가 가능하지만 타입체킹이 안됨
  • 예제와 같이 제네릭 타입으로 타입을 지정하면 타입 체킹을 엄격히 하고, 하나의 클래스로 효율적 관리가 가능
  • 담고자 하는 과일 타입을 T타입으로 지정하여 제내릭 클래스로 객체를 만들 때 타입이 체킹됨

📚 제네릭 타입의 객체 지정

제네릭 타입의 객체 지정은 1글자로 된 영문자를 사용합니다. 전달되는 객체가 현 객체 내에서

  • 자료형(Type)으로 쓰일 때 <T>로
  • 한 요소(Eilement)로 자리를 잡을 때는  <E>로
  • Key 값으로 사용될 때는 <K>로
  • Value 값으로 사용될 때는 <V>로

 

[접근제한] class 클래스명 <유형1, 유형2, ... , 유형n> P{
  • 여러 종류로 나열 가능함
  • 구체화 되는 것은 객체 생성시

📚 자바 컬렉션 프레임 워크

  • Java Collections Framework
  • 요소라 불리는가변 개수의 객체들의 저장소
  • 객체들을 한 곳에 모아 편리하게 사용하기 위해 제공되는 환경
  • 요소 개수에 따라 크기 자동 조절, 삽입/삭제에 따른 위치 자동 이동
  • java.util 패키지안에 있음

 

데이터를 모으고 데이터를 사용하는 행위 시 사용하는 객체를 제공합니다. 자료구조는 데이터를 어떻게 모으는가를 의미하고, 알고리즘은 데이터를 조작하기 위한 행위를 의미합니다. 이 중 자료구조를 구현한 클래스가 자바 컬렉션 프레임 워크입니다.


📚 컬렉션의 특징

  • 클래스 명만 기술하는 제네릭 기법으로 구현
  • 같은 방식으로 서로 다른 자료형들 유지/관리
  • 모든 타입의 객체 포함 가능
Vector<int> v = new Vector<int> (); // 컴파일 오류, int는 사용 불가
Vector<Integer> v = new Vector<Integer> (); // 정상코드
  • 기본 자료형의 경우 wrapper 클래스로 객체화한 후 저장
  • 기본 자료형도 객체처럼 접근
  • 자동 Wrapper기능이 존재하기 때문에 컬렉션 클래스 안에 저장됨

📚 자바 컬렉션 인터페이스 구조

  • 각 컬렉션들은 조작 방식에 따라서 몇 가지 인터체이스로부터 구현됨

📚 List<E> 

📃 List<E> 인터페이스

  • 시작과 끝이 선정되어 저장되는 요소들을 일괄적인 정렬상태를 유지하면서 저장됨
  • 동일한 객체들의 중복 저장을 허용
  • 객체들의 저장 순서가 유지

  • Stack<E> : 벡터 기반, 입출력 한쪽에서만 일어남
  • Vector <E> : 크기가 무한, 프로그램의 여러곳에서 접근했을 때 처리하는 동기화를 처리함
  • ArrayList<E> : 크기가 무한, 동기화 처리를 지원하지 않으므로 안정성이 떨어짐

 

📃 List<E> 구조의 특징

  • List<E>구조는 객체
  • 데이터 저장을 위해 별도의 인덱스 정보를 관리할 필요 없음
  • 필요시 할당 크기가 자동으로 증가
  • 내부적으로 배열을 이용하여 구현하기 때문에 가변적 길이의 배열과 비슷
  • 저장되는 데이터 수가 예측 가능하며 빈번한 참조가 일어나는 경우 유용

📚 2. Vector<E>

📃 Vector<E> 인터페이스

  • 가변 크기의 배열 객체
  • E 대신 요소로 사용할 특정 자료형으로 구체화
  • 요소의 개수가 할당 크기를 넘치면 자동으로 크기 조절
  • 요소 객체들의 삽입/삭제/검색 제공
  • 벡터의 맨 뒤, 혹은 중간에 객체 삽입 가능
  • 임의의 위치에 있는 객체 삭제가 가능하고 나머지 요소들의 위치 자동 조정

 

📃 Vector<E> 클래스의 주요 메서드


📚 3. ArrayList<E>

📃 ArrayList<E> 인터페이스

  • 가변 크기의 배열 객체
  • 기본 기능은 Vector와 거의 같음
  • Vector와 달리 스레드 동기화 기능이 없어 벡터보다 가벼움
  • 단, 동기화 필요시 개발자가 별도로 스레 드 동기화 코드 작성  필요

 

📃 ArrayList<E> 클래스의 주요 메서드


📚 4. LinkedList<E>

📃 LinkedList<E> 인터페이스

  • 순서에 따른 요소 저장
  • Vector, ArrayList와 비슷하게 동작
  • 각 요소들을  양방향으로 '연결'되어 관리됨
  • 연결 리스트 구조

📚 5. Iterator<E>

📃 Iterator<E>를 이용한 순차적 접근

  • 컬렉션에서 요소의 순차 검색을 위한 인터페이스
  • Iterator 객체 얻어내기

 

📃 Iterator<E> iterator( )

// Iterator<E> 인터페이스의 주요 메서드
boolean hasNext() // 다음 요소가 있으면 true
E next() // 다음 요소를 반환
void remove() // 현재 위치의 요소를 삭제
  • Iterable<E> 인터페이스에서  제공
  • 데이터 전부를 참조할 때 유용
  • 컬렉션 클래스의 종류에 상관없이 동일한 형태의 데이터 참조 방식을 유지

 

📃 반복자 객체의 사용

  • iterator() 메서드는 Iterator<E> 객체 반환
  • 인덱스 없이 순차적 검색 가능


📚 6. Set<E>

📃 Set<E> 인터페이스

  • 객체들의 집합
  • 저장 순서를 유지하지 않음
  • 중복된 요소를 허용하지 않음

.


📚 7. Map<K, V> 인터페이스

📃 Map<K,V> 인터페이스

  • 키(key)와 값(value)의 쌍으로 구성되는 요소를 다루는 컬렉션
  • ‘값’을 검색하기 위해서는 반드시 ‘키’를 이용
  • K : 키로 사용할 요소의 타입
  • V : 값으로 사용할 요소의 타입
  • 키와 값 한 쌍으로 삽입됨
  • 키는 해시맵에 삽입되는 위치 결정에 사용

 

📃 Map<K,V> 클래스의 주요 메서드

반응형

'코딩언어 > JAVA' 카테고리의 다른 글

[JAVA] 14-2 Swing의 기본 구성  (0) 2022.11.09
[JAVA] 14-1 Swing의 기본 특징  (0) 2022.11.08
[JAVA] 12. 예외처리  (0) 2022.11.04
[JAVA] 11 추상 클래스와 인터페이스  (0) 2022.11.03
[JAVA] 10. 상속과 다형성  (0) 2022.10.30
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!