Java #10 -Generic, Collection API (국비22일차)

 

 

목차

1. Generic

2. Collection AP

    1. List
    2. Set
    3. Map

 

 

 

1. Generic

 

Generic : 멤버의 자료형을 객체 생성할 때 정하는 문법

 Generic은 명칭이 정해지지 않은 상품이다.

즉 객체를 생성(new)할 때, 자료형을 입력하는 형태이다.

 

 

원래 클래스에 멤버변수를 선언할땐

자료형을 말해줘야 한다.

하지만 위의 사진처럼

작성한 경우

객체를 생성할 때 자료형을 결정할 수 있다.

객체를 생성할 때

메인함수로 돌아와서

<>을 사용해서 자료형을 결정하고

객체를 만들 수 있다.

 

자료형에는 Random과 같은 객체도 넣을 수 있다.(신기..)

 

제네릭 문법 유의사항

제네릭 문법을 사용할 때

int와 같은 기본 자료형은 사용할 수 없다.

 

하지만 Wrapper class를 사용하면

기본형 자료형을 이용할 수 있다.

위 사진에서 box3, box4를 참고하자.

 

그리고 Box를 생성하면서

자료형을 지정하지 않으면

Object 자료형으로 생성이 된다.

제네릭 자료형 getter, setter

이전에 배운

getter, setter도 

제네릭 자료형에 사용이 가능하다.

제네릭 자료형 2개 이상

그리고

제네릭 자료형을 2개 이상 설정 가능하다.

콤마로 구분만 해주면 된다.

메인 함수에서는

< > 안에 각각의 자료형을 다 입력해 주고

그에 맞게 대입해 주면 된다.

 

 

 

 

2. Collection API

Collection API : 대량의 Data를 제어하는 용도로 설계된 클래스들

 

컬렉션 API에는 크게 3개의 인터페이스가 있다.

바로

1. List
2. Set
3. Map

이다.

List, Set, Map 은 인터페이스이다.

List는 순서대로 저장되는 특징을 가졌고

우리가 배운 배열처럼 인덱스 번호를 가진다.

또 중복된 데이터 저장이 가능하며

위의 사진처럼 기차를 떠올리면 이해하기 쉽다.

 

Set은 순서대로 저장되지 않고

인덱스 번호도 없으며

데이터도 중복되지 않는다.

 

Map은 순서대로 저장되지 않고

인덱스가 없는 대신 Key와 Value로 

저장되는 특징을 가진다. 

key는 중복되지 않지만

value는 중복되는 특징을 가졌다.

인터페이스를 이용해서 만든 클래스들

위에서 List, Set, Map은

인터페이스라고 하였다.

이 인터페이스를 통해 만들어진

각각의 클래스들이 있다.

위의 사진에 나와 있는

ArrayList, Vector, HashSet... 등이 그 예시다.

 

 

 

    1. List

List 하위클래스

List는 인터페이스이기에 객체 생성이 불가하다.

따라서 우린 List를 구현한 하위클래스들을 사용해야 한다.

 

이 하위클래스는 ArrayList, LinkedList, Vector가 있다.

 

이렇게 하위클래스를 객체로 생성하여 사용하면 된다.

 

그럼 이 클래스들의 기능들을 알아보자.

 

1. 요소의 개수

요소의 개수

이렇게 쓰면 요소의 개수를 알 수 있다.

굳이 int size로 리턴 값을 받을 필요 없이

list.size()로 적어도 된다.

 

2. 요소의 추가

요소의 추가

요소를 추가하는 방법은 여러 개다.

String을 추가한다면

참조변수명을 적어도 되고

객체를 직접 생성해서 넣어도 된다.

또, String 객체를 만들 때 굳이 

new String을 선언하지 않았던 것처럼

원하는 문자열만 입력해도 된다.

 

3. 요소 얻어오기

요소 얻어오기

각 인덱스에 들어있는 요소를 가져올 때

사용한다.

그러나 존재하지 않는 인덱스 번호를

입력하면 예외 상황이 발생한다.

 

 

4. 요소 삭제하기

요소 삭제하기

remove()를 통해서 

간단하게

삭제가능하다.

이때 인덱스 번호를 괄호 안에 입력하게 된다.

 

 

5. 특정 위치에 요소 추가하기

특정 위치에 요소 추가하기

앞에 요소 추가할 때와

명령어는 같다.

다만 매개변수가 하나 더 늘어난다.

인덱스 번호를 먼저 입력해 주고

그다음 추가할 요소를 입력하면 된다.

 

6. 제거 시 참조변수로 제거 가능

제거시 참조변수로 제거 가능

앞서 remove를 사용할 땐

인덱스번호를 입력해서

해당 값을 제거했다.

하지만 참조변수가 있는 상황이면

참조변수명만 입력해 줘도 된다.

 

 

7. 요소 모두를 한 번에 제거

요소 모두를 한번에 제거

clear()를 사용해 주면

모든 요소가 제거된다.!!

 

8. 리스트가 비어있는지 확인하는 메소드

리스트가 비어있는지 확인하는 메소드

isEmpty라는 메소드를 사용하며

true / false 값으로 리턴된다.

 

9. 중복된 데이터가 허용 됨

중복된 데이터가 허용 됨

이는 List의 특징인데

중복된 데이터가 허용된다.

 

10. 특정 요소가 있는지 여부

특정 요소가 있는지 여부

contains라는 메소드를 통해

여부를 확인할 수 있으며

 true / false로 리턴이 된다.

 

11. 다른 리스트의 요소들을 한 번에 추가

다른 리스트의 요소들을 한번에 추가

