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

[2주차] 객체지향 코드 연습(choi wonbin) #7

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

ChoiTheCreator
Copy link
Member

추가 Q & A

🤔 잘 모르겠거나, 더 궁금한 내용이 있었나요?

집중적으로 리뷰 받고싶은 것이 있나요?

Copy link
Contributor

@KoSeonJe KoSeonJe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메소드(=함수)의 길이는 20줄이상을 넘어가면 코드의 가독성이 떨어지게 됩니다. 그 이상 길이의 코드를 작성하게 된다면 메소드를 분리해주세요

코드 컨벤션을 지켜야 할 것 같습니다. 아래 링크를 참고해주세요
https://sihyung92.oopy.io/af26a1f6-b327-45a6-a72b-c6fcb754e219

이 코드가 실행되는 Main메소드가 구현이 되지 않고 있는 것 같습니다. 추가적으로 구현 해주시면 좋을 것 같아요

import java.math.BigDecimal;

public class Account {
//필요한 정보 : 일반 계좌 클래스의 속성은 종류 2가지 ( 1. N 예금계좌 , 2. S 적금계좌)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 내에 많은 주석을 만들어 놓는 것은 자신이 작성한 코드만 보고 이해할 수 없다는 것을 명시하고 있는 것입니다. 꼭 필요한 주석만 남겨주세요

//두번째 생성자에는 계좌번호와 소유자, 잔액을 표기한다.
public Account(String accountNum, String owner, BigDecimal balance) {
//생성자 체이닝을 활용하여, 위의 account()의 내용도 같이 선언해준다.
this();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생성자를 한번 더 호출하는 것이 아닌, 이 생성자 내부에서 같이 초기화 하는 것이 더 좋은 것 같습니다.





Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필요없는 줄은 모두 삭제해주세요

//계좌의 잔액이 출금하고자 하는 금액보다 낮다면 ( 에러 던지기)
if(this.balance.compareTo(amount) < 0){
throw new WithdrawException("잔액이 모자랍니다.");
}else{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else 문은 해당 메소드가 어떤 행위를 하고 있는지 더 많은 고민을 하게 만들기에 사용하는 것을 지양합니다.

early return 패턴을 사용해주세요

// 뱅크 클래스에서 호출할 출금, 입금 기본 메서드를 생성합니다.

//출금 관련 메서드 withdraw
public BigDecimal withdraw(BigDecimal amount) throws WithdrawException {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메소드의 책임을 줄여주는 것이 좋습니다.
출금 뿐만아니라 해당 잔고가 출금하려는 잔액보다 많은지의 여부를 판단하는 기능을 따로 메소드로 분리해주는 것이 좋을 것 같습니다


// getInstance 함수
public static CentralBank getInstance(){
if(instance == null)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 컨벤션을 지켜주세요
if문 내의 코드가 한줄이어도 괄호를 사용하여 감싸주는 것이 좋습니다

System.out.printf("%s님 계좌가 발급되었습니다.", owner);
return account;
}catch (InputMismatchException ime){
if(seq > 0) seq--;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어떤 일을 수행하고 있나요?


// 적금 계좌의 경우 잔액이 100만원 이상은 이자율이 50%, 그 외에는 1% 입니다.
if(balance.compareTo(BigDecimal.valueOf(1000000)) >= 0)
interest = BigDecimal.valueOf(0.5);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0.5가 어떤 것을 의미하나요? 변수를 선언하고 구체적인 변수명을 지어주세요

bank/src/main/java/org/example/Main.java Show resolved Hide resolved
E104("E104", "적금 계좌는 잔액이 목표 금액(%s원) 이상이어야 출금 가능합니다."),

// IO Error
E201("E201", "입력값 오류 발생");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

위 숫자들은 어떤 의미를 가지고 있나요? 더 의미있는 이름을 사용해보도록 합시다

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
E201("E201", "입력값 오류 발생");
INPUT_ERROR("E201", "입력값 오류 발생");

처럼 해당 필드의 제목은 떠오르기 쉽게 관리하는 것이 더 나을 것 같습니다!

Copy link

@Gopistol Gopistol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체적으로 구현에 초점을 맞춘 코드들이 있었습니다. 객체지향의 핵심인 역할, 책임, 협력에 대하여 한 번 찾아보시는 것을 추천합니다.

리뷰에서 역할, 책임 등의 단어가 많이 나왔습니다. 이렇게 추상적인 단어를 대입해 고민하는 이유는
추후 변경하기 용이한, 유연한 코드를 만들기 위함입니다. 또한 예상치 못한 에러 발생 시 더 빠르고 쉽게 대처할 수 있습니다.

남은 시간 동안 위에서 말씀드린 역할과 책임의 관점에서 구현한 코드에 대해 고민해보시면 좋을 것 같습니다!

E104("E104", "적금 계좌는 잔액이 목표 금액(%s원) 이상이어야 출금 가능합니다."),

// IO Error
E201("E201", "입력값 오류 발생");
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
E201("E201", "입력값 오류 발생");
INPUT_ERROR("E201", "입력값 오류 발생");

처럼 해당 필드의 제목은 떠오르기 쉽게 관리하는 것이 더 나을 것 같습니다!

//적금 계좌 클래스는 일반 예금 계좌 클래스에서 상속을 받고 목표 금액 속성이 추가 됩니다.


public class savingAccount extends Account {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

클래스 네이밍 컨벤션을 지켜주세요!

return (T)input;
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

askInput()이라는 메소드의 이름으로 봤을 때, 실제 이 메소드가 입력을 요청하는 행동을 할 것으로 생각됩니다. 하지만 실제 메소드에서는 입력이라는 역할보다 더 많은 역할을 가지고 있는 것 같습니다.

오로지 입력만을 위한 클래스를 따로 만든 후, 입력을 받는 과정은 입출력 용도로 사용하는 클래스를 사용할 수 있습니다.

Copy link

@Erichong7 Erichong7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전반적으로 자신이 어떤 코드를 작성했는지와 자신의 코드 흐름의 이해가 부족한 거 같습니다. 기능 개발을 무작정하는 것보다는 자신의 코드를 리펙토링하는 과정이 더 중요해보입니다. 좋은 예시들을 많이 접해보고 적용해봅시다. 코드 컨벤션 공부 중요합니다!

Comment on lines 16 to 19
public savingAccount(){
super();
this.category = "Saving";
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Category를 자바 enum을 사용한다면 조금 더 좋은 코드가 될 거 같습니다

*/

public class Bank {
protected static Scanner scanner = new Scanner(System.in);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

입출력에 대한 책임은 Bank에 있나요? Scanner 또한 static으로 설정한 이유가 궁금합니다. static이 붙은 변수, Sanncer 둘다 가비지 컬렉션 대상에서 제외됩니다. 입출력에 대한 책임 분리에 대하여 고민해봅시다.

//이자 계산
BigDecimal interest = interestCalculators.get(account.getCategory()).getInterest(account.getBalance());
result = account.withdraw(amount);
System.out.printf("\n출금액 %s원과 이자 %s원이 정상적으로 출금되었습니다.\n", df.format(result), df.format(interest));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

매직넘버에 대해 알아보고 적용해봅시다

this.category = category;
}

//필요한 계좌정보를 불러내는 메서드

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모든 기능에 대하여 일일이 주석을 다는 것은 좋아보이지 않습니다. 주석없이 이해가 되는 코드가 좋은 코드입니다. 만약 정말로 주석을 달고싶다면 JSdoc에 대하여 알아보고 적용하는 것도 좋아보이네요


}

//getter & setter part - 접근 지정자가 protected 이기 때문에

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setter를 남발하는 것은 좋지 않습니다. 자바의 캡슐화에 대하여 고민해봅시다.

//signum() 함수는 0,-1, 1 셋 중 하나를 반환하며 음수인지 양수인지 0인지를 파악하는 함수이다.

// 즉 input type = bigdecimal인데, 소수점이 존재하거나 음수일 경우
if (input instanceof BigDecimal && (((BigDecimal) input).scale() > 0 || ((BigDecimal) input).signum() < 0)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instanceof는 SOLID원칙을 해치기 때문에 지양해야합니다. instanceof를 사용하지 않는 방식은 정말정말 많습니다.
https://tecoble.techcourse.co.kr/post/2021-04-26-instanceof/

Comment on lines 90 to 92
}catch(WithdrawException we) {
throw we;
}catch (Exception e){

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개별적으로 커스텀한 Exception을 만들어 두셨음에도 에러 메세지를 생성자로 보내고 있지 않는데 이유가 무엇인가요?

Copy link
Contributor

@KoSeonJe KoSeonJe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고쳐야할 점 말씀 드리겠습니다.

  1. 사용하지 않는 메소드, 클래스 삭제하기
  2. MVC패턴을 사용하기 위해서 MVC패턴이 어떤 것인지 정확히 파악하기. 저도 10번이상 검색하면서 많이 찾아봤습니다. 그만큼 이해가 잘안됐습니다.
  3. 메소드 20줄이상 넘기지 않기
  4. switch문 enum으로 바꾸기
  5. 메소드명, 변수명 신경써서 짓기
  6. 접근 제어자, final키워드, static키워드 신경써서 적용하기
  7. 입출력을 객체로부터 분리하기. 객체 내에서 입출력 제발 하지 말기
  8. 코드 컨벤션 지키기... 중요!!

화이팅입니다! 스프링이 중요한게 아닙니다. 이것부터 제대로 알고 가야하는 것이 중요해요


//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main이라는 이름보다 더 의미있는 이름으로 변경해주세요
예를 들어 BankingApplication, BankingSystem

public class Main {
public static void main(String[] args) {
Bank bank = new Bank("국민은행");
bank.menuBank();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

menuBank() 명사+명사 보다 동사+명사로 메소드명을 짓는게 의미를 전달하기 더욱 좋습니다

Comment on lines +18 to +19


Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change

Comment on lines +10 to +11
public String id;
public String pw;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public String id;
public String pw;

User에도 id와 pw가 있는데, 사용되지 않는다면 지워주시길 바랍니다


public class Account {

public static int howmanyaccout = 0;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public static int howmanyaccout = 0;
private static int howmanyaccout = 0;

접근제어자를 private로 하여 캡슐화를 지키도록 합시다.
Account를 관리하고 있는 객체가 있을텐데, 그 객체를 이용해 계좌 개수를 알아내도 괜찮을 것 같습니다
위 변수는 필요가 없을 것 같습니다


public void displayinfo_Bank(){
System.out.println("현재 사용하고 계신 은행 : "+ nameofBank);
for(int i=0; i<accountList.size(); i++){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

stream에 대해 공부해보시고 적용하시키세요

}


public void displayinfo_Bank(){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스네이크 표기법이 아닌 카멜케이스 표기법을 사용해주세요

AccountView accountView = new AccountView(accountList.get(accountcnt));
accountView.showmenu();
}
else{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else는 사용하지 않는 것이 가급적 좋습니다.
early return 패턴을 사용해보세요

delete(accountList.get(accountcnt).id,pw);
}

public void delete(String id, String pw){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public void delete(String id, String pw){
private void delete(String id, String pw){

Comment on lines +177 to +181





Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants