학습목표
- 자바 문법 공부
- git 활용법
요구사항 분석
- 입력받는 문자열에 따라 (사칙연산), (원의 넓이)를 계산한다
- 사칙 연산 계산기는 실수를 포함하여 계산 가능 해야한다.
- (remove) 입력을 받을 시 가장 먼저 계산된 결과값을 삭제하는 기능이 필요하다.
- (inquiry) 입력을 받을 시 저장된 결과값을 보여주는 기능이 필요하다.
- (exit) 입력을 받을 시 프로그램 종료 다른 입력을 받는다면 처음으로 돌아가서 기능 수행
프로그래밍 요구사항
- Scanner 사용
- JCF 사용
- forEach 사용
- 접근제어자 설정(캡슐화) getter, setter 구현
- static, final 사용 (상수)
- 추상클래스, 인터페이스 사용
- 메서드 책임 분리(SRP)
- enum 사용 - 사칙연산에 추가
- 제네릭 사용
- 람다&스트림 사용
오류&해결
오류
intellij 터미널 한글 깨짐 현상
원인 : 터미널 문자 인코딩이 UTF-8로 일치되지 않아서 발생
해결 : export LANG=ko_KR.UTF-8
설정
fatal: The current branch main has no upstream branch.
원인 : 현재 브랜치가 원격 저장소(origin)의 main 브랜치가 연결(upstream)되어 있지 않아서 발생하는 오류
- git remote -v : 로컬 저장소가 어떤 원격 저장소와 연결되어 있는지 보여준다.
- upstream : 로컬 브랜치가 원격 브랜치와 연결(upstream)되어 있는지 확인
git push -u origin main
- git push, git pull만 해도 자동으로 동기화
해결 : git
- git push, git pull만 해도 자동으로 동기화
입력을 기다리지 않고 다음 로직이 실행되는 현상
원인 : next() 사용 시 개행문자 \n
은 읽지 않기 때문에 next 사용 후 nextLine을 사용하면 남아있는 개행 문자\n
를 바로 읽어버려 입력을 건너뛰어서 발생
해결 : next()대신 nextLine()을 사용하여 개행 문자까지 읽는다.
다른 사람의 name과 email로 커밋 기록이 남는 현상
원인 : user.name, user.email을 설정해주지 않았다
해결git config user.name 이름
, git config user.email 이메일
설정
가장 최근 커밋 변경git commit --amend --author="새이름 <새이메일>" --no-edit
여러 커밋을 한 번에 변경하고 싶을 때git rebase -i --root -x "git commit --amend --author='새이름 <새이메일>' --no-edit"
잘못된 이름을 입력시 :q!
로 나온 후
진행 중인 rebase를 중단git rebase --abort
정상적으로 수정할 내용없이 저장되었다면:wq
저장하고 에디터 종료
You have unstaged changes
리베이스 도중 커밋 수정 작업이 완료되었으나, 작업 디렉토리 변경사항(unstaged changes)가 남아있어 리베이스를 계속 할 수 없다
원인 : git commit --amend
가 실행될 때 워킹 디렉토리나 인덱스에 변경이 남아있으면 Git은 리베이스를 중단하고 처리를 요구
해결
git status
로 어떤 파일이 변경되었는지 확인
변경사항을 커밋 후 git rebase --continue
The previous cherry-pick is now empty, possibly due to conflict resolution.
원인 : 커밋이 이미 워킹 트리에 반영되었거나, 충돌 해결 과정에서 변경점이 모두 사라져 empty커밋이 되었다.
해결 : 빈 커밋을 건너뛰는 방법 git rebase --skip
리베이스 성공 시
- 로컬 브랜치의 커밋 해시를 모두 새로 만든다
- 원격 저장소에는 이전 커밋들이 존재
- 이 상태에서 git push를 할 경우
거부
git push -f
git 커밋 메시지 수정
가장 최근 올라간 커밋 메시지 수정git commit --amend -m "새로운 커밋 메시지"
수정할 커밋 개수(n)만큼 rebase 실행git rebase -i HEAD~n
수정할 커밋의 pick을 reword로 변경pick 기존 커밋 메시지
-> reword 기존 커밋 메시지
수정 후 원격 저장소에 반영(강제 푸시)git push -f
기존 클래스를 제네릭으로 변경 후 오류
Unchecked call to 'result(T)' as a member of raw type
원인 : 제네릭 클래스 타입 파라미터를 명시하지 않고(raw type) 메서드 호출
해결 : 제네릭 타입 명시Calculator<String> calculator = new ArithmeticCalculator();
객체 선언 시 반드시 타입 파라미터를 명시
Unchecked assignment
원인 : 제네릭 타입을 명확히 지정하지 않고 객체를 할당할 때 발생
해결 : 제네릭 타입 명시
제네릭을 사용할 때는 제네릭 추상 클래스Calculator<T>
를 상속받는 모든 클래스는 <T>
가 무엇인지 명확하게 지정해야 한다.Calculator<Double> calculator = new ArithmeticCalculator();
public class ArithmeticCalculator extends Calculator<Double> { ... }
raw type 사용 금지
Calculator calculator = ...; // X (raw type)
ArithmeticCalculator calculator = ...; // X (raw type)
실수 연산 결과가 달라지는 현상
원인 : 컴퓨터의 부동소수점 연산 특성
해결 : String.format()
사용해서 소수점 둘째짜리까지만 표현
double result = getOpration.operator(a, b);
addResult(String.format("%.2f", result));
git rebase 취소 관련
리베이스 진행 중 취소git rebase --abort
리베이스 끝난 후git reflog
이전 HEAD를 찾는다git reset --hard HEAD@{n}
stream 사용mapToDouble(Double::doubleValue)
Double객체 대신 double 사용
- 객체끼리도 비교가 가능하나 기본형을 쓰면 불필요한 박싱/언박싱 없이 바로 산술 연산이 가능하다
max().orElse(Double.MIN_VALUE)
최대값을 구하고 리스트가 비어있다면 기본값 min을 사용filter(s -> {})
각 원소 (s)에 대해 조건을 검사해서true
값만 남기고false
가 되는 값은 걸러냅니다.catch(NumberFormatException)
숫자가 아닌 문자열이면 결과에서 제외collect(Collectors.toList())
필터링된 값들만 모아서 List<>로 만들어서 반환
'Java' 카테고리의 다른 글
Interceptor (4) | 2025.07.21 |
---|---|
Spring 정리 (0) | 2025.07.19 |
추상화와 상속 (2) | 2025.07.10 |
클래스 문법 (1) | 2025.07.08 |
[Java] 업캐스팅, 다운캐스팅 (0) | 2025.07.07 |