목차
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도
제네릭 자료형에 사용이 가능하다.
그리고
제네릭 자료형을 2개 이상 설정 가능하다.
콤마로 구분만 해주면 된다.
메인 함수에서는
< > 안에 각각의 자료형을 다 입력해 주고
그에 맞게 대입해 주면 된다.
2. Collection API
Collection API : 대량의 Data를 제어하는 용도로 설계된 클래스들
컬렉션 API에는 크게 3개의 인터페이스가 있다.
바로
1. List
2. Set
3. Map
이다.
List는 순서대로 저장되는 특징을 가졌고
우리가 배운 배열처럼 인덱스 번호를 가진다.
또 중복된 데이터 저장이 가능하며
위의 사진처럼 기차를 떠올리면 이해하기 쉽다.
Set은 순서대로 저장되지 않고
인덱스 번호도 없으며
데이터도 중복되지 않는다.
Map은 순서대로 저장되지 않고
인덱스가 없는 대신 Key와 Value로
저장되는 특징을 가진다.
key는 중복되지 않지만
value는 중복되는 특징을 가졌다.
위에서 List, Set, Map은
인터페이스라고 하였다.
이 인터페이스를 통해 만들어진
각각의 클래스들이 있다.
위의 사진에 나와 있는
ArrayList, Vector, HashSet... 등이 그 예시다.
1. 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()을 사용해서 출력해 보면 된다.
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는 요소를 추가/ 삭제를 할 땐 속도가 빠르나
특정요소값을 찾아올 땐 느리다.
사용법은 ArrayList와 같다.
하지만 보통 ArrayList를 사용한다.
Vector 역시 ArrayList와 기능이 같다.
다만 동기화 처리가 되어있는데
이는 thread를 배워야 이해할 수 있다.( 다음 글 참조)
이렇게 만든 List 클래스들의 부모클래스는
List이다. 이 말은 부모클래스를 이용해
업캐스팅이 가능하다는 것이다.
즉, 부모클래스의 참조변수를 이용해
자식객체를 참조하고 제어할 수 있다는 것이다.
2. Set
Set의 하위클래스는
HashSet, TreeSet, LinkedHashSet가 있다.
이 3가지 클래스는 성능의 차이가 있는데
HashSet이 성능이 가장 좋고
LinkedHashSet이 성능이 제일 꾸지다.
요소를 추가하는 등의 메소드는
같다.
다만 요소 추가 시
중복데이터는 저장되지 않는다.
그리고 인덱스 역시 없어서
get기능을 사용할 수가 없다.
그렇기에 모든 요소를 순차적으로 얻어 오는 경우가 많다.
인덱스가 없기에 for문을 사용할 수 없고
그렇기에 반복자를 활용하는 방법이나
배열로 변환하여 접근하는 방법이 있다.
(위의 사진을 참고하자)
3. Map
앞서 설명했듯
Map은 키-벨류 쌍으로 이뤄진 데이터를 저장하는 방식을 가졌다.
(key와 value를 쌍으로 저장하는 방식을 Entry라고 함)
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객체로 변환해서
얻어오는 방법도 있다.
이런 방법들의 실습은
안드로이드에 가서 자주 많이 한다고 한다.
그때 더 자세히 알아보고 실습도 해볼 것이다.!!
'# 개발 > Java' 카테고리의 다른 글
Java #12 - Stream, 바이트스트림, 문자스트림 (국비24일차) (0) | 2023.02.03 |
---|---|
Java #11 - Thread, runnable, 익명클래스, 동기화 (국비23일차) (0) | 2023.02.02 |
Java #9 -오브젝트 클래스, 예외(Exception) (국비21일차) (0) | 2023.01.31 |
Java #8 - 다형성(polymorphism), 추상(abstract), 인터페이스 (국비20일차) (0) | 2023.01.30 |
Java #7 - 상속, 오버라이드, Final (국비19일차) (0) | 2023.01.27 |