23-9 저장된 인스턴스의 순차적 접근 방법 1: enhanced for문의 사용
Iterable<T>는 Collection<E>의 부모.
//public interface Collection<E> extends Iterable<E> { 이건 무엇일까?
//23-9 예제
public class aaaa {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Toy");
list.add("Box");
list.add("Robot");
for (String s : list)
System.out.print(s + '\t');
}
}//Toy Box Robot
23-10 저장된 인스턴스의 순차적 접근 방법 2
hasNext와 next의 사용법 알기
23-11 Iterator 반복자의 세 가지 메소드
//23-11 예제
package java_1222;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
class aaaa {
public static void main(String[] args) {
List<String> list = Arrays.asList("Toy", "Box", "Robot", "Box");
list = new ArrayList<>(list);
for (Iterator<String> itr = list.iterator(); itr.hasNext();)
System.out.print(itr.next() + '\t');//hasNext에서 가져오고 next로 저 4개 뿌리기
System.out.println();
for (Iterator<String> itr = list.iterator(); itr.hasNext();) {
if (itr.next().equals("Box"))
itr.remove(); //Box랑 똑같으면 지우기
}
for (Iterator<String> itr = list.iterator(); itr.hasNext();)
System.out.print(itr.next() + '\t'); //지운거 뿌리기
System.out.println();
}
}//Toy Box Robot Box
//Toy Robot
23-12 배열보다는 컬렉션 인스턴스가 좋다. : 컬렉션 변환
컬렉션 인스턴스 = 셋리큐맵!!
컬렉션 인스턴스(ArrayList<E>)가 왜 좋은가? 배열을 캡슐화 했으니까
인스턴스의 저장과 삭제가 편하다. 반복자를 쓸 수 있다.
--전세계 개발자들이 다 외우고있으니까 꼭 외우기
Immutable - 배열이 하나 만들어졌는데 뭐하나 삭제하고싶으면 다시 카피해서 그부분 수정하는것.
List list = Arrays.asList("Toy", "Robot", "Box"); -- 이 예제는 교육용. 실무에서 잘 안쓰인다.
23-13 배열보다는 컬렉션 인스턴스가 좋다. : 이어서
23-14 배열 기반 리스트를 연결 기반 리스트로…
"Toy", "Box", "Robot", "Box" 를 리스트로 만듦
이걸 LinkedList로 만들고싶다면?
→ list = new LinkedList<>(list);
23-15 기본 자료형 데이터의 저장과 참조
int가 아닌 Integer가 왔으니 wrapper 클래스가 와야한다.
10을 넣어주면 당연히 오토박싱!
// 23-15 예제
package java_1222;
import java.util.Iterator;
import java.util.LinkedList;
class aaaa {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
//저장과정에서 오토박싱
list.add(10);
list.add(20);
list.add(30);
int n;
for (Iterator<Integer> itr = list.iterator(); itr.hasNext();) {
n = itr.next(); // 오토 언박싱
System.out.print(n + "\t"); //숫자니까 '\t'쓰면 계산됨
}
System.out.println();
}
}10 20 30
23-16 리스트만 갖는 양방향 반복자
23-17 양방향 반복자의 예
그냥 Iterator아니고 ListIterator임.
.hasPrevious() : 오른쪽에서 왼쪽으로 처리. (Box→Robot→Box→Toy 순으로!)
package java_1222;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
class aaaa {
public static void main(String[] args) {
List<String> list = Arrays.asList("Toy","Box", "Robot", "Box");
list = new ArrayList<>(list);
ListIterator<String> litr = list.listIterator();
String str;
while (litr.hasNext()) {
str = litr.next();
System.out.print(str + '\t');
if (str.equals("Toy"))
litr.add("Toy2"); //Toy를 Toy2로 바꾸는거 아니고 추가로 저장
} //의문 : 왜 Toy2 가 바로 추가되지않고 그다음 밑 코드부터 적용되는지???
//그냥 커서라고 생각하면됨.
System.out.println();
while (litr.hasPrevious()) {
str = litr.previous();
System.out.print(str + '\t');
if (str.equals("Robot")) // "Robot"만나면 "Robot2"저장
litr.add("Robot2");//Robot을 Robot2로 바꾸는거 아니고 추가로 저장
}
}
System.out.println();
// 다시 왼쪽에서 오른쪽으로
for (Iterator<String> itr = list.iterator(); itr.hasNext();)
System.out.print(itr.next() + '\t');
System.out.println();
}
}//1//Toy Box Robot Box
//2//Box Robot Robot2 Box Toy2 Toy
//3//Toy Toy2 Box Robot2 Robot Box
// 출력 설명 : //2// Toy와 Toy2는 이미 적용되었기 때문에 순서가 Toy다음 Toy2.
//Robot은 hasPrevious 에 바로 적용된거여서 Robot2 다음 Robot.
의문↓
package java_1222;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
class aaaa {
public static void main(String[] args) {
List<String> list = Arrays.asList("Toy","Box", "Robot", "Box");
list = new ArrayList<>(list);
ListIterator<String> litr = list.listIterator();
String str;
while (litr.hasPrevious()) {
str = litr.previous();
System.out.print(str + '\t');
if (str.equals("Toy"))
litr.add("Toy2");
} //의문 : 얜 왜 출력이 안되는지???
//.hasPrevious() 이전의 코드가 존재하지 않기 때문에 컴파일되지 않음 - 그냥 얘 특징
System.out.println();
while (litr.hasPrevious()) {
str = litr.previous();
System.out.print(str + '\t');
if (str.equals("Robot"))
litr.add("Robot2");
}
}
}
23-18
set = 집합
23-19 Set을 구현하는 클래스의 특성과 HashSet 클래스
Set<E>의 2가지 특성 반드시 알기!!(함수(set)의 특성과 같다)
• 저장 순서가 유지되지 않는다.
• 데이터의 중복 저장을 허용하지 않는다.
Toy부터 넣었음에도 Toy부터 안뿌린다.
//23-19 예제
package java_1222;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class bbbb {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Toy");
set.add("Box");
set.add("Robot");
set.add("Box");
System.out.println("인스턴스 수: " + set.size());
// 반복자를 이용한 전체 출력
for (Iterator<String> itr = set.iterator(); itr.hasNext();)
System.out.print(itr.next() + '\t');
System.out.println();
// for-each문을 이용한 전체 출력
for (String s : set)
System.out.print(s + '\t');
System.out.println();
}
}//인스턴스 수: 3
//Box Robot Toy
//Box Robot Toy
+예제 - set이용해서 로또 만들기
//로또만들기 예제
package java_1222;
import java.util.HashSet;
import java.util.Set;
public class bbbb {
public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
while (set.size() < 6) {
set.add((int) ((Math.random() * 45) + 1));
}
System.out.print(set);
} //set만 넣어주면 알아서 [ , , ]까지 넣어줌
}//[17, 33, 18, 5, 8, 10]
23-20 동일 인스턴스에 대한 기준은?
1. 동일 인스턴스가 내부적으로는 Box와 Box가 같다는걸 비교하기위해 equals(함수오버라이딩)를 호출한다.(true이게 되면 동일 인스턴스로 판단)
(1.만족하면)2. hashCode(객체의 짜가주소라고 생각했던것 - @233k4j2k)를 호출한다. (hashCode는 Object에 있다.)
a.hashcode() 해주면 a에서 짜가주소를 16진수로 바꿔서 숫자주소로 나온다.
해시 함수(hash function)
-탐색키를 입력받아 해시 코드(hash code) 및 해시 주소 생성
-이 해시 주소가 배열로 구현된 해시 테이블(hash table)의 인덱스
23-21 해쉬 알고리즘의 이해
↑ num%3하면 3으로 나눴을때 나머지 0,1,2로 나눠지는 수로 분류함.
1.캐비넷만든다.
2.같은 값 들어오면 해당 방만들어졌는지 확인하고, 요소 비교할때 equals 호출해서 비교한다.
3.같은 값있으면 패스함
23-22 HashSet의 인스턴스 동등 비교
23-23 HashSet 인스턴스에 저장할 클래스 정의 예
//23-23 예제
package java_1222;
import java.util.HashSet;
class Num {
private int num;
public Num(int n) {
num = n;
}
@Override
public String toString() {
return String.valueOf(num);
}
@Override //2.해시코드 -만약이거안하게되면 set.size() 3개나옴
//why? 오버라이딩을 안하면 부모에있는 해시코드를 호출하게되기 때문
//해시코드(집합만드는것)이 분류되는것이 주소값으로 돼서
public int hashCode() {
return num % 3; // num의 값이 같으면 부류도 같다.
}
@Override //1. 이퀄즈
public boolean equals(Object obj) {
if (num == ((Num) obj).num)
return true;
else
return false;
}
}
public class bbbb {
public static void main(String[] args) {
HashSet<Num> set = new HashSet<>();
set.add(new Num(7799)); //같을 조건은 equals와 hashcode
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수 : "+set.size());
for(Num n : set)
System.out.print(n.toString()+ '\t');
System.out.println();
}
}//인스턴스 수 : 2
//9955 7799
오늘의 문제
1.ArrayList 와 LinkedList 의 장단점은?
ArrayList 는 배열을 한번 복사하는데도 시간걸림, 지우는것도 시간 걸림 - 배열의 단점 그대로.(단점)
검색(=참조)은 빠르다. 다이렉트로 찾아감(장점)
LinkedList 는 검색은 느리다.(단점)
저장공간은 객체를 하나씩 늘리기때문에 과정이 간단.(장점)
2.Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력받아 저장하고 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라
정수(-1이 입력될 때까지)>> 10 6 22 6 88 77 -1
가장 큰 수는 88
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;
public class BigNum {
public static void main(String[] args) {
System.out.println("정수를 입력하세요");
Scanner sc = new Scanner(System.in);
List<Integer> list = Arrays.asList(sc.nextInt());
list = new ArrayList<>(list);
ListIterator<Integer> litr = list.listIterator();
while (true) {
int num = sc.nextInt();
list.add(num);
if (list.get(list.size() - 1) == -1) {
break;
}
}
Collections.sort(list);
System.out.println(list.get(list.size() - 1));
}
}
//다른분 코드
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class PositiveNumberPrint {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("정수(-1이 입력될 때까지)>>");
List<Integer> list = new LinkedList<>();
int num = 0;
while(num != -1) {
num = sc.nextInt();
list.add(num);
}
sc.close();
//↓이거 무조건 외우기★★
int maxNum = 0;
for(int i=0; i<list.size(); i++) {
if(list.get(i) > maxNum) {
maxNum = list.get(i);
}
}
System.out.println("가장 큰 수는 " + maxNum);
// 더욱 간결한 방법이 있나 찾아보다가 알게된 방법
// System.out.println("가장 큰 수는 " + Collections.max(list));
}
}
3.로또 프로그램을 작성하시오.(Set 으로)
public class lottoMain {
public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
while(set.size() < 6) {
set.add((int)((Math.random()*45)+1));
}
System.out.print(set);
}
}
4.Set에 대하여 설명하시오.
set = 함수
-저장 순서가 유지되지 않는다.
-데이터의 중복 저장을 허용하지 않는다.
5.도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하고, 도시 이름을 '키'로 하는 HashMap<String, Location> 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라. 그리고 도시 이름으로 검색하는 프로그램을 작성하라.
도시, 경도, 위도를 입력하세요.
>> 서울, 37, 126
>> LA, 34, -118
>> 파리, 2, 48
>> 시드니, 151, -33
----------------------------------
서울 37 126
LA 34 -118
파리 2 48
시드니 151 -33
----------------------------------
도시 이름 >> 피리
피리는 없습니다.
도시 이름 >> 파리
파리 2 48
도시 이름 >> 그만
6.Scanner 클래스를 사용하여 6개 학점('A', 'B', 'C', 'D', 'F')을 문자로 입력받아 ArrayList에 저장하고, ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여 평균을 출력하는 프로그램을 작성하라.
6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F) >> A C A B F D
2.3333333333333335
↓풀이
public class Main {
public static void main(String[] args) {
Grade grade = new Grade();
grade.inputGrade();
System.out.println(grade.getAverage());
}
}
class Grade {
private ArrayList<String> grade;
public Grade() {
grade = new ArrayList<String>();
}
public void inputGrade() {
Scanner scanner = new Scanner(System.in);
System.out.print("6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F) >> ");
while(grade.size() < 6) {
grade.add(scanner.next());
}
}
public double getAverage() {
double avg;
double sum = 0;
for(String e : grade) {
switch(e) {
case "A" : //정수와 String문자열 들어갈 수 o
sum += 4.0;
break;
case "B" :
sum += 3.0;
break;
case "C" :
sum += 2.0;
break;
case "D" :
sum += 1.0;
break;
}
}
avg = sum / 6;
return avg;
}
}
7.출력이 아래와 같이 나오도록 하시오(필수).
HashSet<Num> set = new HashSet<>();
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());
for(Num n : set)
System.out.print(n.toString() + '\t');
System.out.println();
====출력
인스턴스 수: 2
7799 9955
package java_1222;
import java.util.HashSet;
public class HashMain {
public static void main(String[] args) {
HashSet<Num> set = new HashSet<>();
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());
for (Num n : set)
System.out.print(n.toString() + '\t');
System.out.println();
}
}
class Num{
private int num;
public Num(int n){
num = n;
}
@Override
public String toString() {
return String.valueOf(num);
}
@Override
public int hashCode() {
return num%2;
}
@Override
public boolean equals(Object obj) {
if(num == ((Num)obj).num)
return true;
else
return false;
}
}
8.Set 호출되는 원리와 순서를 설명하시오?
9.아래와 같이 출력되도록 하시오.
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));
System.out.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);
============
저장된 데이터 수: 2
[LEE(10세), PARK(35세)]
package java_1222;
import java.util.HashSet;
public class HashMain {
public static void main(String[] args) {
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));
System.out.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);
}
}
class Person{
private int age;
private String name;
public Person(String n, int a){
name = n;
age = a;
}
@Override
public String toString() {
return String.valueOf(name+"("+age+"세)");
}
@Override
public int hashCode() {
return age%2;
}
@Override
public boolean equals(Object obj) {
if(age == ((Person)obj).age)
return true;
else
return false;
}
}//저장된 데이터 수: 2
//[LEE(10세), PARK(35세)]
//↑ hashset출력값 순서가 계속 바뀌어서 나와도 상관없다
'코딩 > 수업 정리' 카테고리의 다른 글
20.12.28 Mon [025] (0) | 2020.12.28 |
---|---|
20.12.24 Thu [024] JSP (0) | 2020.12.24 |
20.12.21 Mon [021] (0) | 2020.12.21 |
20.12.18 Fri [020] (0) | 2020.12.18 |
20.12.17 Thu [019] (0) | 2020.12.17 |
댓글