owned this note
owned this note
Published
Linked with GitHub
## 과제_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;
}
}
}
}
}
```