2022. 10. 6. 08:20ㆍDev.Program/Java & Spring
======== 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>(); |
318~325
494
======== Ex7.java
< Random 클래스 >
- 난수 발생 전용 클래스
- 정수 뿐만 아니라 실수, boolean 타입까지 임의 생성 가능
- r.nextDouble() ⇒ Math.random()
> nextInt(int bound) 메서드를 많이 사용
⇒ 0 <= x < bound 범위의 정수형 난수 발생(형변환도 필요없음)
- 0은 보이는데 10 안보임
- 0 안보이고 10 보임!
494p
'Dev.Program > Java & Spring' 카테고리의 다른 글
예외(Exception) / 쓰레드(Thread) (1) | 2022.10.06 |
---|---|
java.util 클래스 / 정규표현식 / Pattern 클래스 / Matcher 클래스 (0) | 2022.10.06 |
Wrapper 클래스 / Collection Framework(컬렉션 프레임워크) (0) | 2022.10.06 |
[Math.random()] 로또 번호 생성 프로그램 (0) | 2022.10.06 |
StringBuffer 와 StringBuilder 클래스 / java.lang.Math 클래스 (1) | 2022.10.06 |