본문 바로가기
코딩/수업 정리

20.12.22 Tue [022]

by 6^6 2020. 12. 22.
728x90

 

 

 

 

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출력값 순서가 계속 바뀌어서 나와도 상관없다

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

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

댓글