Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[8주차] 최원빈 학습 PR 제출합니다. #41

Open
wants to merge 81 commits into
base: ChoiTheCreator-patch-1
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
85d5781
Rename week01/week01.md to week01방현우.md
baaamk Mar 25, 2024
9f7b103
Rename week01방현우.md to week01/방현우.md
baaamk Mar 25, 2024
683d507
Update 방현우.md
baaamk Mar 25, 2024
d026878
Update 방현우.md
baaamk Mar 25, 2024
3d51e0f
Update 방현우.md
baaamk Mar 25, 2024
e73f94f
Create Juuuu-power-e.md
Juuuu-power-e Mar 29, 2024
0d7c385
Update Juuuu-power-e.md
Juuuu-power-e Mar 29, 2024
09888a2
Update Juuuu-power-e.md
Juuuu-power-e Mar 29, 2024
01c7209
starshape.md파일 추가
starshape7 Mar 31, 2024
7228b7f
starshape77.md파일 추가
starshape7 Mar 31, 2024
e7e7c88
2주차 학습 PR
win9-tech Apr 1, 2024
259536a
docs:2주차 과제 제출
tiemo0708 Apr 1, 2024
41f92e2
:memo: WEEK2 학습내용 작성
BaekJaehyuk Apr 1, 2024
84b1018
Update Juuuu-power-e.md
Juuuu-power-e Apr 1, 2024
a728d05
Update Juuuu-power-e.md
Juuuu-power-e Apr 1, 2024
2383e94
Update Juuuu-power-e.md
Juuuu-power-e Apr 1, 2024
7267442
md 추가
baaamk Apr 1, 2024
336eb18
Create 0711kc.md
0711kc Apr 1, 2024
0da9a91
Update 0711kc.md
0711kc Apr 1, 2024
2ae3d5b
docs : Add 0711kc.md
0711kc Apr 8, 2024
7fff273
docs : Update 0711kc.md
0711kc Apr 8, 2024
d1152c9
docs : Add 0711kc.md
0711kc Apr 15, 2024
0eba874
docs : Update 0711kc.md
0711kc Apr 15, 2024
22c6c53
Update 0711kc.md
0711kc Apr 15, 2024
29f3b97
Create README.md
Gopistol May 1, 2024
90ccd10
Rename README.md to README.md
Gopistol May 1, 2024
71c364b
Rename README.md to README.md
Gopistol May 1, 2024
d86043d
Update README.md
Gopistol May 1, 2024
43a9fc6
Merge remote-tracking branch 'upstream/main'
invalid-email-address May 1, 2024
a718432
docs : Add 0711kc.md
invalid-email-address May 1, 2024
304fd7b
Merge branch 'COW-edu:main' into main
baaamk May 2, 2024
cac5986
docs : Update 0711kc.md
0711kc May 2, 2024
214bc9f
Merge branch 'COW-edu:main' into main
BaekJaehyuk May 2, 2024
63d1d61
Merge branch 'COW-edu:main' into main
win9-tech May 3, 2024
2a843a8
7주차 학습 PR
win9-tech May 3, 2024
e9ed79d
Merge pull request #23 from COW-edu/ChoiTheCreator-patch-1
KoSeonJe May 4, 2024
413a137
Merge pull request #21 from baaamk/main
KoSeonJe May 4, 2024
781e0eb
Merge pull request #20 from Juuuu-power-e/main
KoSeonJe May 4, 2024
6b2225d
Merge pull request #19 from BaekJaehyuk/main
KoSeonJe May 4, 2024
7e27a04
Merge pull request #18 from tiemo0708/main
KoSeonJe May 4, 2024
b4db1dd
Merge pull request #16 from starshape7/main
KoSeonJe May 4, 2024
3ea9177
7주차
qwejiung May 5, 2024
5305a9d
readme
qwejiung May 5, 2024
21ef809
사진추가
qwejiung May 5, 2024
176a2e8
Update 김지웅.md
qwejiung May 5, 2024
067de43
Delete week07/README.md
qwejiung May 5, 2024
7e0d0ec
김지웅.md
qwejiung May 5, 2024
342a61c
:memo: WEEK7 학습내용 작성
BaekJaehyuk May 6, 2024
3f06d27
7주차 과제 제출
starshape7 May 7, 2024
7eb101f
7주차 과제 수정_이미지 추가
starshape7 May 7, 2024
40f1c1d
김민진.md
fuirian May 7, 2024
972127a
Merge branch 'COW-edu:main' into main
BaekJaehyuk May 7, 2024
dbdf932
docs:7주차 과제 제출
tiemo0708 May 7, 2024
edd5ca6
docs:7주차 과제 제출
tiemo0708 May 7, 2024
5080855
추가 수정
fuirian May 7, 2024
15d16c5
Delete 최원빈.md
ChoiTheCreator May 7, 2024
6660840
Delete 최원빈.md
ChoiTheCreator May 7, 2024
3f4b93d
Create 최원빈.md
ChoiTheCreator May 7, 2024
00392d1
Update README.md
baaamk May 7, 2024
41152b6
Rename README.md to 방현우.md
baaamk May 7, 2024
541cc94
Create 이승주.md
Juuuu-power-e May 7, 2024
d1965a9
docs: 8주차 과제 공지
May 8, 2024
2d8a9c2
docs: 파일 수정
May 8, 2024
6e918e8
docs: week08 h2 버전 추가
May 9, 2024
8d98234
Update README.md
0702Yoon May 9, 2024
1dff662
Merge pull request #33 from 0702Yoon/patch-2
May 9, 2024
a605c62
Merge branch 'COW-edu:main' into main
BaekJaehyuk May 10, 2024
c906947
Merge remote-tracking branch 'upstream/main'
invalid-email-address May 11, 2024
e16576f
docs : Add 0711kc.md
invalid-email-address May 11, 2024
ea59ae8
Merge pull request #17 from win9-tech/main
May 11, 2024
8f46c28
Merge pull request #22 from 0711kc/main
May 11, 2024
7e74f20
Merge pull request #24 from qwejiung/main
May 11, 2024
71ade4e
Merge pull request #25 from BaekJaehyuk/main
May 11, 2024
c050324
Merge pull request #26 from starshape7/main
May 11, 2024
e716de9
Merge pull request #27 from fuirian/main
May 11, 2024
496f34d
Merge pull request #28 from tiemo0708/main
May 11, 2024
6ea2c98
Merge pull request #29 from ChoiTheCreator/main
May 11, 2024
1b490a7
Merge pull request #30 from baaamk/main
May 11, 2024
dc86d85
Merge pull request #31 from Juuuu-power-e/main
May 11, 2024
bf05fac
docs: 공지 파일 수정
May 11, 2024
95d0333
[8주차] 최원빈 학습 PR 제출합니다.
ChoiTheCreator May 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions week01/방현우.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@

