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)
......
'코딩 > 수업 정리' 카테고리의 다른 글
20.12.22 Tue [022] (0) | 2020.12.22 |
---|---|
20.12.21 Mon [021] (0) | 2020.12.21 |
20.12.17 Thu [019] (0) | 2020.12.17 |
20.12.16 Wed [018] 예외처리, 가상머신 (0) | 2020.12.16 |
20.12.15 Tue [017] 인터페이스 상속(디폴트,static,instanceof,marker), 추상클래스, 예외처리 (0) | 2020.12.15 |
댓글