본문 바로가기

JAVA

[JAVA] 자바 요약 2

RTTI

Run-Time Type Information

Run-Time시 객체에 관한 정보(Type등)을 알아내는 방법, 혹은 프로그래밍 기능.


자바의 경우 .getClass() 함수 등으로 해당 객체의 타입등을 알아낼 수 있다.

이에 대해 좀더 자세하게 알기위해선 리플렉션을 공부해야 할 듯

참조 : http://www.gisdeveloper.co.kr/610



박싱과 언박싱

기본타입에서 객체(박스) 타입으로 변환 시키는 것 : 박싱

int -> Integer

객체(박스) 타입에서 기본 타입으로 변환 시키는 것 : 언박싱

Integer -> int


기본타입은 단순히 자기 값만을 갖는다.

객체타입은 말그대로 객체.(힙 메모리에 올라간다)


객체타입은 Collections 등에서 키와 값등에 사용 된다.

Map<Integer, Integer> 형태.

위 맵에서 Integer를 꺼내와 기본 타입인 int 변수에 대입하면 자동으로 언박싱이 일어난다.

자바는 이런 오토 박싱, 오토 언방싱을 지원한다.


하지만 오토 박싱, 오토 언방식은 상당한 비용이 소모 되므로 다음과 같은 코드를 작성하는 것은 금물이다.

Integer sum = 100;  

for (int i = 0; i < 100; i++) {  

    //오토 박싱과 언박싱이 계속 해서 일어난다.

    sum += i;  

}



자바의 동적 클래스 로딩과 클래스 로더

http://javacan.tistory.com/entry/1

http://javacan.tistory.com/entry/2

http://javacan.tistory.com/entry/15

http://javacan.tistory.com/entry/28

어느정도 이해는 하겠는데... 명확하게 "어떨때 써야 겠다"란게 아직 와닿지 않는 부분...

아직 경험이 부족하단 소리인듯 하다.


어노테이션(Annotation)

JDK 1.5 부터 추가된 사항. 

일종의 메타데이터 기능이다. 어노테이션은 코드 조각의 작성자 명이나 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램의 일부가 아닌 프로그램에 관한 데이터를 제공해 준다.

 어노테이션을 사용하면 프로그램에서 컴파일러가 테스트하고 검증해야 하는 부가 정보를 정해진 형식으로 설명하는 것이 가능하다. 또한 설명 파일이나 새로운 클래스 정의를 생성하여 공통 코드를 작성하는 부담을 줄이는 용도로도 활용할 수 있다. 어노테이션을 사용하면 소스코드에 메타데이터를 보관할 수 있으며 컴파일 타임의 체크뿐 아니라 어노테이션 API를 사용하여 코드의 가독성을 높일 수 있다. 비록 자바 SE5가 제공하는 메타데이터의 종류가 많지 않지만 개발자의 자유로운 추가가 가능하므로 활용 가능성이 높다.


JCF(Java Collection Framework)

크게 세가지 형태로 분류

List - 순서가 있는 데이터 집합, 중복 허용

Set - 순서가 없는 데이터 집합, 중복 비허용

Map - 키,값의 쌍으로 이루어진 데이터 집합, 연관배열의 형태, 순서가 없다.


기본적으로 저 세가지의 큰형태에서 분화되어 

ArrayList, LinkedList

Set, TreeSet

HashMap, HashTable 등등등이 있다.

각각의 자세한 API는 다음의 블로그를 참조

http://enjoyjava.tistory.com/entry/Java-Collection-Framework-Overview


ArrayList

AbstratCollection<E>, AbstractList<E> 를 상속

Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 인터페이스를 구현

순서가 있다. 중복 허용.

기본 Capacity는 10. 이보다 데이터의 개수가 커지면 Capacity를 늘리는 알고리즘이 작동(시간이 걸림) 한다.

만일 사용하는 ArrayList에 최적인 Capacity를 구할 수 있다면 성능 향상을 꾀할 수 있다.

ThreadSafe 하지 않음


Stack

AbstratCollection<E>, AbstractList<E>,Vector<E> 를 상속

Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 인터페이스를 구현

후입선출


HashSet

AbstratCollection<E>, AbstractSet<E> 를 상속

Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E> 인터페이스를 구현

순서가 전혀 없음. Set중에 가장 좋은 성능

*LoadFactor : (데이터의 개수)/(저장공간)을 의미, 데이터의 갯수가 증가하여 설정한 로트팩터보다 커지면 재정리 작업이 발생 생성자중 HashSet(int initialCapacity, float loadFactor) 라는 로드팩터를 지정해주는 생성자가 있다.

데이터중 중복된 요소를 거르는데 유용함


LinkedList

AbstratCollection<E>, AbstractList<E>, AbstractSequentialList<E> 를 상속

Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E> 인터페이스를 구현

중간의 삽입 삭제가 자유로움.


HashMap

AbstractMap<K,V> 상속

Serializable, Cloneable, Map<E> 인터페이스를 구현

순서가 없다


TreeMap

AbstractMap<K,V> 상속

Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

순서가 있다. 

정렬 방식(Comparator 사용)을 정해주지 않으면 자연적인[?] 정렬(숫자>알파벳 대문자>알파벳 소문자> 한글) 순서로 정렬이 된다.




ArrayList와 LinkedList는 보통 어떤 때 쓰는가.

ArrayList의 경우 추가삭제가 적고 많은 조회가 이루어지는 데이터를 다룰 때

LinkedList의 경우 추가삭제가 빈번하게 일어나는 데이터를 다룰 때 사용한다.

http://codeflow.co.kr/question/251/linkedlist-%EC%99%80-arraylist-%EB%A5%BC-%EA%B0%81%EA%B0%81-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%82%98%EC%9A%94/


기본적으로 자바 API에 다 나와있는 이야기이나 역시 영어가ㅠㅠ