[5주차] 9/30(월) 강의내용
1. 사용자 정의 예외
-> 다중 catch문 사용시, 작성하는 예외의 순서는 (하위->상위) 순서로 작성해야함
-> 가장 상위인 Exception e 를 첫 번째 catch문에서 먼저 사용하면, 첫 번째 catch문에서 모두 잡히게된다
-> 결국 두 번째 이후의 catch문까지 넘어가지 못하는 문제가 발생하게된다
-> 따라서 Exception e 는 다중 catch문의 가장 마지막에서 사용해야한다
1-1) 20세를 기준으로 제한하는 사용자 정의 예외
---------------------------------------
AgeRestriction.java
---------------------------------------
import java.util.Scanner;
public class AgeRestriction {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.print("나이를 입력하세요: ");
int age = scanner.nextInt();
// 음수 나이 입력 시 예외 발생
if (age < 0) {
throw new IllegalArgumentException("나이는 음수가 될 수 없습니다.");
}
// 20세 미만 나이 입력 시 예외 발생
if (age < 20) {
throw new UnderAgeException("가입이 제한됩니다.");
}
System.out.println("가입이 완료되었습니다. 나이: " + age);
} catch (UnderAgeException e) {
// 20세 미만 예외 처리
System.out.println("Sorry: " + e.getMessage());
} catch (IllegalArgumentException e) {
// 음수 나이에 대한 예외 처리
System.out.println("에러: " + e.getMessage());
} catch (Exception e) {
// 기타 예외 처리
System.out.println("올바른 숫자를 입력하세요.");
} finally {
scanner.close(); // Scanner close
}
}
}
---------------------------------------
UnderAgeException.java
---------------------------------------
public class UnderAgeException extends Exception {
public UnderAgeException(String message) {
super(message);
}
}
1-2) 1만원~5만원만을 기준으로 제한하는 사용자 정의 예외
---------------------------
DinnerDonation.java
---------------------------
import java.util.Scanner;
public class DinnerDonation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
System.out.print("기부 금액을 입력하세요 (10000 ~ 50000 원 사이): ");
int donation = scanner.nextInt();
// 1만원보다 적으면 TooSmallDonationException 발생
if (donation < 10000) {
throw new TooSmallDonationException("기부 금액은 최소 1만 원 이상이어야 합니다.");
}
// 5만원보다 크면 TooLargeDonationException 발생
if (donation > 50000) {
throw new TooLargeDonationException("기부 금액이 너무 큽니다. 5만 원 이하만 가능합니다.");
}
System.out.println("기부해 주셔서 감사합니다! 기부 금액: " + donation + "원");
} catch (TooSmallDonationException | TooLargeDonationException e) {
System.out.println("에러: " + e.getMessage());
} catch (Exception e) {
// 기타 예외 처리
System.out.println("올바른 숫자를 입력하세요.");
} finally {
scanner.close(); // Scanner close
}
}
}
-------------------------------------------
TooSmallDonationException.java
-------------------------------------------
// Custom exception for donation below minimum
class TooSmallDonationException extends Exception {
public TooSmallDonationException(String message) {
super(message);
}
}
// Custom exception for donation above maximum
class TooLargeDonationException extends Exception {
public TooLargeDonationException(String message) {
super(message);
}
}
2. 객체 지향과 자바 - 객체 지향 언어의 특성
2-1) 캡슐화
-> 자바에서 객체는 클래스라는 캡슐을 사용한다
-> 필드(멤버 변수)와 메소드(멤버 함수)로 구성된다
2-2) 상속
-> 재사용성 향상
-> ex) class Human extends Animal { }
2-3) 다형성
3. 자바 클래스 만들기
방법1: 두 개의 클래스를 서로 다른 파일에 생성 -> Circle.java 클래스와 UseCircle.java 클래스 각각 생성
방법2: 하나의 클래스에 main까지 작성
방법3: 하나의 파일에 두 개의 class를 작성
3-1) 클래스 구성
// 방법1 - Circle.java 클래스 생성
(public) class Circle {
public int radius;
public String name;
public Circle() {
}
public double getArea() {
return 3.14 * radius * radius;
}
}
3-2) new 연산자와 객체 생성, 그리고 레퍼런스 변수
// 방법1 - UseCircle.java 클래스 생성
// 예제 그대로
public static void main(String args[]){
Circle pizza;
pizza = new Circle();
pizza.radius = 10;
pizza.name = "자바피자";
double area = pizza.getArea();
}
// 방법1 - UseCircle.java 클래스 생성
// 예제를 실행하기 위해서 UseCircle 클래스를 새로 생성
public class UseCircle {
public static void main(String args[]) {
Circle pizza;
pizza = new Circle();
pizza.radius = 10;
pizza.name = "자바피자";
double area = pizza.getArea();
System.out.print(pizza.getArea());
}
}
3-3) 객체 멤버 접근
// 방법2: 하나의 클래스에 main까지 작성
public class Circle {
int radius;
String name;
public Circle() {}
public double getArea() {
return 3.14 * radius * radius;
}
public static void main(String args[]) {
Circle pizza;
pizza = new Circle();
pizza.radius = 10;
pizza.name = "자바피자";
double area = pizza.getArea();
System.out.print(pizza.name + "의 면적은 " + area);
Circle donut = new Circle();
donut.radius = 2;
donut.name = "자바도넛";
area = donut.getArea();
System.out.println(donut.name + "의 면적은 " + area);
}
}
// 방법3: 하나의 파일에 두 개의 class를 작성
import java.util.Scanner;
class Rectangle{
int width;
int height;
public int getArea() {
return width * height;
}
}
public class RectApp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Rectangle rect = new Rectangle();
rect.width = sc.nextInt();
rect.height = sc.nextInt();
System.out.println("사각형의 면적은 " + rect.getArea());
sc.close();
}
}
4. 생성자
4-1) 생성자의 개념과 목적
생성자는 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드이다
1) 생성자의 이름은 클래스 이름과 동일하다
2) 생성자에 리턴 타입을 지정할 수 없다
3) 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다
4) 생성자는 여러 개 작성(오버로딩)할 수 있다
4-2) 기본 생성자
1) 기본 생성자가 자동으로 생성되는 경우
2) 기본 생성자가 자동으로 생성되지 않은 경우
출처: 명품 JAVA Programming(개정 5판), 생능출판사