제네릭스(Generics)와 와일드 카드

컴퓨터/Java 2012. 11. 8. 05:02

제네릭스(Generics)와 와일드 카드 


자바 jdk 1.5에서 가장 큰 변화 중의 하나를 꼽자면 역시 제네릭스다 제네릭스는 다양한 타입의 객체를 다루는 메서드나 프레임워크들을 사용할때 컴파일 시 타입체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄인다.

예를 들어보자

List list = new ArrayList(); 라는 선언을 하였다면 list에는 String형이든 Integer형이든 사용자가 만든 객체 클래스이든 뭐든간에 저장이 가능하였다. 그래서 꺼내쓸때에 형변환을 해서 일일히 체크해 줘야 했고 예외처리되는 경우도 허다했다. 그러나 제네릭스의 등장으로 이러한 불편함이 사라졌다.

List<String> list = new ArrayList<String>();

위와 같은 선언은 list에 String형만 받아들인다는 뜻이다. 그렇다면 상속관계에 대해서는 어떻게 처리될까?

class Product {};

class TV extends Product{}; 라는 클래스가 있다고 가정하자 그리고 Product가 들어가는 ArrayList를 매개변수로 받는 메서드를 정의한다.

public static void printAll(ArrayList<Product> list){};

그렇다면 printAll(new ArrayList<Product>())는 당연히 들어갈 수 있을것이다. 그러나 Product를 상속받은 TV는 어떨까? printAll(new ArrayLIst<TV>())가 들어갈 수 있을까? 

답은 X 이다. 이클립스에서 컴파일 오류가 난다. 오류를 보면 printAll을 바꾸란다 그럼 어떻게 바꿔야 할까?? 답은 extends에 있다. 여기서 와일드 카드가 등장하고 와일드 카드를 통해 상속관계를 정의해 주면 된다.


받아오는 매개변수의 제네릭스 형을 ? extends Product라고 정의해주면 Product를 상속받은 모든 클래스를 사용할 수 있다. 그리고 extends와 반대로 ? super TV 라고 정의해 주면 TV의 조상 타입들을 받아 올 수있다. 나는 오늘도 자바의 객체지향성의 놀란다....

보통 이렇게 사용하지 않고 public static <T extends Product> void printAll(ArrayList<T> list)라고 사용하여 코드의 간결성을 향상시킨다. 

* 인터페이스를 매개변수로 받는다고 해도 제네릭스에서는 implements 가 아닌 extends를 사용한다.


제네릭스의 장점

- 타입안정성을 제공한다.

- 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

설정

트랙백

댓글

나의 첫 자바프로그램 단어암기장

컴퓨터/Java 2012. 11. 8. 00:53

음 그러니까 내가 갓 자바를 배우고 처음으로 동아리에서 과제를 내주었다.

게임을 만들어오라고 !! 처음엔 산성비같은 게임을 만들어보려했는데 어찌어찌 하다보니까 단어 암기장을 만들어버렸다.... 지금 열어보니까 정말 버그 투성이다. ㅋㅋㅋㅋ

클래스 관리도 제대로 안되있고 상속이랑 추상클래스는 누가 먹어버렸는지 extends 와 implements는 보이지도 않는다 ㅜ 뭐 중복되는 클래스가 없으니.... 그냥 매니저 클래스에 모든 기능을 다 때려박았네여 ㅋㅋ어휴 예외처리도 제대로 안되있고 메인쓰레드에 Sleep을 줘서 단어가 나오는동안 키보드로 쓰면 단어가 써지는 크나큰 버그까지 !!

그래도 내가 처음 짠 프로그램이라는데에 의의를 둔다. 

자바 상속 / 추상클래스 까지 배우고 안드로이드 한다고 급급했는데 어느정도 자바실력이 받쳐줘야 된다고  생각하고 다시 자바공부를 하고있다. 자바에 이렇게 좋은 프레임워크가 있었다니 ! 

어쨌든 소스를 올려본다...ㅋ 나중에 시간이 나면 GUI 구현하고 버그들 다 고쳐서 한번 제대로 만들어볼까?

