학교/2-2학기(Java)

[5주차] 9/30(월) 강의내용

C0MPAS 2024. 9. 30. 21:54

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판), 생능출판사