23년 03월 28일, 일일 회고
2023. 3. 29. 01:10ㆍ회고/일일회고
728x90
반응형
Fact (사실: 무슨 일이 있었나?)
자바 공부
- 레벨 로그를 준비하면서 자바와 객체지향 프로그래밍, 함수형 프로그래밍 등에 대해서 공부했다.
개인 성장
- 싱글톤 스터디에서 레벨 로그 인터뷰를 체험해봤다.
커뮤니티
- 크루들과 함께 저녁을 먹었다.
- 크루들과 오후 다섯시 이후부터 밤까지 토론을 했었다. 주제는 VO와 원시값 포장, 추상클래스와 인터페이스, 람다와 함수형 인터페이스 등이었다.
- 오전에 데일리 미팅 때 본인 스스로에게 칭찬하는 내용을 나눠보았다.
Feeling (느낌: 무슨 느낌이 들었나?)
- 레벨로그를 준비하면서 그간 배웠던 내용을 많이 되짚었다. 그래도 많이 배웠구나하는 생각이 든다.
- 다른 크루들은 정말 많이 성장했다는 것을 느꼈다. 나는 스스로에게 어떤 칭찬을 줄 것인가에 대해 고민해봤는데, 아직 적절한 답변을 찾지 못했다. 꾸준하게 성장하는 것은 느끼지만 아직 모자르다고 느끼는 걸까?
- 레벨로그가 살짝 긴장되기는 하지만 마음가짐을 바꿔서 철저하게 무너져 내리는 것을 목표로 잡았다. 나는 아직 모자르고, 어떤 부분을 잘 모르는지 명확히 이해하는 과정이 필요할 것 같다.
Finding (배운 점: 어떤 인사이트를 얻었나?)
다음과 같은 내용들에 대해 정리해보았다.
- 불변객체
- final 키워드와 불변의 차이
- final: 재할당 불가
- 불변: 내부의 값이 변경되지 않음을 보장
- 불변을 만들기 위한 조건
- 원시타입: setter나 외부에서 전달된 값으로 값을 바꾸지 않음
- 참조타입: 외부로 전달되는 내부의 값들이 collection인 경우에는 unmodifiable로 변경하거나 clone을 한다.
- 불변의 장점
- 객체가 가지고 있는 값을 그대로 가지고 있다고 보장
- 값이 변경된다고 가정하면 고려해야하는 사항이 많아짐. 불변 객체는 이러한 side effect를 줄여줌
- 멀티 쓰레드 환경에서 불변성을 보장한다는 점은 race condition이 발생하는 지점을 줄여
- 객체가 가지고 있는 값을 그대로 가지고 있다고 보장
- 불변의 단점
- 객체를 매번 생성해야해서 메모리 문제 발생
- 깊은 복사가 아니기에 내부 요소들의 주소는 공유하고 있음
- 예를 들어 컬렉션 내부의 값이 변경된다면 방어적 복사를 한 객체의 값이 바뀔 수 있음
- 위험성을 없애기 위한 방법: 불변으로 만들고자한다면 내부 요소들 또한 불변이어야한다.
- 내부의 값이 변경된다면 외부로 전달된 값들 또한 변화가 발생한다.
- 생성자를 통해 인자를 객체로 전달받으면 방어적 복사, getter로 외부에 값을 전달할 때에는 unmodifiable List를 사용
- 이름을 가질 수 있다. → 가독성이 좋아진다.
- 캐싱이 가능하다. Integer valueOf(int i) → 특정 범위에 있는 값이라면 캐싱된 값을 전달
- 하위 타입으로 반환할 수 있다.(인터페이스로 추상화를 한 경우에는 구현클래스를 모르더라도 동반 클래스의 정적 팩토리 메서드를 사용하면 구현 클래스를 사할 수 있다.)
- 인자에 따라 다른 객체를 반환할 수 있다.
- 상속 x: 정적 팩토리 메서드를 사용하는 경우에는 private을 사용해 생성자를 구현하는 경우가 많은데 그렇게 되면 상속할 수 없다. → 조합을 사용하는 것이 더 좋다.
- 일반 메서드이기 때문에 API에 있는 경우에는 일일히 개발자가 정적 팩토리 메서드를 찾아야
- 차이점: 다중 상속이 가능 vs 불가능
- 디폴트 메서드를 사용하면 큰 차이가 없는 것은 아닌가?
- → 필드를 가지지 못한다는 점에서 차이가 존재함 + 추상 클래스는 구현 메서드만 있더라도 괜찮지만 인터페이스는 디폴트 메서드만 가지는 것은 안티패턴이라고 함 → 다른 사람에게 혼란을 줄 수 있음 + 다른 적절한 유틸리티 클래스를 만드는 것이 더 좋다.
- 둘 다 추상화를 이용한 것
- 예외 처리 방법
- 복구: 예외 상황을 정상으로 되돌려놓는다. → db에 저장된 값을 돌려놓는다던지, 재입력을 받는 등의 동작 / 예외가 발생하는 상황에는 일관성이 깨지는 경우에 이를 처리하는 것이 좋다고 생각한다.
- 회피: 호출한 쪽으로 예외를 던진다. → 로그만 남기고 값을 다시 던지는 등의 동작 / 예를 들어 view에서 입력받은 값을 도메인에서 처리해야한다. → 예외를 도메인에서 처리하지 않고 view에서 처리하도록 한다.
- 무시
- 전환: 적절한 예외로 바꿔서 다시 던진다. / 명확한 예외로 던질 수 있다.
- 단독으로 사용되는 경우에는 안티패턴이라고 불리운다.
- 전역 상태를 가지기 때문에 객체가 역할과 상태를 가져 협력하는 객체지향적인 프로그래밍과는 지양해야하는 모델이다.
- private 생성자를 사용하기에 상속을 할 수 없기에 다형성을 적용시킬수도 없다.
- 리팩토링을 진행할 때 전체 프로그램에서 영향을 미치게 된다.
- 동시성 문제가 발생한다. 또한 클라이언트가 구체 클래스에 의존하기에 DIP를 위반한다.
불변 객체- 외부에서 객체 내부의 값을 변경시키지 않는 것을 보장하는 객체를 의미한다.
- 객체가 가지고 있는 값을 그대로 가지고 있다는 것을 보장하기에 side effect를 줄일 수 있다.
- 방어적 복사: 참조변수를 필드로 가지고 있는 클래스는 불변 객체를 만들기 위해 참조 변수를 복사해서 외부로 전달한다.
- unmodifiable list: unmodifiableList()란 읽기 용도로만 사용할 수 있고, set, add, addAll 등 변경을 가하는 메서드를 호출하면 UnsupportedOperationException이 발생한다.
- 객체를 생성할 수 있는 메서드
- 이름을 가질 수 있다는 장점과 캐싱을 할 수 있다는 장점이 있다.
- 추상 클래스는 필드를 가질 수 있는 클래스로, 메서드를 구현할 수도 있고, 추상 메서드를 정의해서 사용할 수 있다.
- 인터페이스는 동작(기능)에 대한 약속으로 어떤 동작을 할 것이다라는 것을 명시한다.
- checked exception은 RuntimeException을 상속받지 않고 컴파일 타임에 예외를 보낸다.
- unchecked exception은 RuntimeException을 상속받고, 런타임에 예외를 보낸다.
- checked Exception은 무조건 처리를 해줘야한다.
- 자바 8 이후에 함수형 프로그래밍을 지원하기 위해서 등장한 기법들이다.
- 람다: 메서드를 하나의 식으로 표현한 것으로 메서드 이름과 반환 값이 없다.
- 스트림: 원본 데이터 소스를 수정하지 않고 처리할 수 있도록 돕는 기법이다.
- 자바에서의 접근 제어자는 private, package-private, protected, public이 있다.
- 클래스의 외부에서 값을 주입하는 기법을 의미한다.
- 유연성을 증가시키고, 테스트에 용이하게 작성할 수 있다.
- 객체를 하나만 가지고 있는 클래스
- 객체를 하나만 사용함에 따라 메모리 성능 상에 이점을 얻을 수 있다.
- 변경 가능한 상태를 가지고 있는 경우에는 사용하지 않는 것을 권장한다.
- 미션을 진행하며 뷰를 구현할 때 한번 싱글톤으로 구현해본 경험이 있다.
- final 키워드와 불변의 차이
Future action (향후 행동: 앞으로 무엇을 해야 할까?)
Feedback (피드백: 앞서 정한 향후 행동을 실천해본 뒤, 이에 대해 어떤 피드백을 받았나?)
728x90
반응형
'회고 > 일일회고' 카테고리의 다른 글
23년 04월 12일, 일일 회고 (2) | 2023.04.12 |
---|---|
23년 04월 11일, 일일 회고 (0) | 2023.04.11 |
23년 03월 27일, 일일 회고 (0) | 2023.03.28 |
23년 03월 24일, 일일 회고 (0) | 2023.03.24 |
23년 03월 23일, 일일 회고 (1) | 2023.03.23 |