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