본격적으로 Spring 학습에 들어가기 전에 여러분은 객체지향 코드에 대해 학습하고 이해하는 시간을 가지실겁니다!

<<<<<<< HEAD
객체지향 코드를 짜기 위해서는 우리가 사용할 언어인 JAVA에 대해 이해하고 있어야합니다.
=======
객체지향 코드를 짜기 위해서는 우리가 사용할 언어인 JAVA에 대해 이해하고 있어야합니다.
>>>>>>> 7d404092702712c910f654086ae5c989aed08238

이 온보딩 과제는 이번 COW L2 - Spring에 함께 하시는 9분의 개개인의 역량이 다르기 때문에 가장 최소한으로 알고 계셔야 할 내용을 중심으로 선정해봤어요!

Expand All @@ -13,13 +17,21 @@
개인적으로, 분명 학습했던걸 다 기억하실 수 없으실거예요! 저도 마찬가지이고요.. 공부했던 것을 잘 정리해두는 습관을 가지는 것은 분명 큰 도움으로 돌아올 것이라 생각합니다. 그런 의미로 다들 파이팅해봐요!

---
<<<<<<< HEAD
> 아래의 필수 질문은 모든 분들이 정리하고 학습하셔야하는 내용입니다. 선택 질문은 원하시는 분들만 하시면 되지만 분명 학습하시면 큰 도움이 될 것들을 추려봤습니다!
=======
> 아래의 필수 질문은 모든 분들이 정리하고 학습하셔야하는 내용입니다. 선택 질문은 원하시는 분들만 하시면 되지만 분명 학습하시면 큰 도움이 될 것들을 추려봤습니다!
>>>>>>> 7d404092702712c910f654086ae5c989aed08238

