IT 면접족보/자바 면접족보

자바 수업 정리 - Exception class, finally, try-with-resources, Object class(methods) (17일 차 )

낙산암 2020. 12. 17. 16:54

자바면접 족보 (17일차)

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

public static void md2() throws IOException {...}
  • 소드 내에서 문장을 실행하는 과정에서 해당 에러가 발생할 수 있다는 의미

  • 만약 함수에서 예외 상황의 문제가 생기게 되면 throws Exception을 자기자신을 호출한 함수한테 던진다. (예외 처리를 떠넘긴다.) → 계속 호출 한 곳으로 던져서 결국 try catch의 catch에서 Exception 에서 받게 된다. → try catch가 없는 경우 메인 메소드까지 넘어가서 메인 메소드가 최종적으로 JVM으로 넘기는 것도 가능하다. (하지만 그 전에 try catch로 예외 처리를 직접 하는 것이 좋다.)

  • 둘 이상의 예외를 넘길 때는 ,(콤마)로 구분한다.

public void simpleWrite() throws IOException, IndexOutofBoundsException {
	....
}

2.checked 와 unckecked Excetpion 을 설명하시오.

Exception의 subclass인 unchecked Exception은(= RuntimeException) 예외 처리를 해야 한다고 강제하지 않는다. (런타임에 체크)

하지만 Exception의 subclass인 checked Exception은 반드시 프로그래머가 예외 처리를 해야 한다. (컴파일 타임에 체크) 예외 처리를 하지 않으면 프로그램 작성중에 이미 빨간줄로 에러 표시가 떠서 진행할 수가 없게 된다.

 

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

try {
		int num = 6 / 0;
} catch (Exception e) {
		e.printStackTrace();
} catch (InputMismatchException e) {
		e.printStackTrace();
}

Exception이 InputMismatchException보다 상위 클래스에 위치하고 있으므로 모든 예외 상황을 체크할 수 있다. 그래서 여기에서 모든 예외가 처리 되기 때문에 세부 체크를 하는 InputMismatchException이나 ArithmeticException 등이 그 아래 catch로 온다면 사실상 그 문장을 통과할 일이 없기 때문에 불필요한 코드임을 알려주기 위해 에러가 난다.

 

!!! Polymorphism이 핵심 !!!

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

try catch finally

  • try catch finally가 예외 처리의 기본적인 문장 구성이다.

  • 실행의 흐름이 try 구문 안에 들어왔을 때 반드시 실행 해야 하는 문장을 finally 구문에 둘 수 있다.

    finally는 앞의 try-catch에서 성공을 하든 실패를 하든 꼭 통과해야한다!

  • write나 scanner 등은 반드시 close 해줘야하는 거라서 써주는것

    하지만 반드시 처리 해야 하는 문장에서도 에러 뜰 수 있어서 finally 문장 안에서 try catch 해줄 수 있다.

  • finally 구문 사용 예시 : 있으면 무조건 타게 되어있다.

try-with-resources