list라는 객체에
list2의 요소들을 추가하고 싶을 때 사용하는 메소드다.

addAll( )을 사용한다.

 

그리고 단순하게 요소값을 보고 싶다면

toString()을 사용해서 출력해 보면 된다.

toString() 출력 시 결과물

 

12. 다른 리스트의 요소들과 같은 요소들 모두 제거

다른 리스트의 요소들과 같은 요소들 모두 제거

removeAll(리스트 객체명)을 사용하면

서로 중복되는 요소들을 다 제거할 수 있다.

 

13. 다른 리스트의 요소들과 같은 요소들만 남기기

다른 리스트의 요소들과 같은 요소들만 남기기

위의 상황과는 반대다.

두 리스트에서 같은 요소들만 남기는 메소드로

retainAll을 사용하면 된다.

 

14. 특정요소가 몇 번째에 있는지 리턴

특정요소가 몇번째에 있는지 리턴
결과 값

특정 요소가 몇번째에 있는지 알려주는 메소드다.

결과 값 사진처럼 4개의 요소를 가진 list가 있을 때

robin, sam, aaa를 각각 indexOf를 

써서 확인해 보면

1, -1, 0이 나타난다.

0 이상은 해당 숫자의 index에 있는 것이며

-1은 못 찾았다는 결괏값이다.

 

이때 여기서 중복된 값이 있다면 

첫 번째로 발견되는 값의 index 번호가 나온다.

만약 마지막 값을 찾고 싶다면

lastIndexOf를 사용해야 한다.

 

 

요소들을 순차적으로 얻어와서 출력

그럼 요소들을 순차적으로 얻어와서

출력하는 방법은 뭐가 있을까?

 

우선 for문을 사용해서 출력할 수 있다.

그리고 확장된 for문도 사용가능하다.

 

그리고 경우에 따라선

List를 배열로 변환해야 하는 경우도 있는데

String배열을 만들고

toArray를 써서 빈 배열에 요소들을 복사해 주면 된다.

 

(배열을 리스트로 변환하는 것은 어려우니 나중에 다시...)

 

 

LinkedList

LinkedList는 요소를 추가/ 삭제를 할 땐 속도가 빠르나

특정요소값을 찾아올 땐 느리다.

 

사용법은 ArrayList와 같다.

하지만 보통 ArrayList를 사용한다.

 

Vector

Vector 역시 ArrayList와 기능이 같다.

다만 동기화 처리가 되어있는데

이는 thread를 배워야 이해할 수 있다.( 다음 글 참조)

 

 

List up casting

이렇게 만든 List 클래스들의 부모클래스는

List이다. 이 말은 부모클래스를 이용해

업캐스팅이 가능하다는 것이다.

 

즉, 부모클래스의 참조변수를 이용해

자식객체를 참조하고 제어할 수 있다는 것이다.

 

 

 2. Set

Set의 종류

Set의 하위클래스는

HashSet, TreeSet, LinkedHashSet가 있다.

 

성능 차이

이 3가지 클래스는 성능의 차이가 있는데

HashSet이 성능이 가장 좋고

LinkedHashSet이 성능이 제일 꾸지다.

 

요소 추가

요소를 추가하는 등의 메소드는

같다.

다만 요소 추가 시

중복데이터는 저장되지 않는다.

 

그리고 인덱스 역시 없어서

get기능을 사용할 수가 없다.

 

그렇기에 모든 요소를 순차적으로 얻어 오는 경우가 많다.

 

인덱스가 없기에 for문을 사용할 수 없고

그렇기에 반복자를 활용하는 방법이나

배열로 변환하여 접근하는 방법이 있다. 
(위의 사진을 참고하자)

 

 

3. Map

앞서 설명했듯

Map은 키-벨류 쌍으로 이뤄진 데이터를 저장하는 방식을 가졌다.
(key와 value를 쌍으로 저장하는 방식을 Entry라고 함)

 

Map의 하위클래스 및 성능

HashMap이 가장 성능이 우수하고

TreeMap은 성능이 중간이지만 키값을 오름차순으로 저장한다.

그리고 LinkedHashMap은 저장된 순서대로 저장하지만 성능은 제일 꾸지다.

 

요소 추가

아무래도 다른 Collection API와 다르게

key와 value를 다 저장하는 방식이라

입력도 2가지를 다 입력해줘야 한다.

put을 사용하며 key를 먼저 그리고 value를 입력한다.

 

요소개수 확인 및 얻어오기

list의 메소드와 같다.

size로 확인을 하며

get을 통해 값을 얻어온다.

이때 키값을 입력해 줘야 value 값을 리턴한다!!

 

요소 삭제

요소 삭제도 list와 같은

remove를 사용한다.

키값을 정수로도 사용 가능

키값을 꼭 String이 아닌

Integer을 사용해서 쓸 수도 있다.

또한 사용자 정의 클래스를 value 값으로 사용가능하다.

 

 

순서대로 요소값 얻어오기

순서대로 요소값을 얻어오는 방법은

 Set과 비슷하다.

우선 인덱스 번호가 없으니 

for문들은 불가하다.

 

다른 방법으로는

키값들만 Set객체로 얻어와서 반복문으로 처리하는 방법이 있고

반복자를 사용해서 얻어올 수 있는 방법도 있다.

 

또 다른 방법으로는 

Map객체를 Set객체로 변환해서

얻어오는 방법도 있다.

 

 

 

 

 

이런 방법들의 실습은

안드로이드에 가서 자주 많이 한다고 한다.

그때 더 자세히 알아보고 실습도 해볼 것이다.!!