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 |