List 계열 / Map 계열 / Stack(스택) / Queue(큐) / 제네릭 / Random 클래스

2022. 10. 6. 08:20Dev.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>();



318~325

 

494

======== Ex7.java

< Random 클래스 >

  • 난수 발생 전용 클래스
  • 정수 뿐만 아니라 실수, boolean 타입까지 임의 생성 가능

  • r.nextDouble() ⇒ Math.random()

 

> nextInt(int bound) 메서드를 많이 사용

⇒ 0 <= x < bound 범위의 정수형 난수 발생(형변환도 필요없음)

  • 0은 보이는데 10 안보임

 

  • 0 안보이고 10 보임!

 

494p




728x90