# 필수

## 자바 역사와 버전별 특징
LTS는 Long Term Support로 오랜기간 지원하는 특별한 버전 에디션.
<<<<<<< HEAD
자바에서 많이 쓰는 LTS버전을 주로 정리해보았다.
=======
자바에서 많이 쓰는 LTS버전을 주로 정리해보았다.
>>>>>>> 7d404092702712c910f654086ae5c989aed08238
java1
1996년 1월에 공개되었으며 발표 이전에 불린 이름은 Oak였다.
안정화 작업을 거친 1.0.2 버전에서 Java로 이름이 바뀌었다.
Expand Down Expand Up @@ -96,12 +108,20 @@ static이 붙은 멤버변수는 객체의 개수에 상관 없이 단 하나만
staitc을 붙이는 것을 고려한다.

나온 의미
<<<<<<< HEAD
멤버변수
=======
멤버변수
>>>>>>> 7d404092702712c910f654086ae5c989aed08238
모든 객체에 공통적으로 사용되는 클래스 변수가 된다.
클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
클래스가 메모리에 로드될 때 생성된다.

<<<<<<< HEAD
메서드
=======
메서드
>>>>>>> 7d404092702712c910f654086ae5c989aed08238
객체를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

Expand All @@ -111,13 +131,23 @@ static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없
## final 키워드
기본적으로 final이 붙으면 변경할 수 없다고 생각하면 된다.
1. final 변수
<<<<<<< HEAD
변수 선언할 때 클래스 앞 final 키워드가 들어간다. 이 변수는 초기화 후 변경이 불가능 하다.
2. fianl arguments(인자)
final로 선언된 인자는 메소드 내에서 변경이 불가능하다. 따라서 다음과 같이 final int로 선언한 number는 읽을 수 있지만, number = 2처럼 값을 변경하려고 하면 컴파일 에러가 발생한다
3.final 클래스
클래스에 final을 붙이면 다른 클래스가 상속할 수 없는 클래스가 된다. 다음과 같이 final 클래스를 상속하려고 하면 컴파일 에러 발생.
4.final 메소드
final 메소드는 Override가 안되도록 한다. 예를 들어 다음과 같이 MJ 클래스를 상속하는 MMJ 클래스에서는 getHello()를 재정의할 수 없다. Override하려고 하면 컴파일 에러가 발생한다.
=======
변수 선언할 때 클래스 앞 final 키워드가 들어간다. 이 변수는 초기화 후 변경이 불가능 하다.
2. fianl arguments(인자)
final로 선언된 인자는 메소드 내에서 변경이 불가능하다. 따라서 다음과 같이 final int로 선언한 number는 읽을 수 있지만, number = 2처럼 값을 변경하려고 하면 컴파일 에러가 발생한다
3.final 클래스
클래스에 final을 붙이면 다른 클래스가 상속할 수 없는 클래스가 된다. 다음과 같이 final 클래스를 상속하려고 하면 컴파일 에러 발생.
4.final 메소드
final 메소드는 Override가 안되도록 한다. 예를 들어 다음과 같이 MJ 클래스를 상속하는 MMJ 클래스에서는 getHello()를 재정의할 수 없다. Override하려고 하면 컴파일 에러가 발생한다.
>>>>>>> 7d404092702712c910f654086ae5c989aed08238

