23년 03월 28일, 일일 회고

2023. 3. 29. 01:10회고/일일회고

728x90
반응형

Fact (사실: 무슨 일이 있었나?)


자바 공부

- 레벨 로그를 준비하면서 자바와 객체지향 프로그래밍, 함수형 프로그래밍 등에 대해서 공부했다.

 

개인 성장

- 싱글톤 스터디에서 레벨 로그 인터뷰를 체험해봤다.

 

 

커뮤니티

- 크루들과 함께 저녁을 먹었다.

- 크루들과 오후 다섯시 이후부터 밤까지 토론을 했었다. 주제는 VO와 원시값 포장, 추상클래스와 인터페이스, 람다와 함수형 인터페이스 등이었다.

- 오전에 데일리 미팅 때 본인 스스로에게 칭찬하는 내용을 나눠보았다.

 

Feeling (느낌: 무슨 느낌이 들었나?)


- 레벨로그를 준비하면서 그간 배웠던 내용을 많이 되짚었다. 그래도 많이 배웠구나하는 생각이 든다.

- 다른 크루들은 정말 많이 성장했다는 것을 느꼈다. 나는 스스로에게 어떤 칭찬을 줄 것인가에 대해 고민해봤는데, 아직 적절한 답변을 찾지 못했다. 꾸준하게 성장하는 것은 느끼지만 아직 모자르다고 느끼는 걸까?

 

- 레벨로그가 살짝 긴장되기는 하지만 마음가짐을 바꿔서 철저하게 무너져 내리는 것을 목표로 잡았다. 나는 아직 모자르고, 어떤 부분을 잘 모르는지 명확히 이해하는 과정이 필요할 것 같다.

 

Finding (배운 점: 어떤 인사이트를 얻었나?)


