1. throws 에 대하여 설명하시오.

: 메소드 내 구현부에서 Checked Exception을 해야하는 경우 예외처리를 넘겨 이를 호출하는 메소드에서 이를 처리(try ~catch)하는 키워드이다.

public static void main(String[] args) { // main 메소드에서 throw를 할 경우 JVM이 처리하지만 권장하지 않는 코드이다. 
    try { 
    	md1(); // md2 -> md1을 거쳐 최종적으로 호출하는 곳에서 받아 예외처리를 한다. 
    } catch(IOException e) { // throw 하고자 하는 예외 클래스와 다형성에 의한 상속관계가 정확한지 확인한다!
    	e.printStackTrace();
    }
} 

public static void md1() throws IOException { 
	md2(); // md2 메소드의 throw로 인해 이를 호출하는 md1 메소드에서 이를 받는다. 
} 

public static void md2() throws IOException { 
	... // IOException 가능성이 있는 코드 
}

 

 

2. 아래가 컴파일 에러가 나는 이유에 대하여 설명하시오.

try {
	int num = 6 / 0;
} catch (Exception e) {
	e.printStackTrace();
} catch (InputMismatchException e) { // 컴파일 에러!
	e.printStackTrace();
}

: 다형성(Polymorphism)에 의해 상위 클래스인 Exception이 먼저 선언이 되었다. 그러나 InputMismatchException는 Exception의 하위 클래스 이므로 ‘자식 = 부모’와 같은 다형성에 위배되는 코드가 되어 컴파일 에러가 난다.

 

 

3. try with resource 에 대하여 설명하시오.

: try 키워드 선언부 객체를 직접 선언 및 초기화하는 형태 해당 키워드에 자원 객체를 전달하면 코드 블록이 끝날 때, 자동으로 자원을 종료(가비지 컬렉터에 의해)해주는 기능이다.

import java.lang.Autocloseable // 자동으로 메모리를 닫아주는 기능을 가진 클래스를 import

try (BufferedWritter writer = Files.newBuffered Writer(file)) {
    writer.write('A');
    writer.write('Z'); // try 구문을 빠져나올 때 기존의 'writer.close()'를 따로 기입하지 않아도 자동 실행되어 자원 정리
} catch (IOException e) {
    e.printStackTrace();
}

 

 

4. equals 함수에 대하여 설명하시오.

: 인스턴스의 내용 비교를 위한 기능이 있는 함수로 Object의 클래스에 선언되어있다.

public class INum {
	private int num;
	public INum(int num) {
		this.num = num;
	}
	
	@Override // Object 클래스의 equals 메소드 오버라이딩으로 인스턴스의 내용 비교를 위한 기능을 equals 메소드에 담아 정의하였다.
	public boolean equals(Object obj) { 
		if (this.num == ((INum)obj).num) {
			return true;
		} else {
			return false;
		}
	}
}

public class ObjectEqualsMain {
	public static void main(String[] args) {
		INum num1 = new INum(10);
		INum num2 = new INum(12);
		INum num3 = new INum(10);
		
		if (num1.equals(num2)) {
			System.out.println("num1, num2 내용 동일하다.");
		} else {
			System.out.println("num1, num2 서로 다르네요.");
		}
		
		if (num1.equals(num3)) {
			System.out.println("num1, num3 내용 동일하다."); // 인스턴스의 내용 비교이기 때문에(객체 비교가 아님!) 값이 같으므로 true를 리턴하여 출력한다.
		} else {
			System.out.println("num1, num3 서로 다르네요.");
		}
	}
}

 

 

5. 과일, 사과, 배, 포도를 표현한 클래스를 만들고 이들 간의 관계를 고려하여 하나의 클래스를 추상 클래스로 만들어 메소드 print()를 구현하고 다음과 같은 소스와 결과가 나오도록 클래스를 작성하시오.

Fruit fAry[] = {new Grape(), new Apple(), new Pear());

for(Fruit f : fAry)

f.print();
> 나는 포도이다.
> 나는 사과이다.
> 나는 배이다.

 

5-1. 메인 클래스

public class MyFruit {

	public static void main(String[] args) {
		Fruit fAry[] = {new Grape(), new Apple(), new Pear()};
		
		for (Fruit f : fAry)
			f.print();
	}
}

 

5-2. Fruit 클래스 (추상 클래스)

public abstract class Fruit {
	abstract void print();
}

 

5-3. Grape 클래스 (extends Fruit)

public class Grape extends Fruit {	
	@Override
	void print() {
		System.out.println("나는 포도이다.");
	}
}

 

5-4. Apple 클래스 (extends Fruit)

public class Apple extends Fruit {
	@Override
	void print() {
		System.out.println("나는 사과이다.");	
	}
}

 

5-5. Pear 클래스 (extends Fruit)

public class Pear extends Fruit {

	@Override
	void print() {
		System.out.println("나는 배이다.");
	}
}

 

6. 다음 조건을 만족하도록 클래스 Person과 Student를 작성하시오.

  • 클래스 Person
  • 필드 : 이름, 나이, 주소 선언
  • 클래스 Student
  • 필드 : 학교명, 학과, 학번, 8개 평균평점을 저장할 배열로 선언
  • 생성자 : 학교명, 학과, 학번 지정
  • 메소드 average() : 8개 학기 평균평점의 평균을 반환
  • 클래스 Person과 Student 프로그램 테스트 프로그램의 결과 : 8개 학기의 평균평점은 표준입력으로 받도록한다. 이름 : 김다정 나이 : 20
주소 : 서울시 관악구
학교 : 동양서울대학교
학과 : 전산정보학과
학번 : 20132222

----------------------------------------

8학기 학점을 순서대로 입력하세요

