SW공부 33일차

Guryena·2023년 2월 14일
0

CS

목록 보기
26/34

1. checked, unchecked Exception 에 대하여 설명하시오.

자바의 예외는 크게 3가지로 나눌 수 있다.

  • 체크 예외(Checked Exception)
  • 에러(Error)
  • 언체크 예외(Unchecked Exception)


[image 1. 자바에서 에러, 예외 관련된 클래스들의 계층구조]

Throwable 클래스를 기준으로 Error, Exception 클래스로 나뉘어 진다다. 왼쪽에 보이는 Error는 말 그대로 에러와 관련된 클래스이다. 그리고 오른쪽에 보이는 Exception 도 말 그대로 예외와 관련된 클래스이다. 자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception) 두 가지로 구분하였다.

에러(Error)

에러는 시스템에 비정상적인 상황이 발생했을 경우에 발생한다. 예를들어, 메모리 부족(OutofMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 복구할 수 없는 것을 말한다.
이러한 에러는 개발자가 예측하기도 쉽지 않고 처리할 수 있는 방법도 없다.

예외(Exception)

예외는 프로그램 실행 중에 개발자의 실수로 예기치 않은 상황이 발생했을 때이다. 예를들어 배열의 범위를 벗어난(ArrayIndexOutOfBoundsException), 값이 null이 참조변수를 참조(NullPointerException), 존재하지 않는 파일의 이름을 입력(FileNotFoundException) 등등이 있다. 이러한 것들은 그냥 보아도 프로그램에 심각한 오류여서 복구할 수 없는 수준은 아니라는 것을 알 수 있다.

예외에는 2가지로 나눌 수 있다.

체크 예외(Checked Exception), 언체크 예외(Unchecked Exception)

위의 자바 에러 클래스의 계층 구조를 보았을 때 RuntimeException의 하위 클래스들이 Uncheck Exception 이라 하고 RuntimeException의 하위 클래스가 아닌 Exception 클래스의 하위 클래스들을 Checked Exception이라고 한다.

  • 체크 예외(Checked Exception)
    체크 예외는 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들이다. 체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있다.

    존재하지 않는 파일의 이름을 입력(FileNotFoundException)
    실수로 클래스의 이름을 잘못 적음(ClassNotFoundException)

  • 언체크 예외(Unchecked Exception)
    언체크 예외는 RuntimeException의 하위 클래스들을 의미합니다. 이것은 체크 예외와는 달리 에러 처리를 강제하지 않는다.
    말 그대로 실행 중에(runtime) 발생할 수 있는 예외를 의미한다.

    배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)값이 null이 참조변수를 참조(NullPointerException)

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

예외란 프로그래머가 작성한 로직에 의해 발생된다. 그렇다면 프로그래머가 예외를 발생시킬수도 있을까? 있다. 추가적으로 예외에 대한 책임을 전가할수도 있다. 이게 바로 throw와 throws이다.

  • throw
    에러를 고의로 발생시킬 때 사용한다.
    예외를 강제로 발생시킨 후, 상위 블럭이나 catch문으로 예외를 던진다.

  • throws
    자신을 호출한 상위 메소드로 에러를 던지는 역할을 한다.
    예외가 발생하면 상위메서드로 예외를 던진다.
    일반적으로 throws를 사용하면 try, catch 구문이 생성되지 않는 것을 확인할 수 있는데, 이 이유는 throws구문에 의해 예외에 대한 처리를 호출부로 위임하기 때문이다.
    throw를 통해 예외를 발생시키고 throws는 이 예외를 밖으로 던져버리고 있다.

3.주소가 출력되는 이유를 설명하시오.

class A{

}

public class Test {
	public static void main(String[] args) {
		A a = new A();
		System.out.println(a); // String s = String.valueOf(x); -> s가 주소 뿌림
	}
}

println의 class에 진입하면, printStream의 class에 String s = String.valueOf(x);의 형태로 선언이 되어있다. valueOf(x) ~ String class로 올라가면 toString을 선언하고 있다. toString을 포함하고 있는 Object class에 toString의 함수가 선언되어 있는데, return getClass().getName() + "@" + Integer.toHexString(hashCode());으로 반환한다. 이는 클래스 getClass()의 이름getName()을 출력하고 이와 구분하는 문자 @를 기준으로 정수의 형태인 hashCode를 Hex문자열Integer.toHexString(hashCode())을 반환한다.

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

package Test;
//- 클래스 Person
//* 필드 : 이름, 나이, 주소 선언
public class Person {
	protected String name;
	protected int age;
	protected String address;
	
	public void print() {
		System.out.println("이름 : " +name);
		System.out.println("나이 : "+age);
		System.out.println();
		System.out.println("주소 : "+address);
	}
	
	
}
package Test;

import java.util.Scanner;

//- 클래스 Student
//* 필드 : 학교명, 학과, 학번, 8개 평균평점을 저장할 배열로 선언
//* 생성자 : 학교명, 학과, 학번 지정
//* 메소드 average() : 8개 학기 평균평점의 평균을 반환
public class Student extends Person {
	private String schoolName;
	private String major;
	private int studentID;
	private double[] avgGrade = new double[8];

	public Student(String name, int age, String add, String schName, String mj, int sID) {
		this.name = name;
		this.age = age;
		this.address = add;
		this.schoolName = schName;
		this.major = mj;
		this.studentID = sID;
		print();
	}

	public double average() {
		double sum = 0;
		double avg = 0;
		for (double d : avgGrade) {
			sum += d;
		}
		avg = sum / avgGrade.length;
		return avg;
	}

	public void setGrade() {
		Scanner sc = new Scanner(System.in);

		System.out.println(avgGrade.length + "학기 학점을 순서대로 입력하세요.");

		for (int i = 0; i < avgGrade.length; i++) {
			avgGrade[i] = sc.nextDouble();
			System.out.println((i + 1) + "학기 학점 -> " + avgGrade[i]);
		}
		System.out.println(avgGrade.length + "학기 총 평균 평점은 " + average() + "점 입니다.");
		sc.close();
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		super.print();
		System.out.println("학교 : " + schoolName);
		System.out.println("학과 : " + major);
		System.out.println("학번 : " + studentID);

	}
}
package Test;

public class Test {

	public static void main(String[] args) {

//		- 클래스 Person과 Student 
//		- 프로그램 테스트 프로그램의 결과 : 8개 학기의 평균평점은 표준입력으로 받도록한다.

//		이름 : 김다정
//		나이 : 20
//
//		주소 : 서울시 관악구
//		학교 : 동양서울대학교
//		학과 : 전산정보학과
//		학번 : 20132222
//		----------------------------------------

		int i = 8;

		Student student = new Student("김다정", 20, "서울시 관악구", "동양서울대학교", "전산정보학과", 20132222);
		student.print();
		System.out.println();
		student.setGrade();

//		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점입니다.
	}

}

0개의 댓글