try(BufferedWriter writer = Files.newBufferedWriter(file)) { //여기 바로 객체생성해버림
	writer.write('A’);
	writer.write('Z');   
//try 구문을 빠져나갈때 다음문장을 안정적으로 자동실행 writer.close(); 클로즈 내부에서 자동 실행
}
catch(IOException e) {
	e.printStackTrace();
}
  • 1.7 버전부터 제공되는 try catch finally의 업그레이드 버전이라고 볼 수 있다.
  • try안에 resources(=객체)가 들어간다. → 객체 생성해서 집어 넣는 것
  • 해당 리소스에 대한 클로즈를 안에서 내부적으로 알아서 해준다.
  • try-with-resources 기반의 오픈 및 종료 대상이 되기 위한 조건: java.lang.AutoCloseable 인터페이스의 구현

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

public boolean equals(Object obj) {
        return (this == obj);
}

Object클래스의 11개 함수중 하나

기능: this와 obj 를 비교해 서로 같은 객체를 가리키고 있는지 참조값을 비교해서 true or false로 리턴함

  • 아래와 같이 하위 클래스에서 Override 하면 값을 비교하는 기능으로 사용할 수 있다.
	@Override
	public boolean equals(Object obj) {
		if(this.num== ((INum)obj).num)  //부모 → 자식으로 하려면 형변환 해야함
			return true;
		else
			return false;
	}

 

6.다음을 프로그래밍 하시오.

- 소스
Fruit fAry[] = {new Grape(), new Apple(), new Pear());
for(Fruit f : fAry)
f.print();

- 결과
나는 포도이다.
나는 사과이다.
나는 배이다.
abstract class Fruit {
	abstract void print();  
}

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

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

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

public class FruitMain {

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

7. 다음 조건을 만족하도록 클래스 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점입니다.

 

import java.util.Scanner;

class Person {
	String name;
	int age;
	String address;
	
	Person(String name, int age, String address){
		this.name = name;
		this.age = age;
		this.address = address;
	}
	//getter, setter만들자..

//	public void print() {
//		System.out.println("이름 : "+ name);
//		System.out.println("나이 : "+ age);
//	}
}

class Student extends Person {
	String univ;
	String major;
	int studentNum;
	double[] grade = new double[8];
		
	Student(String name, int age, String address, String univ, String major, int studentNum) {
		super(name, age, address);
		this.univ = univ;
		this.major = major;
		this.studentNum = studentNum;
	}
	
//	@Override
	public void print() {
//		super.print();
		System.out.println();
		System.out.println("주소 : "+ address);
		System.out.println("학교 : "+ univ);
		System.out.println("학과 : "+ major);
		System.out.println("학번 : "+ studentNum);
	}
	
	public void setGrade () {
		Scanner sc = new Scanner(System.in);
		System.out.print( "8학기 학점을 순서대로 입력하세요.");
		
		for(int i=0; i <= grade.length-1; i++) {
			System.out.println((i+1)+ "학기 학점  →  " );
			grade[i] = sc.nextDouble();
		}
		sc.close();
	}
	
	public double average() {
		double sum = 0.0;
		double avg = 0.0;
		
		for(int i = 0; i < grade.length; i++) {
			sum =  sum + grade[i];
		}
		avg = sum / grade.length;
		return avg;
	}
}

public class PersonMain {
	public static void main(String[] args) {
		
		Student person = new Student("김다정", 20, "서울시 관악구", "동양서울대학교", "전산정보학과", 20132222);
		person.print();
		System.out.println();
		person.setGrade();
		
		System.out.println("8학기 총 평균 평점은" + person.average() +"점입니다.");
	}

}

 

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

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

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

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

class Circle implements Shape {
	int r;
	
	public Circle(int r) {
		this.r = r;
	}

	@Override
	public void draw() {
		System.out.println("원 그리기");
	} 
	
	@Override
	public	double getArea() {
		return r * r * PI;
	}

}

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

 

9.다음 main() 메소드와 실행 결과를 참고하여, 문제 8의 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
*/
interface Shape {
	final double PI = 3.14; // 상수
	void draw(); // 도형을 그리는 추상 메소드
	
	double getArea(); // 도형의 면적을 리턴하는 추상 메소드
	
	default public void redraw() { // 디폴트 메소드
		System.out.print("--- 다시 그립니다.");
		draw();
	}
}

class Circle implements Shape {
	double r;
	
	public Circle(double r) {
		this.r = r;
	}
	
	public double getR() {
		return r;
	}

	public void setR(int r) {
		this.r = r;
	}

	@Override
	public void draw() {
		System.out.println("원 그리기");
	} 
	
	@Override
	public	double getArea() {
		return r * r * PI;
	}

}

class Oval extends Circle {
	double r2;
	
	Oval(double r , double r2) {
		super(r);
		this.r2 = r2;
	}
	
	@Override
	public void draw() {
		System.out.println("타원형 그리기");
	}
	
	@Override
	public double getArea() {
		return super.getR()* r2 * PI;
	}
}

class Rect implements Shape {
	private double weight, height;
	
	Rect(double weight, double height) {
		this.weight = weight;
		this.height = height;
	}
	
	@Override
	public void draw() {
		System.out.println("사각형 그리기");
	}
	
	@Override
	public double getArea() {
		return weight * height;
	}	
}

public class ShapeMain {
	public static void main(String[] args) {
		Shape donut = new Circle(10); // 반지름이 10인 원 객체
		donut.redraw();
		System.out.println("면적은 "+ donut.getArea());
		
		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());
	}
}

/* 
--- 다시 그립니다.원 그리기
--- 다시 그립니다.타원형 그리기
--- 다시 그립니다.사각형 그리기
면적은 314.0
면적은 1884.0  -> 어떻게 0000.2 만들어야할지....
면적은 400.0
*/