재할당만을 막아줄 뿐, 참조하고 있는 객체 내부의 상태가 변하지 않았음을 보장해주지는 않는다.

Expand Down Expand Up @@ -174,7 +204,11 @@ extends | implements
서로가른 개넘끼리 이름충돌 가능
서로 다른 개념임에도 비교 연산 가능

<<<<<<< HEAD
개념
=======
개념
>>>>>>> 7d404092702712c910f654086ae5c989aed08238
num에 정의된 상수들은 해당 enum type의 객체이다

enum Fruit {apple, peach, banana}
Expand Down Expand Up @@ -208,6 +242,26 @@ enum은 위와 같이 생성자를 정의할 수 있는데, 접근제어자는 p

## 객체지향 4대 특성
1. 추상화
<<<<<<< HEAD
객체의 공통적인 속성과 기능을 추출하여 정의하는것


2. 상속
기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소
 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용
반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근
재사용성 용이

3. 다형성
객체 지향 프로그래밍의 꽃
어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질
어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성
오버라이딩 오버로딩이 그 예
4. 캡슐화
서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것
이유
• 데이터 보호(data protection) – 외부로부터 클래스에 정의된 속성과 기능들을 보호
=======
객체의 공통적인 속성과 기능을 추출하여 정의하는것


Expand All @@ -226,6 +280,7 @@ enum은 위와 같이 생성자를 정의할 수 있는데, 접근제어자는 p
서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것
이유
• 데이터 보호(data protection) – 외부로부터 클래스에 정의된 속성과 기능들을 보호
>>>>>>> 7d404092702712c910f654086ae5c989aed08238

• 데이터 은닉(data hiding) – 내부의 동작을 감추고 외부에는 필요한 부분만 노출

Expand Down
91 changes: 91 additions & 0 deletions week02/0711kc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Week02

PR 링크 : https://github.com/COW-edu/practice-oop-banking/pull/13

### 1. 가장 먼저 요구사항을 보며 만들만한 클래스들을 먼저 정리하였다.

### Account
Account는 인터페이스를 쓸 지 추상클래스를 쓸 지 고민을 하였다. 일단 인터페이스를 사용하기로 정하고 시작했다.
- 일반 계좌 : NormalAccount
- 적금 계좌 : SavingAccount -> Attributes + TargetAmount
> Attributes : Category(Enum), AccountNumber, AccountOwner, AccountBalance, AccountActivationStatus
>
> getAccountInfo() //적금 계좌는 Override해서 목표 금액 정보도 함께
>
> withdrawal(BigDecimal value) //적금 계좌는 잔액이 목표 금액 이상이어야 출금 가능하도록 출금메서드 구현
>
> deposit(BigDecimal value)

### Banking
- 계좌 인터페이스의 계좌생성, 출금, 입금, 송금 메서드를 이용
- 내부에 입력값 받기 가능

### CentralBank
- ArrayList<Account>
- HashMap<Category, InterestCalculator> - 계좌 종류 별 이자 정책

### InterestCalculator 인터페이스
- BigDecimal getInterest(balance);

> 클래스 종류 : Bank, CentralBank, Account, NormalAccount, SavingAccount, NormalInterestCalculator, SavingInterestCalculator
> 인터페이스 : InterestCalculator
> Enum : AccountType

이렇게 미리 클래스를 생각해두고 할 수 있으니 확실히 요구사항을 처음에 미리 잘 정리하고 시작하는 것이 중요하단 것을 느꼈다.

---
### 2. 예외처리
1. 입금할 금액을 적으라고 했는데 한글로 입력할 경우는 scanner의 nextInt와 NumberFormatException을 활용해서 처리했다.
```java
private int getInputInt(String printMsg) {
System.out.println(printMsg);
boolean validData = false;
int inputInt = 0;
do {
try {
String input = scanner.next();
inputInt = Integer.parseInt(input);
if(inputInt < 0) System.out.println("0보다 큰 숫자를 입력해주세요.");
else validData = true;
} catch (NumberFormatException e) {
System.out.println("숫자를 입력해주세요.");
}
} while(!validData);
return inputInt;
}
```