'컴퓨터 > Java' 카테고리의 다른 글

제네릭스(Generics)와 와일드 카드  (0) 2012.11.08
자바 Vector 와 ArrayList , LinkedList의 차이점  (0) 2012.11.04

설정

트랙백

댓글

자바 Vector 와 ArrayList , LinkedList의 차이점

컴퓨터/Java 2012. 11. 4. 01:23

자바에서 리스트 인터페이스를 구현한 클래스는 ArrayList와 LinkedList

Stack 과 Vector등이 있습니다. 그 중  Vector와 ArrayList , LinkedList의 차이를 알아볼까요?

Stack은 말 그대로 자료구조중 하나인 Stack이고요.

Vector클래스와 List클래스들의 다른점은 동기화(synchronize)처리에 있습니다.

동기화란 한 스레드에서 공유자원에 작업을 마치기 전 까지는 다른 스레드에서 공유자원에 접근 하지 못하

게 약속하는것인데요. 안전성은 정말 좋은 일이지만 만약 하나의 스레드에서 작업을 한다고 하면 오히려 

성능의 저하를 가져오게 됩니다. Vector의 경우 무조건 동기화를 하기 때문에 단일 스레드 처리에서는 

ArrayList나 LinkedList보다 성능이 떨어집니다. Vector는 그래서 자바1.2 이후로는 거의 쓰이지 않는 비운

의 자료구조형이 되어버렸죠... ㅜㅜ

동기화가 필요할때는 Collection.synchronizedCollection(Collection c)를 이용하는것이 성능상 바람직 하겠습니다.

그럼 이제 ArrayList 와 LinkedList의 차이에 대해 알아볼까요? 

LinkedList에는 여러가지가 있지만 자바에서는 환형 더블 링크드리스트를 구현하였습니다. 링크드리스트에 대한 소개는 자료구조에서 따로 하겠습니다.


ArrayList는 배열로 구조가 간단하며 데이터를 읽어오는데 걸리는 시간이 가장 빠릅니다. 하지만 크기를 변경할 수 없고 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸립니다.


반면 LinkedList는 중간 데이터를 추가/삭제하는 경우 ArrayList보다 빠릅니다. 그러나 순차적으로 데이터를 추가/삭제 하는 경우에는 ArrayList가 LinkedList가 더 빠릅니다.

그러므로 ArrayList에는 순차적으로 데이터를 추가/삭제하거나 읽어오는 작업이 많을 때 사용하고

LinkedList는 비순차적으로 랜덤하게 데이터의 추가 또는 삭제가 필요할 때 사용해야합니다. 

때에 맞는 자료구조의 사용으로 인한 성능 향상은 조그마한 차이지만 매우 큰 결과를 나타냅니다.


이야기를 정리하자면,

Vector - 구버전 호환용으로 잘 사용되지 않고 동기화 처리가 내부적으로 일어나서 다른 객체들 보다 무겁다. 고로 왠만하면 다른 List클래스를 사용하는것이 좋습니다.

ArrayList - 배열의 복사에 의한 데이터 저장처리를 내부적으로 행하며, 각 데이터에 대한 인덱스를 가지고 있기 때문에 검색이 매우 빠르지만 많은 데이터의 추가 / 삭제시에는 배열의 복사가 빈번하게 일어나 성능이 떨어지는 단점이있습니다.

LinkedList - 다음 자료의 위치정보를 가지며, 내부적인 인덱스 가지고 있지않다. 데이터의 추가 / 삭제는 위치정보의 수정만으로 가능하기 때문에 많은 정보의 추가 / 삭제처리가 필요할때 유용하지만 데이터가 많은 경우의 검색시 처음 자료부터 순차적으로 찾아 나가야 하기 때문에 느려지는 단점이 있습니다.



'컴퓨터 > Java' 카테고리의 다른 글

제네릭스(Generics)와 와일드 카드  (0) 2012.11.08
나의 첫 자바프로그램 단어암기장  (0) 2012.11.08

설정

트랙백

댓글