(2022.02.18)
오늘부터 TIL도 블로그에 남겨 보기로 했다. 조금씩!
어제오늘 한 삽질들
1. Git이랑 계속 싸우기
PR이 다 끝나기 전에 브랜치 파서 작업하다가 삽질을 엄청 했다. 가장 큰 문제는 PR이 approve되어서 merge까지 완료된 upstream 저장소를 rebase로 끌어오면, 이전에 PR 보냈던 커밋까지 계속 포함된다는 것. 그래서 처음에는 1) cherry-picking
으로 새로운 커밋만 범위를 지정해서 커밋해 봤다. 근데 커밋은 잘 됐는데 PR 보내려고 하면 또 예전 커밋까지 같이 뜬다.
그래서 일단 rebase -i upstream/street62(업스트림 브랜치 이름)
로 해결했다. -i 플래그를 붙이면 rebase될 커밋 목록이 vi에 쫙 뜨는데, 거기에서 PR 이전 커밋은 vi 단축키 dd
를 눌러서 drop한 다음에 커밋하면 된다.
아직 이전 PR 때의 커밋이 다 따라오는 명확한 이유는 이해하지 못했다. 조금 더 삽질을 해 보면서 배운 내용들을 업데이트해 보겠다!
2. 접근 제어자와 멤버 변수 값 변경 문제
사실 접근 제어자로는 늘 public과 private만 쓰고 있었는데, A라는 클래스의 멤버 변수에 'B 클래스는 접근할 수 있지만 그 외에는 접근하지 못하게 하고 싶다' 같은 상황이 있었다. 그래서 어렴풋하게만 알고 있던 접근 제어자에 대해서 찾아봤다. 그래서 늘 쓰던 private과 public 외에도 default와 protected까지의 정확한 접근 가능 범위에 대해서 정리해 보면 다음과 같다.
- private: 이 접근 제어자가 붙은 메서드/변수는 해당 클래스 내에서만 접근이 가능하다.
- default: 따로 접근 제어자를 명시 안 해주면 default가 된다. 이 경우는 해당 패키지 내에서만 접근이 가능하다.
- protected: 동일 패키지의 클래스 + 해당 클래스를 상속받은 다른 패키지의 클래스에서 접근이 가능하다.
- public: 어떤 클래스에서도 접근할 수 있다.
private -> default -> protected -> public 순으로 접근 가능 범위가 넓어진다고 보면 된다. 이름만 봐서는 default보다 protected가 더 접근 가능 범위가 좁을 것 같은데 아니었다! 그래서 패키지를 나누어 주고 보호가 필요한 멤버 변수를 protected로 지정했다.
이 외에도 멤버 변수로 참조 변수를 사용하면 private이라고 하더라도 getter로 넘겨 주면 주소가 전달되는 거라서 외부에서 값을 바꿀 수 있다는 문제점도 있다. 객체 자체를 깊은 복사 하는 등의 방법도 있는데, 외부에서 변경하지 못하게 할 때는 Collections.unmodifiableList()
를 쓸 수 있다. 단 이 메서드는 반환값이 ArrayList
더 찾아보기
- ArrayList
'TIL' 카테고리의 다른 글
삽질기록 #6 Spring Boot Devtools 설정 (0) | 2022.03.02 |
---|---|
삽질기록 #5 git detached HEAD (0) | 2022.02.26 |
삽질기록 #4 자바 Scanner next()와 nextLine()의 차이 (2) | 2022.02.23 |
삽질기록 #3 일급 컬렉션, 자바 Enum (2) | 2022.02.22 |
삽질기록 #2 빌드 툴(Gradle, Maven), 테스트 클래스 (0) | 2022.02.21 |
댓글