2. 없는 계좌로 송금, 입금, 출금을 시도할 경우는 따로 Exception을 만들지 않고 메소드를 이용해서 boolean값을 반환하게 만들었다.
```java
public boolean checkAccountNumber(String accountNumber) {
for(Account account : accountList) {
if(account.checkNumber(accountNumber))
return true;
}
return false;
}
```
> Stream의 filter를 이용할까 생각해봤지만, 그렇게 되면 항상 n개의 ArrayList를 모두 돌아봐야되고, 결과는 항상 최대 1개의 Account만 나오는데도 불구하고 List로 만들어야 되는 것이 불편해서 for문과 if문을 사용하였다.

3. 계좌 생성 시 계좌 형식에 맞지 않는 경우
사용자로부터 입력받는 것은 어떤 종류의 계좌인지와 사용자의 이름뿐이다.

이름은 숫자가 아닌 문자라면 어떠한 값이 들어와도 문제가 되지 않을 것 같아서 matches()를 이용해서 처리했고, 계좌의 종류는 입금 금액을 입력받을 때 사용했던 getInputInt를 재사용해서 숫자만 입력받게 만들었다.

4. 계정이 비활성화되어 있는 경우
이는 CentralBank에서 계정 삭제랑 계정 활성화를 제외한 요청을 받았을 때, 활성화 상태를 확인하고 비활성화상태라면 DeactivatedAccountException을 발생시키게 만들었다.

이를 확인한 BankingApplication에서는 해당 계정이 비활성화된 계정이라고 전달해준다.

### 3. 새로 알게된 것

1. BigDecimal
BigDecimal, BigInteger라는 클래스에 대해 처음 알게 되었습니다.

지금까지는 double, int가 모두 정상적으로 계산이 이루어진다고 생각했었는데 약간씩의 오차가 있었다는 것을 알게 되었고, BigDecimal 사용법도 그렇게 어렵지 않고 은근 편했던 것 같습니다.

2. StringBuilder
지금은 append 밖에 사용해보지 못했지만, StringBuilder로 String을 다양하게 수정할 수 있고, + 연산보다 append가 더 성능이 좋단 것을 알 수 있게 되었습니다.

3. 깃허브..
지금까지는 깃허브에 그냥 코드를 올려두고 저장하는 용도로만 사용했었는데, 사용하지 않았던 다양한 방법으로 깃허브를 활용해볼 수 있었던 것 같습니다.
99 changes: 99 additions & 0 deletions week02/BaekJaehyuk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# 1. 구조

## 1.1 MVC 패턴

- `View`
- `Controller`
- `Service`
- `Repository`
- `Domain`

이 외 `Exception`, `DTO`, `계좌별 이자 정책` 등 각각의 역할을 분리하여 기능을 구현하도록 설계.

## 1.2 싱글톤 패턴

다음과 같이 의존관계를 생성

```java
private static final Service bankservice = new BankService();
private Repository centralBankRepo = CentralBank.getInstance();
```
## 1.3 메시지 코드

메시지를 관리하는 클래스를 생성하여 유지보수 및 코드변경에 유리하도록 설계

```java
public static final String CHOICE = "아래 기능 중 하나를 선택하세요.";
public static final String MENU= "(1) : 계좌 생성 (2) : 입금 (3) : 출금 (4) : 송금 (5) 계좌조회 (6) 프로그램 종료" ;
public static final String ACCOUNT_TYPE= "(1) : 예금 계좌 , (2) : 적금 계좌";
public static final String ACCOUNT_NUMBER = "계좌번호를 입력하세요. (8자리 입력)";
public static final String ACCOUNT_OWNER = "이름을 입력하세요.";
public static final String BALANCE = "금액을 입력하세요.";
```

## 1.4 예외처리

