## 과제_1 : 은행 계좌 관리 시스템 목표 : OOP 특징을 활용하여 클래스를 설계한다. 요구사항 : 은행 계좌 관리 시스템을 구현하고자 한다. 계좌 종류는 두 가지로, `SavingsAccount`와 `CheckingAccount`가 있다. 두 계좌 모두 계좌 번호, 소유자 이름, 잔액, 계좌 상태를 가지고 있다. `SavingsAccount`는 이자율 필드를 추가로 가지고 있고, `CheckingAccount`는 최대 대출 가능 금액과 현재 대출한 금액 필드를 추가로 가지고 있다. `SavingsAccount`는 다음과 같이 설계한다 - `SavingsAccount`는 다음과 같은 필드를 가진다 - 계좌 번호(`accountNumber`) - 소유자 이름(`owner`) - 잔액(`balance`) - 계좌 상태(`status`) - 이자율(`interestRate`) - `SavingsAccount`는 다음과 같은 메서드를 가진다 - 계좌 번호, 소유자 이름, 잔액을 인자로 받아 초기화하는 생성자 - 입금 금액을 인자로 받아 잔액 필드에 더하는 `deposit()` 메서드 - 출금 금액을 인자로 받아 잔액 필드에서 빼는 `withdraw()` 메서드 - 잔액 필드를 반환하는 `getBalance()` 메서드 - 계좌 상태를 반환하는 `getStatus()` 메서드 - 계좌 상태를 변경하는 `setStatus()` 메서드 - 이자율 필드를 반환하는 `getInterestRate()` 메서드 - 이자율 필드를 변경하는 `setInterestRate()` 메서드 - 이자율과 잔액을 곱한 금액을 잔액에 더하는 `addInterest()` 메서드 - 계좌 정보를 출력하는 `printAccountInfo()` 메서드 `CheckingAccount`는 다음과 같이 설계한다 - `CheckingAccount`는 다음과 같은 필드를 가진다 - 계좌 번호(`accountNumber`) - 소유자 이름(`owner`) - 잔액(`balance`) - 계좌 상태(`status`) - 최대 대출 가능 금액(`creditLimit`) - 현재 대출한 금액(`loanBalance`) - `CheckingAccount`는 다음과 같은 메서드를 가진다 - 계좌 번호, 소유자 이름, 잔액을 인자로 받아 초기화하는 생성자 - 입금 금액을 인자로 받아 잔액 필드에 더하는 `deposit()` 메서드 - 출금 금액을 인자로 받아 잔액 필드에서 빼는 `withdraw()` 메서드 - 잔액 필드를 반환하는 `getBalance()` 메서드 - 계좌 상태를 반환하는 `getStatus()` 메서드 - 계좌 상태를 변경하는 `setStatus()` 메서드 - 최대 대출 가능 금액 필드를 반환하는 `getCreditLimit()` 메서드 - 최대 대출 가능 금액 필드를 변경하는 `setCreditLimit()` 메서드 - 현재 대출한 금액 필드를 반환하는 `getLoanBalance()` 메서드 - 대출 금액을 인자로 받아 현재 대출한 금액 필드에 더하는 `loan()` 메서드 - 대출 금액을 인자로 받아 현재 대출한 금액 필드에서 빼는 `repayLoan()` 메서드 - 계좌 정보를 출력하는 `printAccountInfo()` 메서드 위 두 클래스를 설계해본다. 이때, 다음과 같은 사항을 고려한다 1. Enum 활용 - 계좌 상태를 나타내는 Enum을 정의한다 (예: `ACTIVE`, `INACTIVE`, `SUSPENDED`) 2. 인터페이스 활용 - `Account` 인터페이스를 사용하여 공통적으로 사용되는 메서드는 이 인터페이스에 정의한다 3. 추상 클래스 활용 - `Account` 인터페이스를 구현하는 `AbstractAccount` 추상 클래스를 정의한다 - `AbstractAccount`는 공통적으로 사용되는 필드 및 메서드를 구현한다 4. 입력 유효성 검사 - 사용자 입력이 유효한지 검사하는 로직을 구현한다 (예: 음수 금액의 입금 또는 출금 방지) ## 과제_2 : 프로그래머스 문제 풀기 1. [겹치는 선분의 길이](https://school.programmers.co.kr/learn/courses/30/lessons/120876) --- ## 과제_1 : 은행 계좌 관리 시스템 모범답안 ```java public enum AccountStatus { ACTIVE, INACTIVE, SUSPENDED } public interface Account { void deposit(double amount); void withdraw(double amount); double getBalance(); AccountStatus getStatus(); void setStatus(AccountStatus status); void printAccountInfo(); } public abstract class AbstractAccount implements Account { private String accountNumber; private String owner; private double balance; private AccountStatus status; public AbstractAccount(String accountNumber, String owner, double balance) { this.accountNumber = accountNumber; this.owner = owner; this.balance = balance; this.status = AccountStatus.ACTIVE; } @Override public void deposit(double amount) { if (amount < 0) { System.out.println("입금 금액은 음수가 될 수 없습니다."); return; } balance += amount; } @Override public void withdraw(double amount) { if (amount < 0) { System.out.println("출금 금액은 음수가 될 수 없습니다."); return; } balance -= amount; } @Override public double getBalance() { return balance; } @Override public AccountStatus getStatus() { return status; } @Override public void setStatus(AccountStatus status) { this.status = status; } @Override public void printAccountInfo() { System.out.println("계좌 번호: " + accountNumber); System.out.println("소유자 이름: " + owner); System.out.println("잔액: " + balance); System.out.println("계좌 상태: " + status); } } public class SavingsAccount extends AbstractAccount { private double interestRate; public SavingsAccount(String accountNumber, String owner, double balance, double interestRate) { super(accountNumber, owner, balance); this.interestRate = interestRate; } public double getInterestRate() { return interestRate; } public void setInterestRate(double interestRate) { this.interestRate = interestRate; } public void addInterest() { deposit(getBalance() * interestRate); } } public class CheckingAccount extends AbstractAccount { private double creditLimit; private double loanBalance; public CheckingAccount(String accountNumber, String owner, double balance, double creditLimit) { super(accountNumber, owner, balance); this.creditLimit = creditLimit; this.loanBalance = 0; } public double getCreditLimit() { return creditLimit; } public void setCreditLimit(double creditLimit) { this.creditLimit = creditLimit; } public double getLoanBalance() { return loanBalance; } public void loan(double amount) { if (amount < 0) { System.out.println("대출 금액은 음수가 될 수 없습니다."); return; } if (amount > creditLimit) { System.out.println("대출 금액이 한도를 초과합니다."); return; } loanBalance += amount; deposit(amount); } public void repayLoan(double amount) { if (amount < 0) { System.out.println("상환 금액은 음수가 될 수 없습니다."); return; } if (amount > loanBalance) { System.out.println("상환 금액이 대출 잔액을 초과합니다."); return; } loanBalance -= amount; withdraw(amount); } } public class Main { public static void main(String[] args) { SavingsAccount sa = new SavingsAccount("123-45-67890", "홍길동", 100000, 0.05); sa.printAccountInfo(); sa.deposit(100000); sa.printAccountInfo(); sa.withdraw(50000); sa.printAccountInfo(); sa.addInterest(); sa.printAccountInfo(); CheckingAccount ca = new CheckingAccount("123-45-67890", "홍길동", 100000, 100000); ca.printAccountInfo(); ca.deposit(100000); ca.printAccountInfo(); ca.withdraw(50000); ca.printAccountInfo(); ca.loan(100000); ca.printAccountInfo(); ca.repayLoan(50000); ca.printAccountInfo(); } } ``` ## 과제_2 : 프로그래머스 문제 풀기 모범 답안 1. 겹치는 선분의 길이 ```java class Solution { public int solution(int[][] lines) { int[] points = new int[lines.length * 2]; for (int i = 0; i < lines.length; i++) { points[i * 2] = lines[i][0]; points[i * 2 + 1] = lines[i][1]; } bubbleSort(points); int overlap = 0; for (int i = 0; i < points.length - 1; i++) { int count = 0; for(int j = 0; j < lines.length; j++){ if(lines[j][0] <= points[i] && points[i + 1] <= lines[j][1]){ count++; } } if (count >= 2) { overlap += points[i + 1] - points[i]; } } return overlap; } public static void bubbleSort(int[] array) { int n = array.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } } } ```