1. BigInteger 클래스에 대하여 설명하시오.
: 데이터가 수용할 수 있는 범위를 벗어나는 큰 값의 정수를 표현할때 쓰이는 클래스이다.
BigInteger big1 = new BigInteger(Integer.MAX_VALUE); // int 타입의 최대 값
BigInteger big2 = new BigInteger(Integer.MIN_VALUE); // int 타입의 최소 값
big1.add(big2); // 메모리가 초과될 정도의 큰 수들을 연산이 되도록 더한다.
big1.multiply(big2); // 큰 수간 뺄셈
r.intValueExtract // 객체 r에 의해 큰 수들을 추출한다.
이러한 연산이 될 수 있는 이유는 불변 클래스(Immutable Class)인 문자열의 형태로 이루어져있기 때문에 정수의 형태에 구애받지 않고 이를 받아 처리하기 때문이다.
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));
2-1. INum 클래스
public 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;
}
}
}
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);
}
}
3-1. ArrayObjSearch 클래스(메인 클래스, 개량)
import java.util.Arrays;
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);
System.out.println("Unordered");
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
System.out.println();
Arrays.sort(ar); // Sorting(ASC)
System.out.println("Ordered");
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
}
}
3-2. Person 클래스
public class Person implements Comparable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name + "님의 나이는 " + age + "세 입니다.";
}
@Override
public int compareTo(Object o) {
return this.age - ((Person)o).age;
}
}
4. 위의 문제에서 사람의 이름 글자수가 많은순으로 정렬을 되게끔 person 객체를 만드시오.
4-1. ArrayObjSearch 클래스(메인 클래스, 개량)
import java.util.Arrays;
public class ArrayObjSearch {
public static void main(String[] args) {
Person[] ar = new Person[3];
ar[0] = new Person("HyunJin Ryu", 33);
ar[1] = new Person("KwangHyun Kim", 32);
ar[2] = new Person("JiMan Choi", 29);
System.out.println("Unordered");
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
System.out.println();
Arrays.sort(ar); // Sorting(ASC)
System.out.println("Ordered");
for (int i = 0; i < ar.length; i++) {
System.out.println(ar[i]);
}
}
}
4-2. Person 클래스
public class Person implements Comparable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name + "님의 나이는 " + age + "세 입니다.";
}
@Override
public int compareTo(Object o) {
return ((Person) o).getName().length() - getName().length();
}
}
5. 경과시간을 맞추는 게임을 작성하라. 다음 예시를 참고하면, 키를 입력하면 현재 초 시간을 보여주고 여기서 10초에 더 근접하도록 다음 키를 입력한 사람이 이기는 게임이다.
10초에 가까운 사람이 이기는 게임입니다. 황기태 시작 키 >> 현재 초 시간 = 42 10초 예상 후 키 >> 현재 초 시간 = 50 이재문 시작 키 >> 현재 초 시간 = 51 10초 예상 후 키 >> 현재 초 시간 = 4 황기태의 결과 8, 이재문의 결과 13, 승자는 황기태
5-1. 메인 클래스
import java.util.InputMismatchException;
import java.util.Scanner;
public class TimerMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Timer player1 = new Timer();
Timer player2 = new Timer();
System.out.println("입력한 두 시간의 차이가 10초에 가까운 사람이 이기는 게임입니다.");
try {
int result1 = player1.game();
int result2 = player2.game();
if(Math.abs(result1 - 10) < Math.abs(result2 - 10))
System.out.println("1p님의 결과: "+result1+", 2p님의 결과 "+result2+", 승자는 1p");
else
System.out.println("1p님의 결과: "+result1+", 2p님의 결과 "+result2+", 승자는 2p");
} catch (InputMismatchException e) {
System.out.println("올바르지 않은 값 입니다. 다시 실행해주십시오.");
}
scanner.close();
}
}
5-2. 게임 알고리즘 클래스
import java.util.Scanner;
import java.util.Calendar;
public class Timer {
Scanner scanner = new Scanner(System.in);
Calendar calendar = Calendar.getInstance();
private int sec1, sec2;
private String temp;
private int showTime() {
temp = scanner.nextLine();
calendar = Calendar.getInstance();
System.out.println("현재 초 시간 = " + calendar.get(Calendar.SECOND));
return calendar.get(Calendar.SECOND);
}
public int game() {
System.out.println("시작 키 >>");
sec1 = showTime();
System.out.println("10초정도 예상하신 후 다시 입력해주세요.");
sec2 = showTime();
if (sec1 < sec2) {
return sec2 - sec1;
} else {
return sec2 + (60 - sec1);
}
}
}
6. Generic이란?
6-1. Generic을 쓰기 전
: 어떠한 객체를 통해 새로운 클래스들을 구현하고자 하는일이 있을때 setter 메소드 호출시 인자에 객체를 생성하거나 강제 형변환(Casting)이 요구되는 코드가 많았다.
// Box 클래스. 이 객체는 여러 과일을 담을 수 있다.
public class Box {
private Object ob;
public void set(Object o) { ob = o; }
public Object get() { return ob; }
}
// Apple 클래스
public class Apple {
public String toString() { return "나는 사과다!" }
}
// Orange 클래스
public class Orange {
public String toString() { return "나는 오렌지다!" }
}
public class MyBox {
public static void main(String[] args) {
Box aBox = new Box(); // 사과 박스들 담을 객체 생성
Box oBox = new Box(); // 오렌지 박스들 담을 객체 생성
// Setter 메소드를 호출 할 때 인자안에 해당 객체를 생성자를 통해 생성한다.
aBox.set(new Apple()); // 사과 박스 객체에 Apple 객체를 담는다.
oBox.set(new Orange()); // 오렌지 박스 객체에 Orange 객체를 담는다.
// 강제 형변환을 통해 Getter 메소드를 호출해야 한다.
Apple ap = (Apple)aBox.get(); // 사과 박스에서 사과를 꺼낸다.
Orange og = (Orange)oBox.get(); // 오렌지 박스에서 오렌지를 꺼낸다.
}
}
위 과정에서 코드의 가독성이 떨어지나보니 구현실수가 일어날 수 있는데 문제는 이것이 런타임 에러(Runtime Error)로 이어질 가능성이 높았다.
public class MyBox {
public static void main(String[] args) {
Box aBox = new Box();
Box oBox = new Box();
// Setter 메소드 인자안에 객체 생성이 아닌 문자열을 인자로 담았다.(구현 실수!)
// 이러한 현상은 컴파일 상에서 오류 발견하는데에 한계가 있다.
aBox.set("Apple");
oBox.set("Orange");
// 이로인해 객체가 생성되지 않았는데도 Getter를 통해 값을 불러올 경우 치명적인 결과를 낳게된다.
Apple ap = (Apple)aBox.get();
Orange og = (Orange)oBox.get();
}
}
6-2. Generic의 등장
: 그 결과 Java는 Generic 기능을 추가하여 해당 기반의 클래스를 정의할 수 있게 되었다.
// Generic을 이용한 클래스
public class Box<T> { // <T> 키워드를 통해 타입 매개변수를 생성한다. (Box<T>라는 제네릭 매개변수화 타입 생성)
private T ob; // 이는 인스턴스 생성시 결정이 되는 자료타입을 T라는 인자로(Argument) 대체할 수 있다.(Object -> T)
public void set(T o) { ob = o; }
public T get() { return ob; } // 메소드 리턴 타입 또한 제네릭 타입 인자 T로 변경할 수 있다.
}
public class MyBox {
public static void main(String[] args) {
Box<Apple> aBox = new Box<Apple>(); // 제네릭 타입 인자 T를 Apple로 변경
Box<Orange> oBox = new Box<Orange>(); // 제네릭 타입 인자 T를 Orange로 변경
// 설령 객체 생성 없이 바로 파라미터에 문자열을 담아도 컴파일러가 오류를 잡을 수 있게 되었다.
/*
aBox.set("Apple");
oBox.set("Orange");
*/
// Setter 메소드를 호출 할 때 인자안에 해당 객체를 생성자를 통해 생성한다.
aBox.set(new Apple()); // 사과 박스 객체에 Apple 객체를 담는다.
oBox.set(new Orange()); // 오렌지 박스 객체에 Orange 객체를 담는다.
// 강제 형변환(Casting)을 거치지 않고도 바로 getter 메소드를 호출할 수 있게 되었다.
Apple ap = aBox.get();
Orange og = oBox.get();
}
}
이러한 결과로 인해 객체의 타입을 명시(제한)할 수 있어 구현 간 실수를 줄이게 되었다.
7. 아래를 프로그래밍 하시오.
Rectangle r1 = new Rectangle(5,6); // (width, height) Rectangle r2 = new Rectangle(7,9); Rectangle r3 = Rectangle.compareRect(r1,r2); // r1과 r2를 비교해서 큰 사각형의 스펙을 가져오기 System.out.println(r3.getWidth() + " : " + r3.getHeight() + "입니다.");
7 : 9 입니다.
7-1. Rectangle 클래스
public class Rectangle {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
private int getArea() {
return width * height;
}
public static Rectangle compareRect(Rectangle r1, Rectangle r2) {
if (r1.getArea() > r2.getArea()) {
return r1;
} else if (r1.getArea() < r2.getArea()) {
return r2;
} else { // 둘이 비슷하면 r1꺼 그냥 가져오기
return r1;
}
}
}
8. 아래를 프로그래밍 하시오.
- Rectangle 배열 4개를 만든후 스캐너 객체로 가로와 세로를 입력하여 4개의 객체를 배열에 할당한다
- getSortingRec 사각형 배열을 내림차순 정렬한다.
- 정렬이 제대로 되었는지 배열에 저장된 객체의 getArea()함수를 순서대로 호출한다.
Rectangle[] rec = new Rectangle[4]; ........ Rectangle[] recSorting = Rectangle.getSortingRec(rec); ......
8-1. 메인 클래스
import java.util.Scanner;
public class RectangleMain02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Rectangle02[] rec = new Rectangle02[4];
for (int i = 0; i < rec.length; i++) {
System.out.println("입력할 사각형의 가로(width)와 세로(height)의 길이를 입력해주세요.");
System.out.print("가로 >> ");
int width = scanner.nextInt();
System.out.print("세로 >> ");
int height = scanner.nextInt();
rec[i] = new Rectangle02(width, height);
System.out.println();
}
System.out.println("Unordered Elements >> ");
for (int i = 0; i < rec.length; i++) {
System.out.println((i+1) + "번 사각형 넓이: " + rec[i].getArea());
}
System.out.println();
System.out.println("Ordered Elements >> ");
Rectangle02[] recSorting = Rectangle02.getSortingRec(rec); // sorting(DESC)
for (int i = 0; i < recSorting.length; i++) {
System.out.println((i+1) + "번 사각형 넓이: " + recSorting[i].getArea());
}
scanner.close();
}
}
8-2. Rectangle 클래스
import java.util.Arrays;
import java.util.Collections;
public class Rectangle02 implements Comparable<Rectangle02> { // Generic 설정
private int width, height;
public Rectangle02() {
}
public Rectangle02(int width, int height) {
this.width = width;
this.height = height;
}
public int getArea() {
return width * height;
}
@Override
public int compareTo(Rectangle02 rec) { // comapareTo 하는 과정에서 캐스팅과정 생략
if (this.getArea() < rec.getArea()) {
return -1;
} else if (this.getArea() == rec.getArea()) {
return 0;
} else {
return 1;
}
}
public static Rectangle02[] getSortingRec(Rectangle02[] rec) {
Arrays.sort(rec, Collections.reverseOrder()); // 컬렉션으로 내림차순 정렬하기
return rec;
}
}
'WebDev > 본과정' 카테고리의 다른 글
List와 Set (0) | 2021.05.13 |
---|---|
Generic 심화 및 컬렉션 프레임워크 개요 (0) | 2021.05.13 |
Clone과 Wrapper 클래스 (0) | 2021.05.13 |
예외처리와 JVM 및 Object 클래스 (0) | 2021.05.13 |
인터페이스 심화 및 예외처리 (0) | 2021.05.12 |
최근댓글