`Checked Exception`이 아닌 `Unchecked Exception`을 사용한 예외처리 구현

---

# 2. 클래스


View - `BankView`
:

1. `AccountDTO` 을 통해 각각의 도메인에 값을 할당
2. `DecimalFormat` 을 통해 계좌번호의 패턴을 설정.
3. 입력값을 받아 해당하는 기능을 실행시키도록 구현.


---

Repository (Interface) - `CentralBank(Impl)`
:
1. `ArrayList`를 사용하지 않고, 계좌를 배열에 관리하기 위한`HashMap` 활용하여 계좌를 관리

---

InterestCalculator (Interface) : `NormalInterestCalculator(Impl)`, `SavingInterestCalculator(Impl)`
:

1. SavingInterestCalculator
: 삼항연산자를 사용하여 잔액에 따른 이자율 책정

2. NormalInterestCalculator
: 숫자 범위에 따른 값 할당을 할 경우 사용하면 좋은 `NavigableMap<Object, Object>`을 사용하여
금액에 따른 이자율 책정 로직을 구현 + (`floor.Entry()` 사용하여 범위 값 할당)


---

BasicAccount, SavingAccount
:

1. 요구사항에 맞춰 적금 계좌 클래스(`SavingAccount`)는 예금 계좌 클래스(`BasicAccount`)에서 상속을 받는다.

---

# 3. 기능

* 입금
* 출금 (적금계좌일 경우,목표금액을 달성했을 경우에 출금 가능)
* 송금
* 계좌 조회


---

# 4. 고민

이번 `Banking Service` 구현을 MVC 패턴을 지키면서 구현하면서 MVC 패턴을 지키는 것이 좋을까라는 의문이 생겼다. 관련해서 서치를 해보니 서비스 규모에 따라 MVC 패턴을 적용할 것인지 아닌지 중요하다는 점을 알게 되었다. 이번 4월 1일까지 구현한 코드가 지저분하고
관심사에 따른 역할이 완벽하게 구현이 되지 않아 크게 아쉬움을 가지고 있다. 해당 코드를 리팩토링을 통해 SOLID 원칙을 최대한 위반하지 않은 코드로 수정하고 싶다. 또한, 기능 요구사항 외의 예외처리를 다양하게 하고 싶다

또한, `View`에서 `switch-case` 문을 통해 기능을 선택하도록 구현하였다. HashMap을 사용하여 원하는 기능을 선택할까도 하였지만, 이 역시 관련하여 구글링을 하니 고정된 값일 경우 switch-case가 더 좋다고 알게 되었다.
추후에 `View` 관련 코드도 같이 수정할 예정이다.

기능 요구사항을 구현하면서 해당 기능을 단위로 테스트를 진행하고자 했지만, 조금 급하게 짜는 경향이 있어 `TDD 방식`의 기반의 개발을 하지 못한 점이 아쉽게 생각한다.


68 changes: 68 additions & 0 deletions week02/Juuuu-power-e.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
1. 잔액이 출금요청액보다 작을 경우를 조건문으로 처리할까, 예외를 발생시켜 처리할까
조건문으로 처리할 경우 가독성이 증가하고 빠름 / 예외발생은 구조적 통일성?
2. 생각해보니 1)의 내용을 판단하는 주체는 계좌가 아닌 은행이어야함.
-> 이 경우를 생각해보니 예외처리가 맞는것 같음. ∵ 입금액을 한글로 입력한 것과 같이 입력값의 오류이므로, 또한 다시 입력기회를 줘야하므로 동일하게 처리해야할듯
-> 더 생각해보니 예외사항이 맞나..? 충분히 예상가능한값이므로 정규표현식으로 유효성검증을 해야하지않을까?
4. 아예 BigDecimal의 서브클래스를 만들어 subtract()를 재정의하고 compareTo<0인 경우 예외처리를 하면 어떤가?
-> 코드가 간결해지고 예외 발생의 위치가 논리적으로 옳은방향인듯 하지만 추후 마이너스통장이 추가되거나 기타 상황들에서 문제가 발생할 수 있어 좋은구조는 아닌듯함
5. 입,출금 메서드는 데이터무결성이 중요한 파트임 -> 여러 은행 객체가 동시에 계좌에 접근하면 안되고, 입출금 과정중 문제가 발생한 부분이 생기면 실행 이전의 상태를 복구해놔야함. 1) 아직 쓰레드를 사용하지 않으므로 synchronized를 사용하진 않아도됨. 2) 입출금메서드가 boolean을 리턴해서 성공여부를 파악 가능하도록함.
6. 이자율 테이블을 변동가능하게 하고 싶은데, 어렴풋하게만 그려져서 일단 구현은 뒤로미룸.
7. AccountNum을 객체로 만드는게 좋을거같음. => Branch ∵ 1) 앞의자리 0이 생략되지 않아야하고, 2) 각 부분이 의미를 가짐 3) 옳은지 검증하는 checkDigit (verifyNum)이 존재


