일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 달리기를말할때내가하고싶은이야기
- gulp
- 스프링5레시피
- 나만재밌는이야기
- a-d
- 프레디케이트
- 1월의독서
- es5
- 메서드참조
- JPA
- 객체지향생활체조원칙
- 엔티티매핑
- 일급함수
- 동작파라미터화
- Java8
- 클린코드
- 일빵빵알파벳파닉스
- 제대로알기
- 모던자바인액션
- 발음공부
- ES6
- 람다
- 스프링구성
- 다시보기연습
- 영속성컨텍스트
- spring configuration
- spring5receipe
- 생각
- 영속성
- 잡담
- Today
- Total
notepad
[리뷰 정리] 문자열 계산기 본문
Goal
- Git 학습 / 적응
- jUnit을 사용한 단위 테스트 경험
- 자바 코드컨벤션, 객체지향 생활체조원칙을 지키며 코딩
- 메소드 분리 및 객체지향적 프로그래밍 시도
저장소 :
간략한 구현 요구사항
사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해보자.
문자열 계산기 구현 리뷰 정리
static 선언 생각하고 쓰기
[상황] 적절한 분리 규칙 없이 메인 메서드에서 같은 클래스의 메서드 호출을 위해 호출시 메서드를 모두 static으로 변경
[리뷰] 어떤 경우에 static으로 선언하는가?1. 두 가지 이상의 컴포넌트에서 공통된 기능을 수행할 수 있으면서 2. 같은 입력에 대해 항상 같은 출력이 보장되는(멱등성을 가진) 로직인 경우 static method로 선언
[대응] 공통성이 없는 메서드들은 객체 생성하여 접근하는 방식으로 변경
[Tip] static 메서드만 존재하는 클래스 설계 시 생성자를 가려서, 객체 생성이 불가능하게 처리한다. (생성자에 private접근제어자 추가. Ex) private 클래스명(){} )
컬렉션 리턴 시 상위타입으로 선언
[상황] ArrayList를 생성 후 ArrayList로 반환하는 메서드를 추가
[리뷰] 컬렉션을 리턴할 경우, ArrayList 보단 상위 타입으로 리턴형을 선언해주는 것이 좋습니다.
[대응] List list = new ArrayList<>(); 형태로 상위 타입을 반환하도록 선언 변경,
확장이나 다형성의 개념에서 생각 했을 때. 상위타입으로 선언 후 하위타입 인스턴스를 생성하는게 좋겠다고 생각함
변수명에 축약어 사용하지 말기, 의미 있는 변수명 사용하기
[상황] 인덱스 생성을 위해 ‘operatorIdx’ 라는 변수를 선언, 입력 값을 모두 ‘data’ 라는 변수명을 사용하여 파라미터 선언
[리뷰] Idx 는 인덱스를 뜻하는 suffix이지요? 가급적 변수명에 축약어를 사용하지 않습니다,
[대응] operatorIndex, data -> input 으로 변경같은 로직을 실행하는 4개의 if문 제거하기 -> enum 사용
[상황] 입력받은 문자를 각 연산기호(+, -, *, /) 와 매칭하기 위해 4개의 if문으로 비교하는 로직 추가
[리뷰] 네 개의 if 문 없애는 방법을 고민해봅니다. 힌트: enum
[대응] enum 을 활용한 상수값을 선언하고 상수별 메서드를 구현하여 내부에서 연산을 처리하도록 로직 추가. 연산을 위한 추상 메서드를 선언하여 추 후 확장 고려 설계로 변경 (* effective java item 34 ~.35 열거타입 참고)
주요 학습 내용
1. PR 요청 & 깃 학습
온라인 코드리뷰 과정
- 프로젝트 fork -> 2. 로컬 환경에 프로젝트 클론 -> 3. 브랜치 생성 -> 4. 기능 구현 -> (add, commit, push) -> 5. github에서 PR요청 -> 6. 승인(merge) -> 7. 로컬 브랜치 삭제 -> 8. 원격 저장소 연결(최초 1회) -> 9. 원격 저장소 데이터 가져오기(fetch) -> 10. 동기화(rebase)
온라인 코드리뷰 명령어
- git clone -b {본인_아이디} —single-branch https://github.com/{본인_아이디}/{저장소 아이디}
- git checkout -b 브랜치이름
- git checkout master / git branch -D 삭제할_브랜치이름
- git remote add {저장소_별칭} base_저장소_url
- git fetch {저장소_별칭} {본인_아이디}
- git rebase {저장소_별칭} {본인_아이디}
기타 git command
- git checkout 파일명 - 브랜치 변경 외에도 스테이지에 올리기 전에 작업한 내용을 마지막 커밋 내용으로 되돌리고 싶을 때 사용
- git revert HEAD [파일명] add한 파일 unstage
- git revert HEAD~3 마지막 3개의 커밋 지우기(이력 유지)
2. Enum
- 자바는 특수한 목적의 참조 타입이 두 가지 있다. 하나는 클래스의 일종인 열거타입(enum) 이고, 다른 하나는 인터페이스의 일종인 애너테이션이다.
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 중첩 열거 타입 ~열거타입 언제?? 필요한 원소를 컴파일타임에 다 알 수 있는 상수 집합이라면 항상 열거 타입을 사용하자. / 메뉴 아이템, 연산코드, 명령줄 플래그, 태양계행성 등
열거 타입에 정의된 상수 개수가 영원히 고정, 불변일 필요는 없다.
- item34. Ordinal 메서드 대신 인스턴스 필드를 사용하라
- EnumSet, EnumMap과 같이 열거 타입 기반의 범용 자료구조에 쓰는 목적이 아니면 ordianl()은 절대 사용하지 마라