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

20.12.18 Fri [020]

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

class Rectangle implements Comparable {
	private int width;
	private int heigth;

	public Rectangle(int width, int heigth) {
		this.width = width;
		this.heigth = heigth;
	}

	public int getArea() {
		return width * heigth;
	}

	// ★양수의 의미 - 자리바꿈이 일어남
	// ★음수의 의미 - 자리바꿀 필요x
	@Override
	public int compareTo(Object o) {

		// 또는 Arrays.sort(recs); 로 바로 쓸 수 있다.
		// 근데 오름차순만 가능
		// 따라서 Arrays.sort(recs);를 직접 구현해보기
		// 매우중요!↓
		return this.getArea() - ((Rectangle) o).getArea();
		// 자기거. //남의거.
		// this.=5 , (o).get = 3
		// 두개비교해서 양수면 내림차순
		// 솔팅은 기본적으로 오름차순임.
		// 오름차순넣고싶으면 두개 바꿔야함(양수의 의미)

		// return ((Rectangle)o).getArea() - this.getArea() ;
		// 이렇게 쓰면 음수,양수,zero로 나눠지게됨

	}
}

class RecArrays {
	// ↓sort!!
	public static Rectangle[] sort(Object[] arrRecs) {
		// 배열들어가는 객체생성도 헷갈리니 꼭 외우기
		Rectangle[] recs = (Rectangle[]) arrRecs;
		Rectangle temp = null;

		if (recs instanceof Comparable[]) {
			// Comparable이 없으면 compareTo도 없어도된다.
			// 있으면 반드시 compareTo있어야함.-이렇게 구현하도록 만들었기 때문

			// 버블 솔팅 ★ 외우기★
			for (int i = 0; i < recs.length; i++) {
				for (int j = 0; j < recs.length - i - 1; j++) {

					if (recs[j].compareTo(recs[j + 1]) > 0) {
						temp = recs[j]; // 0보다 크면 자리 바꿔라. 라는 뜻.
						recs[j] = recs[j + 1];
						recs[j + 1] = temp;

						// 또는 Arrays.sort(recs); 로 바로 쓸 수 있다.
						// 근데 오름차순만 가능
						// 따라서 Arrays.sort(recs);를 직접 구현해보기
						// 매우중요!

					}
				}
			}

		} else {

			for (int i = 0; i < recs.length; i++) {
				for (int j = 0; j < recs.length - i - 1; j++) {
					if (recs[j].getArea() > recs[j + 1].getArea()) {
						temp = recs[j];
						recs[j] = recs[j + 1];
						recs[j + 1] = temp;
					}
				}
			}

		}

		return recs;
	}
}

public class RectSortMain {

	public static void main(String[] args) {

		Rectangle[] recArr = { new Rectangle(6, 6), new Rectangle(5, 5), new Rectangle(10, 10), new Rectangle(12, 12),
				new Rectangle(11, 11) };

		RecArrays.sort(recArr);

		System.out.println(recArr.toString());

		for (Rectangle rec : recArr) {
			System.out.println(rec.getArea());
		}

	}

}//근데 호출 주솟값으로 나옴

20-17 수학 관련 연산 기능을 제공하는 Math 클래스

//20-17 예제
package java_1218;

public class MathCless {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("원주율 " + Math.PI);
		System.out.println("2의 제곱근 " + Math.sqrt(2));

		System.out.println("파이에 대한 degree " + Math.toDegrees(Math.PI));
		System.out.println("2파이에 대한 Degree " + Math.toDegrees(2.0 * Math.PI));
		double radian45 = Math.toRadians(45);
		System.out.println("싸인45 " + Math.sin(radian45));
		System.out.println("코싸인45 " + Math.cos(radian45));
		System.out.println("탄젠트45 " + Math.tan(radian45));

