본문 바로가기

Java

[Chapter11] 제네릭과 컬렉션

Wrapper 클래스


  • Wrapper 클래스란?

- 기본 데이터형(기본타입)을 객체로 다루기 위한 포장 클래스(객체로 포장해주기 위함)

- 기본타입: 최소한의 데이터만 가지고 있는 타입(객체 아님)

 

- 사용이유

  • 자바에서는 객체를 대상으로 처리하는 경우가 많음
  • 특정 클래스는 객체만을 다루기 때문에 기본 데이터 형을 사용할 수 없음
  • 문자열을 기본 타입값으로 변환할 때도 유용
  • 그외, 다른 타입으로부터의 변환 등 유용한 유틸리티 메서드 제공

(예시)

Member[] members = {
new Member("홍길동"),
new Member("고길동"),
new Member("장길산"),
new Member("임꺽정"),
};
System.out.println("원본: "+ Arrays.toString(members));
Arrays.sort(members);
System.out.println("정렬: "+ Arrays.toString(members));
//com.javaex.api.Member Comparable 인터페이스가 없어서 에러

Arrays.sort(members, Collections.reverseOrder());
System.out.println(" 역순 정렬: "+ Arrays.toString(members));

 

  • Wrapper 클래스 - 객체생성

- new를 이용한 Wrapper 클래스 객체 생성은 Deprecated(조만간 없어질 예정)

- Java 9 이후부터는 내부의 static 메서드 valueOf를 이용하여 생성

 

public class WrapperClassTest {
  public static void main( String[] args ) {
    Integer i = Integer.valueOf( 10 );
    Integer i2 = new Integer(20); //Deprecated 
    Character c = Character.valueOf( 'c' );
    Float f = Float.valueOf( 3.14f );
    Boolean b = Boolean.valueOf( true ); 
    Integer i2 = Integer.valueOf( "10" );
    Double d2 = Double.valueOf( "3.14" );
    Boolean b2 = Boolean.valueOf( "false" ); 
   }
}

 

 

  • 박싱(boxing)과 언박싱(unboxing)

- 박싱(boxing): 기본 데이터를 Wrapper 클래스에 담는 것

- 언박싱(unboxing): 박싱의 반대

 

 

* JDK 1.5부터는 박싱과 언박싱이 자동으로 수행됨

public class WapperClassTest {
  public static void main( String[] args ) {
  Integer i = 10;
  System.out,println( i );
  int n = i + 10;
  System.out.println( n );
  }
}

 

(예시)

Integer i = new Integer(10);
Integer i2 = Integer.valueOf(10); //10을 Integer 래퍼클래스로
Integer i3 = Integer.valueOf("10");

//자동박싱
Integer i4 = 10; //10데이터가 Integer로 자동박싱됨 => Integer i4 = Integer.valueOf(10);

//자동언박싱
int value = i4;	//Integer객체인 i4가 int로 자동언박싱 => int value = i4.intValue();

//포장된 값의 비교
System.out.println(i == i2); //False//객체 주소값의 비교(주의). Wrapper 클래스도 객체다.
System.out.println(i.intValue() == i2.intValue()); //True
System.out.println(i.equals(i2)); // True

 

Java Utility API


  • Java Utility API란?

- 자바 프로그램에서 필요로 하는 편리한 기능을 모아둔 클래스들의 패키지

 

 

 

Generic


  • Generic이란?

- 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

(클래스 내부에서 사용할 데이터 타입을 나중에 인스턴스를 생성할 때 확정하여 사용)

- 메서드 리턴타입, 메서드 인자의 매개변수 타입 미정-> 데이터 타입을 T로 써

 

 

  • 제네릭을 사용해야 하는 이유

- 형변환의 번거로움이 줄어든다

- 객체의 타입을 컴파일시에 강하게 체크할 수 있음

 

 

  • 제네릭 타입: 타입을 파라미터로 가지는 클래스와 인터페이스