1학기 학점  → 3.37
2학기 학점  → 3.89
3학기 학점  → 4.35
4학기 학점  → 3.76
5학기 학점  → 3.89
6학기 학점  → 4.26
7학기 학점  → 4.89
8학기 학점  → 3.89 

----------------------------------------

8학기 총 평균 평점은 4.0375점입니다.

 

6-1. Person 클래스

public class Person {
	private int age;
	private String name;
	private String address;
}

 

6-2. Student 클래스

import java.io.IOException;
import java.util.Scanner;

public class Student extends Person {
	private int classOf; // 학번
	private double avg[] = new double[8]; // 평균 학점 배열
	private String schoolName; // 학교명
	private String department; // 학과
	
	Scanner scanner = new Scanner(System.in);
	
	public Student() {
		super(); // 상속받은 Person 객체의 age, name, address 필드 변수 가져오기 
	}
	
	public Student(String schoolName, String department, int classOf) {
		this.schoolName = schoolName;
		this.department = department;
		this.classOf = classOf;
	}
	
	public void getInfo() throws IOException { // 학생의 인적사항 입력
		System.out.print("주소 : ");
		address = scanner.next();
		System.out.print("학교 : ");
		schoolName = scanner.next();
		System.out.print("학과 : ");
		department = scanner.next();
		System.out.print("학번 : ");
		classOf = scanner.nextInt();
		System.out.println("----------------------------------------");
	}
	
	public void getAvg() throws IOException { // 학생의 평균 학점 입력
		System.out.println("8학기 학점을 순서대로 입력하세요.");
		System.out.println();
		for (int i = 0; i < avg.length; i++) {
			System.out.print((i+1) + "학기 학점 -> ");
			avg[i] = scanner.nextDouble();
		}
		System.out.println();
		System.out.println("----------------------------------------");
	}
	
	public void average() { // 학생의 평균 학점 출력
		double sum = 0;
		
		try { // throw한 예외처리들을 average 메소드에서 받기
			getInfo();
			getAvg();
			
			for (int i = 0; i < avg.length; i++) { // 입력한 학점의 평균 구하기
				sum += avg[i];
			}
			
			System.out.println(avg.length + "학기 총 평균 학점은 " + (sum / avg.length) + "점 입니다.");
		} catch (IOException e) {
			System.out.println("올바르지 않은 입력 값 입니다. 다시 입력해주세요!");
		}
	}
}

 

 

7. 다음은 도형의 구성을 묘사하는 인터페이스이다.

interface Shape {
   final double PI = 3.14; // 상수
   void draw(); // 도형을 그리는 추상 메소드
   double getArea(); // 도형의 면적을 리턴하는 추상 메소드
   default public void redraw() { // 디폴트 메소드
      System.out.print("--- 다시 그립니다.");
      draw();
   }
}

다음 main() 메소드와 실행 결과를 참고하여, 인터페이스 Shape을 구현한 클래스 Circle를 작성하고 전체 프로그램을 완성하라.

public static void main(String[] args) {
   Shape donut = new Circle(10); // 반지름이 10인 원 객체
   donut.redraw();
   System.out.println("면적은 "+ donut.getArea());
}

 

7-1. Circle 클래스 (implements Shape)

public class Circle implements Shape {
	private double rad;

	public Circle(double rad) {
		this.rad  = rad;
	}

	@Override
	public void draw() {
		System.out.println("반지름이 " + rad + "인 원을 그렸습니다.");
	}

	@Override
	public double getArea() {
		return PI * Math.pow(rad, 2);
	}
}

 

 

8. 다음 main() 메소드와 실행 결과를 참고하여, 문제 7의 Shape 인터페이스를 구현한 클래스 Oval, Rect를 추가 작성하고 전체 프로그램을 완성하라.

public static void main(String[] args) {
   Shape[] list = new Shape[3]; // Shape을 상속받은 클래스 객체의 레퍼런스 배열
   list[0] = new Circle(10); // 반지름이 10인 원 객체
   list[1] = new Oval(20, 30); // 20x30 사각형에 내접하는 타원
   list[2] = new Rect(10, 40); // 10x40 크기의 사각형
   for(int i=0; i<list.length; i++) list[i].redraw();
   for(int i=0; i<list.length; i++) System.out.println("면적은 "+ list[i].getArea());
}
--- 다시 그립니다.반지름이 10인 원입니다.
--- 다시 그립니다.20x30에 내접하는 타원입니다.
--- 다시 그립니다.10x40크기의 사각형 입니다.

면적은 314.0
면적은 1884.0000000000002
면적은 400.0

 

8-1. Oval 클래스 (implements Shape)

public class Oval implements Shape {
	private int width;
	private int height;
	
	public Oval(int width, int height) {
		this.width = width;
		this.height = height;
	}

	@Override
	public void draw() {
		System.out.println(width + " x " + height + "에 내접하는 타원입니다.");
	}

	@Override
	public double getArea() {
		return (width/2) * (height/2) * PI ;
	}
}

 

8-2. Rect 클래스 (implements Shape)

public class Rect implements Shape {
	private int width;
	private int height;

	public Rect(int width, int height) {
		this.width = width;
		this.height = height;
	}

	@Override
	public void draw() {
		System.out.println(width + " x " + height + "크기의 사각형 입니다.");
	}

	@Override
	public double getArea() {
		return width * height;
	}
}

'WebDev > 본과정' 카테고리의 다른 글

Java의 기본 클래스 및 제네릭 개요  (0) 2021.05.13
Clone과 Wrapper 클래스  (0) 2021.05.13
인터페이스 심화 및 예외처리  (0) 2021.05.12
객체 비교와 인터페이스  (0) 2021.05.12
다형성과 오버라이딩  (0) 2021.05.12