		System.out.println("로그25 " + Math.log(100));
		System.out.println("2의 16승 " + Math.pow(2, 16));

	}
}/*원주율 3.141592653589793
2의 제곱근 1.4142135623730951
파이에 대한 degree 180.0
2파이에 대한 Degree 360.0
싸인45 0.7071067811865475
코싸인45 0.7071067811865476
탄젠트45 0.9999999999999999
로그25 4.605170185988092
2의 16승 65536.0*/

 

System.out.println("2의 제곱근: " + Math.sqrt(2)); static 으로 선언됨

pow = 제곱, 승

 

 

 

 

 

 

20-18 난수의 생성

 

 

 

 

 

20-19 난수 생성의 예

this(System.currentTimeMillis()); 외워두기 - 현재시간을 1970년 1월1일부터 long형 정수로 바꿔버림. 

 

 

 

 

20-20 문자열의 토큰 구분 StringTokenizer  - 자주씀

구분자는 위에 예시에선 ":"    /    토큰은 위에 예시에선 "PM ,08, 45"임.

 

 

 

 

 

 

20-21 문자열의 토큰 구분의 예

StringTokenizer는 구분자를 따로 빼서 쓴다.

 

package java_1218;

import java.util.StringTokenizer; //이거 안쓰면 오류남

public class MathCless {

	public static void main(String[] args) {

		StringTokenizer st1 = new StringTokenizer("AM:10:07", ":");

		while (st1.hasMoreTokens())
			System.out.print(st1.nextToken() + ' ');
		System.out.println();

		StringTokenizer st2 = new StringTokenizer("12 + 36 - 8 / 2 = 44", "+-/= ");

		while (st2.hasMoreTokens())
			System.out.print(st2.nextToken() + ' ');
		System.out.println();

	}
}

 

 

 

 

 

20-23

 

 

 

20-24

copyOf하면 배열이 다른 주솟값에 그대로 복사되는 것이다.

배열은 immutable이다

//20-24 예제
package java_1218;

import java.util.Arrays;

public class copyOfclass {
	public static void main(String[] args) {

		double[] arOrg = { 1.1, 2.2, 3.3, 4.4, 5.5 };

		// 배열 전체를 복사
		double[] arCpy1 = Arrays.copyOf(arOrg, arOrg.length);

		// 세번째 요소까지만 복사
		double[] arCpy2 = Arrays.copyOf(arOrg, 3);

		for (double d : arCpy1)
			System.out.print(d + "\t");
		System.out.println();
		for (double d : arCpy2)
			System.out.print(d + "\t");
		System.out.println();

	}

}//1.1	2.2	3.3	4.4	5.5	
//1.1	2.2	3.3	

 

 

 

 

 

20-25 arraycopy 메소드 호출의 예

 

 

 

20-26 두 배열의 내용 비교

System.out.println(Arrays.equals(ar1, ar2)); equals는 오버로딩! 

public static boolean equals(int[] a, int[] a2) ↑파라미터 값이 다르기때문에

 

public class ArrayClass {
	public static void main(String[] args) {

		int[] ar1 = { 1, 2, 3, 4, 5 };
		int[] ar2 = Arrays.copyOf(ar1, ar1.length);
		System.out.println(Arrays.equals(ar1, ar2));
	}

	public static boolean equals(int[] a, int[] a2) {

		return true;
	}

}
//true

 

 

 

20-27  인스턴스 저장 배열의 비교 예

 

 

20-28  Arrays의 equals 메소드가 내용을 비교하는 방식

ar1,ar2

equals는 다형성(폴리몰티즘)으로 들어감!

Object[] a 와 b가 넘어옴.

Object o1 = a[i] -- a[i]은 o1로 주소가 들어가는것임

Objcet o2 = a2[i] -- 주소가 들어가는 것임

equals는 주소를 비교 -- false밖에 나올 수 없음

 

근데 true나오게하고싶으면? equals object 오버라이딩을 해주면된다!↓예시

 