---
생성형 AI사용

1. 사용쿼리 : 프로그래밍을 연습하면서 가상의 은행시스템을 만들거야. 계좌번호를 발급하는 규칙을 만들어줘.
가상 은행 시스템을 만들 때 사용할 수 있는 일반적인 계좌번호 발급 규칙은 다음과 같습니다. 이러한 규칙은 보안과 중복을 방지하기 위해 설계됩니다.

1. **고유성 보장**: 모든 계좌 번호는 고유해야 합니다. 중복된 계좌 번호가 있으면 안 됩니다.

2. **길이와 형식 지정**: 계좌 번호의 길이와 형식을 지정합니다. 일반적으로 숫자로만 이루어진 길이가 일정한 형식을 가집니다.

3. **지역 식별자**: 계좌 번호의 일부는 해당 은행이나 지역을 식별할 수 있는 정보를 포함할 수 있습니다. 이는 보안을 강화하고 은행 시스템을 운영하는 데 도움이 될 수 있습니다.

4. **체크 디지트**: 계좌 번호의 유효성을 검사하기 위한 체크 디지트를 포함할 수 있습니다. 이를 통해 입력 오류를 방지하고 데이터 정합성을 유지할 수 있습니다.

5. **랜덤 발급**: 계좌 번호를 무작위로 발급하여 보안성을 높일 수 있습니다. 또한 일련 번호를 통해 계좌 번호를 쉽게 예측할 수 없도록 합니다.

예를 들어, 다음은 일반적인 계좌 번호 형식의 예입니다:

- **은행 코드**: 3자리 숫자로 구성됩니다.
- **고객 번호**: 7자리 숫자로 구성됩니다.
- **체크 디지트**: 1자리 숫자로 구성됩니다.

이러한 경우, 계좌 번호는 총 11자리로 구성됩니다. 이 숫자는 각 은행에서 고유하게 할당됩니다. 각 은행은 자체적으로 이러한 계좌 번호를 생성하고 관리할 수 있습니다.

2. 사용쿼리 : 계좌번호에 올바른 검증숫자(11번째 수)를 만들어주는 메소드
String createVerifyNum(String accountNum)를 완성해줘

```
private String createVerifyNum(String accountNum) {
int[] weights = {2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4}; // 각 숫자에 곱해질 가중치

int sum = 0;
for (int i = 0; i < accountNum.length(); i++) {
char digit = accountNum.charAt(i);
if (Character.isDigit(digit)) {
int num = Character.getNumericValue(digit);
sum += num * weights[i];
} else {
// 숫자가 아닌 경우 처리
// 여기서는 예외처리 없이 그냥 패스하도록 함
}
}

int remainder = sum % 11;
int verifyNum;
if (remainder == 0)
verifyNum = 0;
else if (remainder == 10)
verifyNum = 'X';
else
verifyNum = 11 - remainder;

return String.valueOf(verifyNum);
}
```

7 changes: 0 additions & 7 deletions week02/README.md

This file was deleted.

Loading