List 계열 / Map 계열 / Stack(스택) / Queue(큐) / 제네릭 / Random 클래스
2022. 10. 6. 08:20ㆍDev.Program/Java & Spring
728x90
======== JAVA0403 → Ex.java 만들기
p. 502
< List 계열 >
저장 데이터의 순서 유지, 중복 허용
저장되는 데이터에는 자동으로 인덱스가 부여됨(0번부터 시작) = 배열과 동일
구현체 클래스 : ArrayList, Vector
기본적인 메서드 대부분 Set 계열과 동일(= 부모가 같기 때문)
밑에 java.awt는 다른거! 주의!
toString 생략(출력때만 가능)
출력창
중복데이터 추가 가능
Set 과의 큰 차이점
출력창
오류! 존재하지 않는 인덱스를 지정했기 때문
오류창 확인 ) java.lang.IndexOutOfBoundsException
출력창
indexOf() 특정 요소가 존재하는 인덱스 번호 리턴 ⇒ 여기선 0번째라 0 리턴
정수 2 삭제해보기!
int를 넣는것, Object를 넣는게 있음
list.remove(2) 라고 쓰면 인덱스 번호 2번인 3.14가 지워짐
list.remove(1) ⇐ 인덱스 번호 1번
list.remove((Object)2); ⇐ 정수 2 ( → Object 타입으로 형변환 )
이렇게 지워야 함!
> 가장 좋은 방법은 indexOf() 와 같이 쓰는 것!
list.remove(list.indexOf(2));
indexOf()를 통해 정수 2를 찾아서 인덱스를 리턴받아 삭제
해당 인덱스의 요소를 교체함(add 는 추가 *차이점)
없는 인덱스일 경우 오류 발생!
리턴타입 list
시작인덱스 부터 끝 인덱스-1 까지 요소 추출
저번에 subString 배운 거랑 비슷
배열로도 추출 가능
list2 만들어서 숫자 랜덤하게 집어 넣기
> Collections 클래스의 static 메서드 sort() 사용 시 List 객체 정렬 가능
list2 객체 요소 정렬(같은 타입 요소만 가능)
> Collections 클래스의 static 메서드 shuffle() 사용 시 List 객체 순서 뒤섞기
리턴타입 list
Arrays.asList() 메서드를 호출하여 데이터를 연속적으로 전달하면 List 타입 객체로 리턴됨(한번에 List 객체 데이터 추가 가능)
508
528 Map
======== Ex2.java
< Map 계열 >
키(Key) 와 값(Value) 을 한 쌍으로 갖는 자료구조
키는 중복 불가능, 값은 중복 가능
구현체 클래스 : HashMap, Properties 등
java.util
1) put(Object key, Object value) : 키에 해당하는 데이터 추가
리턴타입 오브젝트
> 중복되는지 확인해보자
키 값이 중복될 경우 값(Value)을 덮어씀
2) get(Object key) : 키에 해당하는 데이터 리턴(키가 없을 경우 null 값 리턴됨)
키가 없을 경우 null 값 리턴됨
3) Set keySet() : Map 객체 내의 모든 키 리턴 → Set 타입 객체로 리턴
리턴타입 set
4) values() : Map 객체 내의 모든 값 리턴 → Collection 타입 객체로 리턴
> 값들 중에 중복을 다 날리고 싶으면 set(아니면 list)
오류! 형변환 필요 (List 도 마찬가지)
형변환하면 오류 사라짐
System.out.println("모든 값 : " + map.values()); // Set 또는 List 계열 변수에 바로 저장 불가(다운캐스팅도 불가) //Set valueSet = (Set)map.values(); //List valueList = (List)map.values(); // Set 또는 List 계열 객체 생성 시 파라미터로 전달 가능 Set valueSet = new HashSet(map.values()); System.out.println(valueSet);
## tip. map 을 가장 잘 표현한게 전화번호부(이름은 중복되는데 전화번호는 중복안되니까)
→ 보통은 키에 전화번호, 값에 이름 넣어서 전화번호부 만들 수 있음!
똑같이 나오는 것 같지만 다름!
map2 는 리턴타입 String(toString 생략되어있음)
entrySet은 Set으로 리턴
530
537 properties
======== Ex3.java
< Stack(스택) >
하나의 상자에 데이터를 아래쪽(bottom)에서부터 차례대로 쌓는 자료구조
데이터가 한쪽(top)에서만 삽입/삭제 이루어짐
FILO(First In Last Out) 또는 LIFO(Last In First Out) 구조라고 함
2개의 스택을 사용하여 웹브라우저 뒤로/앞으로, 응용프로그램 Redo/Undo 구현
add 는 벡터!!! 이거 아님!! (벡터는 안씀)
우린 push (값 입력)
> Object peek() : 맨 위의 요소를 꺼내서 확인(제거하지 않음)
peek 엿보다
꺼내오는게 아니라 꺼내서 확인~~
출력창
> Object pop() : 맨 위의 요소를 꺼내서 확인(제거함)
출력창
======== Ex4.java
< Queue(큐) >
한 쪽에선 추가, 반대쪽에선 삭제가 일어나는 자료구조(FIFO 또는 LILO 구조)
구현체 클래스로 LinkedList 를 사용하며 LinkedList 는 Queue 와 List 모두를 구현한 구현체
LinkedList 는 List도 부모, Queue도 부모
> offer(Object o) : 데이터 추가
offer 사용하면 Queue 구조 사용
> peek() : 데이터 꺼내기
> poll() : 데이터 꺼내기
처음 넣은 게 제일 먼저 나옴! (Stack 이었다면 a.txt 가 나왔을 것)
은행에서 가장 많이 쓰임(번호표 같은거)
⇒ 어려우면 다 버려~~! 자료구조는 몰라도 괜찮다. 참고 정도로만 봐 두기
자료구조를 알면 좀 더 수월해지고 효율이 높아지지만, 코드짜는거랑은 상관 없음!
314 제네릭
======== Ex5.java
지금까지 노란줄 그냥 놔뒀는데 Raw Type(원시타입) 이라고 알려주던 것!
오브젝트 타입 ⇒ 숫자든 문자든 등등 아무거나 다 넣을 수 있음(장점)
근데 꺼낼 때가 문제
⇒ 이걸 한번에 int 형에 넣어서 뽑아올 수 있을까? 안됨. 다른 타입이 있기 때문
오류!
형변환 하면 오류는 사라지지만 실행하면 오류!
Object 타입으로는 사용 가능
기본형 타입 지정 시 오류!
클래스명 뒤에 <> 기호를 명시하고 기호 사이에 참조형 타입을 지정
ArrayList 객체에 저장 가능한 타입이 Integer 타입으로 고정됨
오브젝트 아님!! 이제 Integer 타입으로 고정되었기 때문에 Integer 타입으로 나옴
Integer 타입만 추가 가능하기 때문에 문자열 추가 시 오류!
그냥 이렇게 출력 가능
(형변환이나 형변환이 가능한지 instanceof로 판별하는게 필요 없다)
리턴타입이 정수형이기 때문!
출력 잘 됨!
map 도 이렇게 응용 가능! 값이 두개기 때문에 타입도 두가지 지정 가능!
======== Ex6.java
생성자 만들기
오류! Object 연산자끼리는 산술 연산 불가능
만약, int형 파라미터를 전달받는 메서드가 있을 경우
오류 안뜸!
기본 생성자도 추가
> 위(main() {})에서 호출해보기
연산 가능
이렇게 넣는 건 가능!
⇒ 다시 다 지우기,,,! 간단하게 해보자!
GETTER, SETTER 만들기
위에서 이렇게 넣는 건 가능!
> Object 타입을 사용하여 관리하는 데이터는 가져올 때 체크 필요
이렇게는 오류 안나지만
java.lang.ClassCastException
실행해보면 오류뜸
< 제네릭을 사용한 클래스 정의 >
클래스 정의 시점에서 클래스명 뒤에 <> 기호를 사용하여 "가상의 자료형" 명시
⇒ 보통 1글자의 영문대문자를 사용(주로 E 또는 T 지정)
가상의 자료형이므로 클래스 정의 시점에서는 정확한 자료형을 알 수 없음
⇒ 단, 클래스 내에서 지정된 가상의 자료형을 실제 자료형 대신 사용 가능
해당 클래스의 인스턴스 생성 시점에서 가상의 자료형 대신 실제 자료형을 지정하면 가상의 자료형이 명시되어있는 부분의 코드가 모두 실제 자료형으로 변환됨
⇒ 어떠한 자료형으로도 바꿀 수 있다!
<T> 지우면 이렇게 오류생김
지금은 가상으로 T 라고 두고 나중에 T 자리에 어떤 형 쓸 지 정할거야~~ 하고 알려주는거
getter, setter 등의 메서드에서도 명확한 타입 대신 T 라는 가상의 타입 사용
< main() {} 호출 >
< 제네릭을 사용한 클래스의 인스턴스 생성 >
클래스명 뒤에 제네릭 타입을 참조형으로 명시하여 고정시킴
어떤 타입이든 참조형 타입이면 모두 지정 가능하므로 Object 처럼 사용 가능
1. 제네릭 타입 T 를 Integer 타입으로 변경
뒤에 <>는 생략가능하지만 우리는 공부중이라 생략하지 말 것
Integer 타입으로 바뀌어있음.
String 타입 넣을 경우 오류!
2. 제네릭 타입 T 를 double 타입으로 변경
더블타입 입력 가능
3. 제네릭 타입 T 를 String 타입으로 지정
스트링도 똑같다
+
밑에 person 클래스 + 생성자까지 만들기
4. 제네릭 타입 T 를 Person 타입으로 지정
이렇게 출력 가능
5. 제네릭 타입을 지정하지 않을 경우
Object 타입으로 전부 바뀌어있음
모든 데이터 타입 사용 가능
우리 JSP 시간에 쓰는 arrayList 등등도 Object 타입으로 쓰고 있는 거다!
⇒ arraylist, map 등등이 이런식으로 만들어져있는거! Ex6.java은 그런식으로 우리가 만들어본거다. ( 우리가 이렇게 만들어서 쓸 일은 없음 )
실제 제네릭을 적용한 Collection API 들
List<String> list = new ArrayList<String>(); Set<Integer> set = new HashSet<Integer>(); Map<String, Integer> map = new HashMap<String, Integer>();