20-29 Object 클래스의 equals 메소드는?

 

 

20-30 Object 클래스의 equals 메소드 오버라이딩 결과

@Override - 자식을 호출하게되면서 true호출

이럴때 꼭 오버라이딩 해줘야한다.

 

//20-32 예제

public class equalsOverridingClass {
	public static void main(String[] args) {

		INum[] ar1 = new INum[3];
		INum[] ar2 = new INum[3];
		ar1[0] = new INum(1);
		ar2[0] = new INum(1);

		ar1[1] = new INum(2);
		ar2[1] = new INum(2);

		ar1[2] = new INum(3);
		ar2[2] = new INum(3);
		System.out.println(Arrays.equals(ar1, ar2));
	}
}

class INum {
	private int num;

	public INum(int num) {
		this.num = num;
	}

	@Override
	public boolean equals(Object obj) {
		if (this.num == ((INum) obj).num)
			return true;
		else
			return false;
	}
}

 

 

20-31 배열의 정렬: Arrays 클래스의 sort 메소드

Arrays.sort()에서 이미 퀵솔트됨!

 

 

 

20-32 오름차순 정렬이란?

 

 

20-33 compareTo 메소드 정의 기준

interface에 Comparable과 compareTo가 있다.

 

 

 

20-34 클래스에 정의하는 오름차순 기준

 

오버라이딩이니까 자식이 구현

 

 

 

20-35 다음과 같이 구현도 가능!

 

 

 

 

 

20-36 배열에 저장된 인스턴스들의 정렬의 예

 

//20-36 예제
import java.util.Arrays;

public class compareToclass {
	public static void main(String[] args) {

		Person[] ar = new Person[3];
		ar[0] = new Person("Lee", 29);
		ar[1] = new Person("Goo", 15);
		ar[2] = new Person("Soo", 37);

		Arrays.sort(ar);
		for (Person p : ar)
			System.out.println(p);

	}

}

class Person implements Comparable {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Object o) {

		Person p = (Person) o; //이게 무슨뜻?
		return this.age - p.age;// 양수이기때문에 오름차순, 
							//두개순서 바꾸면 내림차순
	}

	public String toString() {
		return name + ": " + age;
	}
}

 

 

Arrays.sort(ar);

public int compareTo(Object o) 여기로 값을 준다. (그렇게 만들어졌기때문에) - 많이 헷갈려함

 

20-37 배열의 탐색: 기본 자료형 값 대상

binarySearch해서 찾아라! 라고 말함

퀵솔트랑 비슷한 탐색

 

 

 

 

 

20-38 배열의 탐색: 기본 자료형 값 대상의 예

binarySearch는 정렬된 상태에서 들어가야한다. - Arrays.sort(ar) 해준다음에 들어가야 제대로된 값이 나온다.

가지를 치면서 정렬 : 12345면 3을 중심으로 두고 5를 찾는다하면 3이상값으로만 찾는다.

//20-38 예제
package java_1218;

import java.util.Arrays;

public class copyOfclass {
	public static void main(String[] args) {
		int[] ar = { 33, 6, 11, 44, 22 };
		Arrays.sort(ar);

		for (int n : ar)
			System.out.print(n + "\t");
		System.out.println();

		int idx = Arrays.binarySearch(ar, 44); //배열 ar에서 33을 찾아라
		System.out.println("Index of 33 : " + idx);
	}
}//6	11	22	33	44	
//Index of 33 : 4

 

 

 

 

20-39 배열의 탐색: 인스턴스 대상

 

 

 

 

 

20-40 배열의 탐색: 인스턴스 대상의 예 (20강끝)

 

 

 

 

 

 

 

제네릭

21강 제네릭 -써먹는거 별로없어서 잘모르겠으면 넘어가서 기반지식쌓고 다시와서 이해하기

20-3 제네릭 이전의 코드

toString - 함수오버라이딩

 

 class - 현실세계 담는것.

Object - 모든 객체를 담겠다.

사실 Apple extends Object{ }, Orange도 동일

set다른객체에서 집어넣는것. get꺼내서보는것

 

 

 

 

 

 

20-4 제네릭 이전의 코드의 사용의 예

 

다형성(폴리몰티즘)되어서 형변환 반드시 해줘야함 (Apple)aBox.get(); 

 

ap객체를 넣게되면 println에서 tostring 호출. Apple ap 에서. 

 

 

 

 

 

 

20-5 제네릭 이전 코드가 갖는 문제점 1

 

aBox.set(문자열) - 말도안되는것임. new로해서 넣어야하는데. -제대로 출력x --실시간에러(=비행기떨어진다)

지금까지는 전부 Object로 받음- 다받으니까 set(String)들어가도 컴파일 오류가 안뜸 - 오류는안뜨지만 실시간에러가 나온다 

그래서 나온게 제네릭

 

 

 

 

 

 

 

20-6 제네릭 이전 코드가 갖는 문제점 2

 

이건 심지어 화면에 출력도됨 - 에러잡기 어어어엄청 힘듦 --실시간에러

 

 

 

 

 

 

21-7 제네릭 기반의 클래스 정의하기

제네릭 : class 이름 옆에<> 꺽쇠생긴것.

 

전부 object자리에 <T>,T가 들어감

object는 참조형타입. 따라서 T는 참조형타입을 대체할 수 있다.

 

 

 

21-8 제네릭 클래스 기반 인스턴스 생성 --용어정리 3개 확실히!

Box<T>는 타입을 결정해서 타입 매개변수이다. (type Parameter)

Box<Apple> aBox = new Box<Apple>(); 의 타입 Box<Apple>이다.

객체생성하면 T자리가 전부 Apple로 바뀐다.

 

 

21-9

타입이 Apple로 바뀌어서 String 넣으면 당연 오류남.

이건 다형성 자체가 존재하지않고, 형변환 할 필요가 없다.

 

String을 넣어주고싶으면 T자리에 String을 넣어주기

ex. Box<String> sBox = new Box<String>();

 

 

21-10

//21-10 예제
package java_1218;

public class FruitAndBoxFault_Generic {
	public static void main(String[] args) {
		Box<Apple> aBox = new Box<Apple>();
		Box<Orange> oBox = new Box<Orange>();

		// 과일을 박스에 담은 것일까?
		aBox.set(new Apple()); //여기에 "Apple"들어가면 오류
		oBox.set(new Orange());

		// 박스에서 과일을 제대로 꺼낼 수 있을까?
		Apple ap = aBox.get();
		Orange og = oBox.get();

		System.out.println(ap);
		System.out.println(og);
	}
}

class Apple {
	public String toString() {
		return "I am an apple";
	}
}

class Orange {
	public String toString() {
		return "I am an orange";
	}
}//I am an apple
//I am an orange

 

 

오늘의 문제

 

1.BigInteger 클래스에 대하여 설명하시오. - 실무에선 잘 안쓴다.

BigInteger의 범위는 무한대이다.

 

BigInteger num1 = new BigInteger("숫자1");

BigInteger num2 = new BigInteger("숫자2");

BigInteger는 문자열이기 때문에 사칙연산이 안돼서 형변환을 해줘야한다.

 

 

2.아래의 결과 값은 false 출력이 된다. true 가 되도록 INum을짜시오.

  INum[] ar1 = new INum[3];
      INum[] ar2 = new INum[3];
      ar1[0] = new INum(1); ar2[0] = new INum(1);
      ar1[1] = new INum(2); ar2[1] = new INum(2);
      ar1[2] = new INum(3); ar2[2] = new INum(3);
      System.out.println(Arrays.equals(ar1, ar2));
package java_1218;

import java.util.Arrays;

public class INumClass {

