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 |
최근댓글