TIL 2021.02.24

kyukim·2021년 2월 24일
0

TIL

목록 보기
45/278
post-thumbnail

🧐 TIL (Today I Learned)

1. merge되기 전 이어서 개발하기

지지난주에 TIL 기록을 보면 진짜 거의 git에 대해서만 계속 공부했던 것 같다.

미션의 진행은 각 단계별로 나뉘어져있고, 각 단계마다 PR을 보내고 리뷰받고 베이스 저장소인 upstream에 merge 되는 진행 과정이다.

그런데 예를 들어서 미션1을 pr보내고 계속 마냥 기다릴 수는 없는 노릇이다.

그래서 미션2를 진행해야하는데 이 과정에서 충돌이 일어날 수 있기 때문에 조심해서 작업해야한다.

난 충돌이 일어나는 원인조차 알수가 없었기 때문에 엄청 삽질울 많이했다

충돌이 일어나는 원인은 정말 간단하다. 같은 부모커밋에서 나온 각기 다른 버전에서 똑같은 곳을 수정하고 merge하려고 하면 자동으로 merge 안해준다.
부모커밋에 예를 들어서 A = 1 라는 라인이 있다.
근데 여기서 갈라져나온 다른 버전의 브랜치들이 각각 한쪽은 A = 2 다른 한쪽은 A = 3 이라고 했다고 치자.
merge할때 기본적으로 수정한 것으로 덮어씌우는 데 이경우에는 당연히 자동으로 merge를 할 수 없고 충돌이 일어나는것이다.

애초에 내가 테스트하려고 했던것도 사실은 테스트 자체가 잘못됐다는 것을 알았다.

예를 들어서, 미션1을 완료했다고 생각해보자. 그럼 먼저 PR을 보낸다.
그러고나서 미션1이 merge 되기까지 기다리기 싫기 때문에
그대로 미션1에서 미션2라는 브랜치를 만들어서 작업을한다.
아직도 미션1에서 리뷰어가 감감무소식이다.
이상태에서 미션2를 PR 보낸다.
현재 로컬의 상태를 그림으로 나타내면 다음과 같을것이다

지금 이상태는 미션1과 미션2가 PR을 마친상태라는 것을 기억하자

근데 아직도 계에에에에속 아무소식이 없어서 미션3도 해서 다음과 같이 3개의 PR이 생겼다

여기서 리뷰어가 드디어 등장했다.
리뷰어가 미션1을 잘못한게 너무나 많아서 1000군데를 고쳐달라고했다
밤새서 1000군데를 고쳐서 푸쉬했다. 자동으로 미션1 PR한곳으로 날라간다.
리뷰어가 잘했다고 merge 해줬다.

그럼 여기서 애초에 문제가 발생한다
미션1에서 1000군데나 고쳤기때문에 이미 미션2,3과는 너무많이 달라져있다. 이때 앗차하고 미션2를 미션1로 rebase or merge해서 다시 PR보내려고하면 충돌이 어마어마하게 많이 생겨있는 상태이다.

1000군데 고치기 전에 미션2,3을 진행한것과 고친후에 미션2,3을 진행한것은 결과물이 완전히 다를것이다

미션1 1000군데 고친것을 미션2에 merge하려고 해봤자 이미 로직이 많이 바뀐상태이기때문에 미션2는 더이상 의미가 없는것이 되버리고 미션3는 더더더욱이 의미가 없어진다.

그래서 동시에 PR 보내면안된다.

또 다른 예로 예를 들어서 미션1을 먼저안보고 미션2를 보고 여기저기 고쳐달래서 고쳐서 merge했다.

이미 미션2는 다른버전이 되버린것이다. 미션3은 또다시 무용지물이 되버리고, 미션1은 리뷰할 필요가 없어진다.

이같이 아주 복잡하게 되버린다.

그래서 미션1 하나 끝내고 로컬 메인브랜치로 동기화하고 거기서 미션2 브랜치를 만들어서 하라는 거였다.

2. 연산자

비트 논리 연산자

& 비트 교집합 -> 거짓과 참의 교집합은 거짓
| 비트 합집합 -> 거짓과 참의 합집합은 참
^ 비트 차집합 -> 차이가 있으면 참
~ 비트 부정 연산자 -> 비트단위로 뒤집어라 (예: 0011 -> 1100)

예시)
3 & 7은?
0011 & 0111 이다.
답은? 둘의 교집합 0011이다.

0과 0은 거짓과 거짓 -> 거짓
0과 1은 거짓과 참 -> 거짓
1과 1은 참과 참 -> 참

관계연산자 &&, || 도 AND, OR 이라고 생각할게 아니라 교집합, 합집합이라고 생각해야함

쉬프트 연산자

<< 왼쪽으로 미는 연산자
>> 오른쪽으로 미는 연산자

예시)
3 << 2는?
0011을 왼쪽으로 두칸을 민다.
두칸 밀면 1100 -> 10진법으로 12

참고로 더이상 밀릴곳이없으면 낭떠러지로 떨어져서 죽고 0으로 나온다고 생각하면됨 예시로 12 << 2 하면 1100을 왼쪽으로 두칸밀어야하니까 0000이다.

근데 11 << 2 하면 어떻게 될까? 11은 1011이다. 결과는 1110 이다.
1이 앞에있을때는 1이채워진다. 졸라 복잡하다

참고
자바 강의 24강 - 비트(bit) 연산자

복합 대입 연산자

+=
-=
*=
/=
%=
&= 비트 AND(교집합) 후에 대입
|= 비트 OR(합집합) 후에 대입
>>= 오른쪽 쉬프트 후에 대입
<<= 왼쪽 쉬프트 후에 대입

객체 형식 비교 연산자 (The Type Comparison Operator instancof)

instanof ~의 인스턴스 인지를 확인

참고
자바 강의 25강 - 복합 대입 연산자와 연산자 우선순위

3. 정적 팩토리 메서드의 장점

바깥에서 사용하는 정적 팩토리 메서드는 그 내용을 파악하지 않아도 된다. 그 메서드를 구현하는 클래스 내부가 어떤 로직으로 바뀌든지 실행결과만 같으면 되기 때문이다. 이것은 만드는 사람입장에서도 속편하게 해줌 굿굿!

profile
제 생각이 담긴 블로그입니다

0개의 댓글