	public static void main(String[] args) {

		INum[] ar1 = new INum[3];
		INum[] ar2 = new INum[3];
		ar1[0] = new INum(1);
		ar2[0] = new INum(1);
		ar1[1] = new INum(2);
		ar2[1] = new INum(2);
		ar1[2] = new INum(3);
		ar2[2] = new INum(3);
		System.out.println(Arrays.equals(ar1, ar2));

	}

}

class INum extends Object {
	private int i;

	public INum(int i) {
		this.i = i;
	}

	public boolean equals(Object o) {//알아서 toString으로 쓰임
  		 if (this.i == ((INum) o).i)//INum으로 형변환
			return true;
		else
			return false;
	}

}

3.아래에서 정렬이 이름순으로 되게끔 하시오. Person 객체를 만드시오.

 

class ArrayObjSearch {
    public static void main(String[] args) {
        Person[] ar = new Person[3];

        ar[0] = new Person("Lee", 29);
        ar[1] = new Person("Goo", 15);
        ar[2] = new Person("Soo", 37);

        Arrays.sort(ar);
package java_1218;

import java.util.Arrays;

class ArrayObjSearch2 {
	public static void main(String[] args) {
		Person2[] ar = new Person2[3];

		ar[0] = new Person2("Lee", 29);
		ar[1] = new Person2("Goo", 15);
		ar[2] = new Person2("Soo", 37);

		Arrays.sort(ar);

		for (Person2 n : ar) {

			System.out.println(n);
		}
	}
}

class Person2 implements Comparable {
	private String name;
	private int age;

	public Person2(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Object o) {

		Person2 p1 = (Person2) o;
		return this.name.charAt(0) - p1.name.charAt(0);

	}

	public String toString() {
		return name;
	}

}//Goo
//Lee
//Soo

↓또다른 방법

package java_1218_Hausarbeit;

import java.util.Arrays;

class Person implements Comparable {
	String name;
	int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return name + ": " + age;
	}
	
	@Override
	public int compareTo(Object o) {
		Person p = (Person)o;
		int cmp = (this.name).compareTo(p.name);  // String함수 comparTo 함수 사용
		if(cmp > 0 )
			return 1;
		else if (cmp < 0)
			return -1;
		else
			return 0;
	}
	
public class ArrayObjSearch {
	public static void main(String[] args) {
		Person[] ar = new Person[3];
		
		ar[0] = new Person("Lee", 29);
		ar[1] = new Person("Goo", 15);
		ar[2] = new Person("Soo", 37);

		Arrays.sort(ar);
		
		for(Person n : ar)
			System.out.print(n + " \t");
		System.out.println();
	}
}

/*
	출력 결과
	Goo: 15 	Lee: 29 	Soo: 37
*/

 

 

4.위의 문제에서 사람의 이름 글자수가 많은순으로 정렬을 되게
끔 person 객체를 만드시오.

package java_1218;

import java.util.Arrays;

class ArrayObjSearch2 {
	public static void main(String[] args) {
		Person2[] ar = new Person2[3];

		ar[0] = new Person2("Leee", 29);
		ar[1] = new Person2("Goo", 15);
		ar[2] = new Person2("Soooo", 37);

		Arrays.sort(ar);

		for (Person2 n : ar) {

			System.out.println(n);
		}
	}
}

class Person2 implements Comparable {
	private String name;
	private int age;

	public Person2(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Object o) {

		Person2 p1 = (Person2) o;
		return this.name.length() - p1.name.length();

	}

	public String toString() {
		return name;
	}
}//Goo
//Leee
//Soooo

 

 

  
5.경과시간을 맞추는 게임을 작성하라. 다음 예시를 참고하면, <Enter> 키를 입력하면 현재 초 시간을 보여주고 여기서 10초에 더 근접하도록 다음 <Enter> 키를 입력한 사람이 이기는 게임이다.

10초에 가까운 사람이 이기는 게임입니다.
황기태 시작 키  >>
현재 초 시간 = 42
10초 예상 후 키  >>
현재 초 시간 = 50
이재문 시작 키  >>
현재 초 시간 = 51
10초 예상 후 키  >>
현재 초 시간 = 4
황기태의 결과 8, 이재문의 결과 13, 승자는 황기태

 

 

//오류 - String이랑 Date가 타입이 달라 계산이 안되어 결과값도출 실패
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

class ArrayObjSearch2 {
	public static void main(String[] args) {
		Person1 p1 = new Person1();
		Person2 p2 = new Person2();
		Start s1 = new Start();
		Result r1 = new Result();
		Scanner sc = new Scanner(System.in);

		s1.start();
		String output = sc.nextLine();
		p1.time1();
		p2.time2();
		r1.result();

	}

}

class Start {
	void start() {
		SimpleDateFormat second1 = new SimpleDateFormat("ss");
		Date time = new Date();
		String current1 = second1.format(time);
		Scanner sc = new Scanner(System.in);
		System.out.print("황기태 시작 키  >> ");
		String output = sc.nextLine();
		System.out.println("현재 초 시간 = " + current1);
		System.out.print("10초 예상 후 키  >> ");
	}
}

class Person1 {

	void time1() {
		SimpleDateFormat second2 = new SimpleDateFormat("ss");
		Date time = new Date();
		String current2 = second2.format(time);

		System.out.println("현재 초 시간 = " + current2);
		System.out.println("=================");

	}
}

class Person2 {
	void time2() {
		Scanner sc = new Scanner(System.in);
		SimpleDateFormat second3 = new SimpleDateFormat("ss");
		Date time = new Date();
		String current3 = second3.format(time);
		System.out.print("이재문 시작 키  >> ");
		String output = sc.nextLine();
		System.out.println("현재 초 시간 = " + current3);
		System.out.print("10초 예상 후 키  >> ");
		output = sc.nextLine();

	}
}

class Result {
	void result() {
		Scanner sc = new Scanner(System.in);
		SimpleDateFormat second3 = new SimpleDateFormat("ss");
		Date time = new Date();
		String current3 = second3.format(time);
		System.out.println("현재 초 시간 = " + current3);
	}
}

 

 

6.제넥릭이란?

프로그래머가 코딩할때 생기는 오류를 최소화 시켜주는 것이다.

Object로 받아서 결과값을 출력할 때 어떤 타입을 넣어주어도 컴파일 오류가 뜨지 않고 결과값이 도출된다.(실시간 에러)

제네릭을 쓰게 되면 Object대신 제네릭타입을 써주기 때문에 잘못된 타입형을 넣어줄땐 오류가 발생한다.

생김새 :  class 이름 옆에<> 꺽쇠생긴것. 전부 object자리에 <T>,T가 들어간다.

object는 참조형타입이기 때문에 T는 참조형타입을 대체할 수 있다.

 

7. 아래를 프로그래밍 하시오.

7. 아래를 프로그래밍 하시오.
Rectangle r1 = new Rectangle(5,6);
Rectangle r2 = new Rectangle(7,9);

Rectangle r3 = Rectangle.compareRect(r1,r2);

System.out.println(r3.getHeight() + " : " + r3.getWidth()  + "입니다.");
=============================
출력 : 9 : 7 입니다.

 

 

 

8. 아래를 프로그래밍 하시오.(중요)

 - Rectangle 배열 4개를 만든후 스캐너 객체로 가로와 세로를 입력하여 4개의 객체를 배열에 할당한다 
-  getSortingRec 사각형 배열을 내림차순 정렬한다.
-정렬이 제대로 되었는지 배열에 저장된 객체의 getArea()함수를 순서대로 호출한다.

Rectangle[] rec = new Rectangle[3];
........
Rectangle[] recSorting = Rectangle.getSortingRec(rec) 
......

 

728x90

댓글