notepad

[리뷰 정리] 문자열 계산기 본문

ETC/클린코드_NEXT STEP

[리뷰 정리] 문자열 계산기

likewise_ 2020. 5. 25. 15:51

Goal

  1. Git 학습 / 적응
  2. jUnit을 사용한 단위 테스트 경험
  3. 자바 코드컨벤션, 객체지향 생활체조원칙을 지키며 코딩
  4. 메소드 분리 및 객체지향적 프로그래밍 시도

저장소 :

간략한 구현 요구사항

사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해보자.

문자열 계산기 구현 리뷰 정리

  1. static 선언 생각하고 쓰기

    [상황] 적절한 분리 규칙 없이 메인 메서드에서 같은 클래스의 메서드 호출을 위해 호출시 메서드를 모두 static으로 변경
    [리뷰] 어떤 경우에 static으로 선언하는가?

    1. 두 가지 이상의 컴포넌트에서 공통된 기능을 수행할 수 있으면서 
    2. 같은 입력에 대해 항상 같은 출력이 보장되는(멱등성을 가진) 로직인 경우 
        static method로 선언

    [대응] 공통성이 없는 메서드들은 객체 생성하여 접근하는 방식으로 변경
    [Tip] static 메서드만 존재하는 클래스 설계 시 생성자를 가려서, 객체 생성이 불가능하게 처리한다. (생성자에 private접근제어자 추가. Ex) private 클래스명(){} )

  1. 컬렉션 리턴 시 상위타입으로 선언

    [상황] ArrayList를 생성 후 ArrayList로 반환하는 메서드를 추가
    [리뷰] 컬렉션을 리턴할 경우, ArrayList 보단 상위 타입으로 리턴형을 선언해주는 것이 좋습니다.
    [대응] List list = new ArrayList<>(); 형태로 상위 타입을 반환하도록 선언 변경,
    확장이나 다형성의 개념에서 생각 했을 때. 상위타입으로 선언 후 하위타입 인스턴스를 생성하는게 좋겠다고 생각함

  1. 변수명에 축약어 사용하지 말기, 의미 있는 변수명 사용하기

    [상황] 인덱스 생성을 위해 ‘operatorIdx’ 라는 변수를 선언, 입력 값을 모두 ‘data’ 라는 변수명을 사용하여 파라미터 선언
    [리뷰] Idx 는 인덱스를 뜻하는 suffix이지요? 가급적 변수명에 축약어를 사용하지 않습니다,
    [대응] operatorIndex, data -> input 으로 변경

  2. 같은 로직을 실행하는 4개의 if문 제거하기 -> enum 사용

    [상황] 입력받은 문자를 각 연산기호(+, -, *, /) 와 매칭하기 위해 4개의 if문으로 비교하는 로직 추가
    [리뷰] 네 개의 if 문 없애는 방법을 고민해봅니다. 힌트: enum
    [대응] enum 을 활용한 상수값을 선언하고 상수별 메서드를 구현하여 내부에서 연산을 처리하도록 로직 추가. 연산을 위한 추상 메서드를 선언하여 추 후 확장 고려 설계로 변경 (* effective java item 34 ~.35 열거타입 참고)

주요 학습 내용

1. PR 요청 & 깃 학습

  • 온라인 코드리뷰 과정

    1. 프로젝트 fork -> 2. 로컬 환경에 프로젝트 클론 -> 3. 브랜치 생성 -> 4. 기능 구현 -> (add, commit, push) -> 5. github에서 PR요청 -> 6. 승인(merge) -> 7. 로컬 브랜치 삭제 -> 8. 원격 저장소 연결(최초 1회) -> 9. 원격 저장소 데이터 가져오기(fetch) -> 10. 동기화(rebase)
  • 온라인 코드리뷰 명령어

    1. git clone -b {본인_아이디} —single-branch https://github.com/{본인_아이디}/{저장소 아이디}
    2. git checkout -b 브랜치이름
    3. git checkout master / git branch -D 삭제할_브랜치이름
    4. git remote add {저장소_별칭} base_저장소_url
    5. git fetch {저장소_별칭} {본인_아이디}
    6. git rebase {저장소_별칭} {본인_아이디}
  • 기타 git command

    1. git checkout 파일명 - 브랜치 변경 외에도 스테이지에 올리기 전에 작업한 내용을 마지막 커밋 내용으로 되돌리고 싶을 때 사용
    2. git revert HEAD [파일명] add한 파일 unstage
    3. git revert HEAD~3 마지막 3개의 커밋 지우기(이력 유지)

2. Enum

  • 자바는 특수한 목적의 참조 타입이 두 가지 있다. 하나는 클래스의 일종인 열거타입(enum) 이고, 다른 하나는 인터페이스의 일종인 애너테이션이다.
  1. item34. 상수 대신 열거 타입을 사용하라

    • 열거타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 기존의 정수 열거 패턴은(상수형 선언을 늘어놓는 것) 타입 안전을 보장할 방법이 없고, 다른 타입의 같은 값을 동등 연산자로 비교하더라도 경고가 없다.

    • 자바의 열거타입은 완전한 형태의 클래스로 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다.

      public enum Fruit {APPLE, BANANA}
      ===
      public class Fruit{
      public static final Fruit APPLE = new Fruit();
      public static final Fruit BANANA = new Fruit();
      }
    • 열거 타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상 final이다.

    • enum 클래스 내에 접근제어자가 없는 생성자 추가시 기본이 private이다.

    • 인스턴스를 직접 생성하거나 확장 할 수 없으니 열거타입 선언으로 만들어진
      인스턴스들은 딱 하나씩만 존재한다.

    • 열거타입은 인스턴스 통제된다, 싱글턴은 원소가 하나뿐인 열거타입이다.

    • 열거타입은 컴파일타임 타입 안전성을 제공한다.

    • 열거타입에는 어떤 메서드도 추가할 수 있다.

    • 상수마다 동작이 달라져야 하는 상수의 경우 추상메서드 선언 및 상수별 메서드 구현으로 해결 할 수 있다. (github저장소 Calculator.java에 적용)

    • 열거 타입 상수 일부가 같은 동작을 공유한다면 전략 열거타입 패턴을 사용한다.
      -> private 중첩 열거 타입 ~

    • 열거타입 언제?? 필요한 원소를 컴파일타임에 다 알 수 있는 상수 집합이라면 항상 열거 타입을 사용하자. / 메뉴 아이템, 연산코드, 명령줄 플래그, 태양계행성 등

    • 열거 타입에 정의된 상수 개수가 영원히 고정, 불변일 필요는 없다.

  1. item34. Ordinal 메서드 대신 인스턴스 필드를 사용하라
    • EnumSet, EnumMap과 같이 열거 타입 기반의 범용 자료구조에 쓰는 목적이 아니면 ordianl()은 절대 사용하지 마라

학습 자료

Comments