public class 클래스명<T> { … }
public interface 인터페이스명<T> { //... }

 

*tip

T: 타입

K: 키

V: 값

R: 리턴타입

으로 주로 쓴다

 

Box<Integer> intBox = new Box<Integer>();

Box <Integer>intBox = new Box<>();

둘다 쓸 수 있다. 

 

 

  • Generic의 상속

- 제네릭 클래스들도 클래스이므로 상속 구조를 나타낼 수 있다

- 제네릭 클래스들 간의 상속은 extends나 implements로 표시한다

 

  • 와일드 카드

- 기호 ?로 나타내며 어떠한 타입도 될 수 있다.

- <?> : 모든 타입 가능. ==  <? extends Object> //T를 상속받은 모든클래스

- <? extends T> : T와 T를 상속받은 자손들만 가능

- <? super T> : T와 T의 조상들만 가능

 

 

 

 

Collection Framework


  • 컬렉션이란?

- 다수의 데이터, 즉 데이터 그룹을 의미

 

 

  • 프레임워크란?

- 표준화, 정형화된 체계적인 프로그래밍 방식

 

 

  • 컬렉션 프레임워크

- 컬렉션을 저장하는 클래스들을 표준화한 설계 

- 다수의 데이터를 쉽게 처리할 수 있는 방법을 제공하는 클래스들로 구성 

- JDK 1.2부터

 

 

  • 컬렉션 클래스

- 다수의 데이터를 저장할 수 있는 클래스

- Vector, ArrayList, HashSet 등

 

 

  • 핵심 인터페이스

 

 

 

 

 

 

  • 배열 (Array) vs 리스트(List)

 

 

  • Vector Class

- 객체만 저장할 수 있음

- Vector의 참조 결과는 항상 Object 타입 -> 적절한 Type으로 변환 후 사용

- Generics로 지정하지 않으면 여러 타입을 동시에 저장 가능

    - 꺼낸 객체의 타입을 알고 있어야 함

    - 혹은 instanceof 연산자로 확인 후 사용

Vector v = new Vector();
v.addElement(1); //1은 int 기본자료형이지만 자바 버전에 따라 Packing되어 삽입된다
v.addElement(Integer.valueOf(1)); //int에 대응되는 Wrapper 클래스인 Integer 사용
v.addElement(Double.valueOf(3.14)); //어떤 타입의 객체도 저장 가능
Integer i = v.elementAt(0); //elementAt 메쏘드의 반환타입은 Object 이므로 컴파일 안됨
Integer i = (Integer)v.elementAt(0);//명시적 내림변환 필요(downcasting)
Double d = (Double)v.elementAt(1)

 

  • Linked List

- 링크(Link)로 연결된 노드(Node)의 집합

- java.util.LinkedList

- 임의의 객체를 리스트로 저장하는 기능을 제공

- Index를 통한 참조 접근은 불가

        - Head로부터 링크를 따라가면서 접근

- 각 노드는 자신이 나타내는 데이터와 다음 노드(Node)로의 링크(Link)를 가지고 있음

 

<특징>

- 메모리 효율이 좋다

- 접근이 느리다

 

 

  • ArrayList이란?

- Vector, LinkedList, ArrayList 모두 추상 클래스 AbstractList를 상속받은 동적 자 료 구조

- 배열과 비슷한 형태의 List

- java.util.ArrayList에 구현

 

<특징>

- 배열을 다루는 것과 유사한 방식으로 동적 자료 구조를 사용할 수 있게 함

- LinkedList만큼 메모리 효율이 좋지는 않다

- Vector vs List : 항목 삽입, 삭제 동작이 동기화(synchronization) 여부의 차이

  • Vector : 동기화된 삽입 삭제 동작 제공 (스레드 세이프)
  • List : 삽입과 삭제가 동기화 되어 있지 않음 – 외부적 동기화 필요 (스레드 세이프 x)

- 스레드 세이프 : 여러개 thread 동시에 수정할때 (멀티스레드 구조, 여러개 스레드가 같은 데이터를 공유할 때) 안정적(잠금-잠금해제-수정)

- ArrayList는 중간에 객체가 삭제되면 뒤의 객체들을 당겨, 인덱스를 재구성한다.

- 따라서 마지막 인덱스에 객체가 추가되는 속도는 LinkedList보다 빠르지만 중간에 객 체의 추가, 삭제가 빈번하게 일어나는 경우는 속도 저하가 일어나게 된다.

 

 

 

 

  • Stack

- java.util.Stack 클래스로 제공, Vector 클래스를 상속받아 구현

- 한쪽 끝점에서만 새로운 항목을 삽입, 기존 항복을 제거할 수 있음

        - Last In First Out (LIFO)

        - 쌓여있는 접시 : 새로운 접시를 위에 쌓거나 가장 위의 접시부터 사용 가능

- 스택에서의 메서드들

  • push( ) : 스택에 객체를 넣음
  • pop( ) : 스택에서 객체를 추출(top은 삭제)
  • peek( ) : pop( )과 같지만, top 값을 삭제하지 않는다
  • empty( ) : 스택이 비었는지 확인

- 텅 빈 스택에서 pop( )을 하면  Underflow상태

 

 

 

  • Queue

- java.util.Queue 클래스로 제공 (interface)

- 목록의 가장 마지막에 새로운 항목이 추가

- 기존 항목의 제거는 리스트의 처음에서 일어남

- First In First Out (FIFO)

- 큐에서의 메서드들

  • offer( )
  • poll( )
  • peek( )

 

 

List

순서가 있다

중복을 허용한다

 

Set

- 순서가 없다(인덱스접근 불가)

- 중복을 허용하지 않는다

 

 

  • Hash Set

- java.util.HashSet 클래스로 제공 

- 자료 구조에 포함된 자료의 순서나 키에 상관없이 자료 전체를 하나의 셋으로 관 리할 수 있도록 해주는 자료 구조 

- 해시테이블에서 키 없이 값들만 존재하는 경우 

- 자료의 해시로 유지, 검색이 빠르다 

- HashSet에서 사용 가능한 메서드들

  • add
  • remove
  • contains

 

  • hash알고리즘과 hashCode( )

- 동일객체, 동등객체

 

- 객체 해시 코드란 객체를 식별할 하나의 정수값을 의미

- Object의 hashCode() 메서드는 객체의 메모리 번지를 이용하여 해시 코드를 만 들어 리턴 -> 모든 객체다른 값을 가지고 있음

- Hash 관련 컬렉션들은 다음과 같은 방식으로 두 객체가 동등한지 아닌지를 비교 한다

 

 

 

  • Hash Table

- java.util.Hashtable 클래스

- 맵(Map) 인터페이스를 다루는 자료 구조

- 자료들의 순서가 아닌 키(key)와 값(value)의 쌍을 저장

- 키와 값은 모든 임의의 객체가 허용됨

- Hashtable에서 사용 가능한 메서드들

  • put
  • get
  • isEmpty
  • containsKey 
  • Enumeration 과 Iterator (반복자)

- Enumeration : 벡터와 해시테이블에 존재하는 요소들에 대한 접근방식을 제공해주는 인터페이스

- Iterator: Collection Framework로 확장하면서 도입 (List, Set 등)

- 자바에서 제공하는 컬렉션에 대해 각 컬렉선의 항목들을 순차적으로 접근하는데 사용

- Enumeration

  • hasMoreElements()와 nextElement() 두 개의 메서드 제공 
  • Vector::elements() 
  • Hashtable::keys() 
  • Hashtable::values()

- Iterator

  • hasNext(), next(), remove() 제공
  • Set::iterator()
  • List::iterator()

 

  • Collection Class Diagram

 

'Java' 카테고리의 다른 글

[chapter04] 제어문  (0) 2021.12.10
[chapter 05 ] 배열  (0) 2021.12.09
[Chapter01]자바 언어 소개  (0) 2021.12.08
[Chapter07-2] 객체지향 프로그래밍1  (0) 2021.12.07
[Chapter07-1] 객체지향 프로그래밍1  (0) 2021.12.06