다음과 같은 내용들에 대해 정리해보았다.

 

  • 불변객체
    • final 키워드와 불변의 차이
      • final: 재할당 불가
      • 불변: 내부의 값이 변경되지 않음을 보장
    • 불변을 만들기 위한 조건
      • 원시타입: setter나 외부에서 전달된 값으로 값을 바꾸지 않음
      • 참조타입: 외부로 전달되는 내부의 값들이 collection인 경우에는 unmodifiable로 변경하거나 clone을 한다.
    • 불변의 장점
      • 객체가 가지고 있는 값을 그대로 가지고 있다고 보장
        • 값이 변경된다고 가정하면 고려해야하는 사항이 많아짐. 불변 객체는 이러한 side effect를 줄여줌
        • 멀티 쓰레드 환경에서 불변성을 보장한다는 점은 race condition이 발생하는 지점을 줄여
    • 불변의 단점
      • 객체를 매번 생성해야해서 메모리 문제 발생
      방어적 복사
      • 깊은 복사가 아니기에 내부 요소들의 주소는 공유하고 있음
      • 예를 들어 컬렉션 내부의 값이 변경된다면 방어적 복사를 한 객체의 값이 바뀔 수 있음
      • 위험성을 없애기 위한 방법: 불변으로 만들고자한다면 내부 요소들 또한 불변이어야한다.
      unmodifiable List
      • 내부의 값이 변경된다면 외부로 전달된 값들 또한 변화가 발생한다.
      방어적 복사와 unmodifiable List
      • 생성자를 통해 인자를 객체로 전달받으면 방어적 복사, getter로 외부에 값을 전달할 때에는 unmodifiable List를 사용
      정적 팩토리 메서드
      • 이름을 가질 수 있다. → 가독성이 좋아진다.
      • 캐싱이 가능하다. Integer valueOf(int i) → 특정 범위에 있는 값이라면 캐싱된 값을 전달
      • 하위 타입으로 반환할 수 있다.(인터페이스로 추상화를 한 경우에는 구현클래스를 모르더라도 동반 클래스의 정적 팩토리 메서드를 사용하면 구현 클래스를 사할 수 있다.)
      • 인자에 따라 다른 객체를 반환할 수 있다.
      단점
      • 상속 x: 정적 팩토리 메서드를 사용하는 경우에는 private을 사용해 생성자를 구현하는 경우가 많은데 그렇게 되면 상속할 수 없다. → 조합을 사용하는 것이 더 좋다.
      • 일반 메서드이기 때문에 API에 있는 경우에는 일일히 개발자가 정적 팩토리 메서드를 찾아야
      추상 클래스와 인터페이스
      • 차이점: 다중 상속이 가능 vs 불가능
      • 디폴트 메서드를 사용하면 큰 차이가 없는 것은 아닌가?
        • → 필드를 가지지 못한다는 점에서 차이가 존재함 + 추상 클래스는 구현 메서드만 있더라도 괜찮지만 인터페이스는 디폴트 메서드만 가지는 것은 안티패턴이라고 함 → 다른 사람에게 혼란을 줄 수 있음 + 다른 적절한 유틸리티 클래스를 만드는 것이 더 좋다.
      • 둘 다 추상화를 이용한 것
      checked exception vs unchecked exception
      • 예외 처리 방법
        • 복구: 예외 상황을 정상으로 되돌려놓는다. → db에 저장된 값을 돌려놓는다던지, 재입력을 받는 등의 동작 / 예외가 발생하는 상황에는 일관성이 깨지는 경우에 이를 처리하는 것이 좋다고 생각한다.
        • 회피: 호출한 쪽으로 예외를 던진다. → 로그만 남기고 값을 다시 던지는 등의 동작 / 예를 들어 view에서 입력받은 값을 도메인에서 처리해야한다. → 예외를 도메인에서 처리하지 않고 view에서 처리하도록 한다.
        • 무시
        • 전환: 적절한 예외로 바꿔서 다시 던진다. / 명확한 예외로 던질 수 있다.
      싱글톤 패턴
      • 단독으로 사용되는 경우에는 안티패턴이라고 불리운다.
        • 전역 상태를 가지기 때문에 객체가 역할과 상태를 가져 협력하는 객체지향적인 프로그래밍과는 지양해야하는 모델이다.
        • private 생성자를 사용하기에 상속을 할 수 없기에 다형성을 적용시킬수도 없다.
        • 리팩토링을 진행할 때 전체 프로그램에서 영향을 미치게 된다.
      • 동시성 문제가 발생한다. 또한 클라이언트가 구체 클래스에 의존하기에 DIP를 위반한다.

      불변 객체
      • 외부에서 객체 내부의 값을 변경시키지 않는 것을 보장하는 객체를 의미한다.
      • 객체가 가지고 있는 값을 그대로 가지고 있다는 것을 보장하기에 side effect를 줄일 수 있다.
      방어적 복사 vs unmodifiable Collection
      • 방어적 복사: 참조변수를 필드로 가지고 있는 클래스는 불변 객체를 만들기 위해 참조 변수를 복사해서 외부로 전달한다.
      • unmodifiable list: unmodifiableList()란 읽기 용도로만 사용할 수 있고, set, add, addAll 등 변경을 가하는 메서드를 호출하면 UnsupportedOperationException이 발생한다.
      정적 팩토리 메서드
      • 객체를 생성할 수 있는 메서드
      • 이름을 가질 수 있다는 장점과 캐싱을 할 수 있다는 장점이 있다.
      추상 클래스와 인터페이스
      • 추상 클래스는 필드를 가질 수 있는 클래스로, 메서드를 구현할 수도 있고, 추상 메서드를 정의해서 사용할 수 있다.
      • 인터페이스는 동작(기능)에 대한 약속으로 어떤 동작을 할 것이다라는 것을 명시한다.
      checked exception과 unchecked exception
      • checked exception은 RuntimeException을 상속받지 않고 컴파일 타임에 예외를 보낸다.
      • unchecked exception은 RuntimeException을 상속받고, 런타임에 예외를 보낸다.
      • checked Exception은 무조건 처리를 해줘야한다.
      람다와 스트림
      • 자바 8 이후에 함수형 프로그래밍을 지원하기 위해서 등장한 기법들이다.
      • 람다: 메서드를 하나의 식으로 표현한 것으로 메서드 이름과 반환 값이 없다.
      • 스트림: 원본 데이터 소스를 수정하지 않고 처리할 수 있도록 돕는 기법이다.
      접근 제어자
      • 자바에서의 접근 제어자는 private, package-private, protected, public이 있다.
      의존 객체 주입
      • 클래스의 외부에서 값을 주입하는 기법을 의미한다.
      • 유연성을 증가시키고, 테스트에 용이하게 작성할 수 있다.
      싱글톤 패턴
      • 객체를 하나만 가지고 있는 클래스
      • 객체를 하나만 사용함에 따라 메모리 성능 상에 이점을 얻을 수 있다.
      • 변경 가능한 상태를 가지고 있는 경우에는 사용하지 않는 것을 권장한다.
      • 미션을 진행하며 뷰를 구현할 때 한번 싱글톤으로 구현해본 경험이 있다.

 

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