Giter Site home page Giter Site logo

be-team-prearmand-book-study's People

Contributors

hunkikim avatar

Stargazers

 avatar  avatar

Watchers

 avatar

be-team-prearmand-book-study's Issues

[아이템 42] 열거 타입 생성자 안의 람다는 열거 타입의 인스턴스 멤버에 접근할 수 없다.

page 257 밑에서 8번째 줄

열거 타입 생성자에 넘겨지는 인수들의 타입도 컴파일 타임에 추론된다. 따라서 열거 타입 생성자 안의 람다는 열거 타입의 인스턴스 멤버에 접근할 수 없다. 따라서 상수별 동작을 단 몇 줄로 구현하기 어렵거나, 인스턴스 필드나 메서드를 사용해야만 하는 상황이라면 상수별 클래스 몸체를 사용해야 한다.

  1. 생성자로 넘겨지는 람다의 타입은 컴파일 타임에 추론된다.
  2. 따라서 열거 타입 생성자 안의 람다는 열거 타입 인스턴스 멤버에 접근할 수 없다. (?)

는 책의 문장 전개가 이해가 되지 않습니다! 😒.

컴파일 타임에 추론된다는 것은 enum에서 선언한 필드 타입과 제가 생성자의 인수로 작성한 람다의 타입이 일치하지 않을 때 IDE에서 경고를 보여주는 것 같은 상황이나, 억지로 컴파일을 했을 경우 컴파일러에서 아래와 같은 에러를 던지는 것을 떠올리면서 이해했는데.

java: incompatible types: bad return type in lambda expression
    java.util.UUID cannot be converted to org.programmers.devcourse.voucher.engine.voucher.entity.Voucher, 

이것이 인스턴스 멤버에 접근할 수 없는 이유가 되는지는 잘 모르겠습니다.

아니면 제가 떠올린 예시가 잘못된 걸까요?

[아이템 34] 열거 타입에 새로운 상수를 추가하거나 순서를 바꿔도 다시 컴파일 하지 않아도 된다.

210 페이지 세번째 문단

  • 다시 컴파일하지 않아도 된다는 것은 클라이언트 클래스를 말하는 건가요?
  • 클라이언트 클래스가 컴파일 될 때 정수 열거 패턴에서는 실제 값이 저장되는 반면, 열거 타입은 열거 타입 주소(?)를 저장하고 있기 때문에 열거 타입 내부를 변경해도 클라이언트 클래스는 상관이 없다는 말일까요?

[아이템 21] 디폴트 메서드

138p. 3번째 문단이 말하는 내용을 하기와 같이 이해했는데, 다들 어떻게 이해하셨는지 궁금합니다 !

한편, 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 인터페이스의 시그니처를 수정하는 용도가 아님을 명심해야한다. 이런 형태로 인터페이스를 변경하면 반드시 기존 클라이언트를 망가뜨리게 된다.

-> 기존 인터페이스의 메서드를 삭제하고 디폴트 메서드를 추가(구현)
-> 이제보니 기존 인터페이스의 메서드의 시그니처가 잘못되어있네, 이 메서드는 삭제하고 시그니처 수정해서 이걸 디폴트 메서드로 추가(구현)

[DDDD 3장] 이벤트 형태 관련

109 page "도메인 이벤트 소비자는 준수자인가?" 네 번째 줄

소비자들은 이벤트 발행자의 이벤트 형태(예를 들어, 클래스)를 사용하면 안 된다.

이 이벤트 형태라는 것이 저희 spring 기준으로 봤을 때 이벤트 발행자가 Dto를 거치지 않고 Entity를 그대로 소비자들에게 보내는 것을 말하는 걸까요?

[외워서 끝내는 네트워크 핵심이론 - 기초] 섹션 3 -2

L3 수준에서 외울 것들(2)

IPv4 Header 형식

  • 크기
    • 총 20byte
    • 32bit(4 byte) length
  • fragment offset
    • 패킷이 꽉차지 않았을 경우 Data를 어디까지 읽어야 하는지 알려주는 offset
  • ttl
    • 패킷 유통기한
  • Protocol
    • TCP, UDP…
    • 프로토콜마다 고유 번호가 있음
  • Header checksum
    • 패킷의 유실 체크
    • 암호화 아님

서브넷 마스크와 CIDR

  • 서브넷 마스크
    • 네트워크 ID와 호스트 ID를 구분한다
    • 마스크 연산
      • 비트 단위 AND 연산
    • 어떤 패킷이 ‘우리 네트워크’를 향하는 패킷인지 확인
      • 비트 단위 AND 연산을 통해 network ID를 식별한다
      • 식별된 ID와 우리 네트워크의 ID가 일치하는지 확인한다
  • 클래스
    • A(8bit), B(16bit), C(24bit)
  • CIDR
    • Classless Inter-Domain Routing
    • 위의 방식을 더 이상 사용하지 않는다
    • 예시
      • 192.168.0.10/24
        • 뒤에 /숫자 를 붙여서 어디까지가 네트워크 ID인지 표기
    • 요즘 더 자주 사용하는 표기!
  • subnetting
    • C 클래스 네트워크에서 더 네트워크를 세분화하고 싶을 때 사용
    • 크게 중요하진 않음(이런게 있다)

Broadcast IP 주소

  • 만약 destination IP를 broadcastIP로 정했을 경우’
    • L2 distribution 스위치에서 네트워크 내의 모든 host로 데이터를 전송
  • broadcastIP ≠ gateway
  • 자주 전송하면 효율 안 좋다!
  • broadcast IP를 가진 host가 따로 존재하는 것은 아님

cf) multicast

  • 여러 호스트에 한꺼번에 전달한다는 개념은 비슷함
  • 그룹 단위로 전달(전체 전달이 아님)

subnet에서 못 쓰는 IP

  • host 번호가 0인 경우
    • masking 결과물과 같기 때문
  • broadcast IP
  • 즉 subnet에서 사용할 수 있는 hostIP 주소는 hostID 경우의 수 = 3
    • 게이트웨이 하나 사용한다는 전제

Loopback Address

  • 내가 나에게 접속한다
  • 인터넷의 사용 주체는 호스트가 아니라 프로세스다!!!!!
    • 호스트 안에 여러 개의 프로세스가 있다는 것을 염두
  • 하드웨어를 거치지 않고 L3에서 바로 프로세스로 변경
  • 그냥 host에게 주어진 IP를 사용할 수 있으나, IP가 바뀔 가능성을 염두
    • 주어진 IP를 사용해도 트래픽이 바깥으로 나가지 않음
  • IPC 구현 방식 중 하나

TTL과 단편화

  • 인터넷은 라우터의 집합체라 할 수 있는 논리 네트워크이다.
  • Router vs L3 스위치
    • 구분에 대한 명확한 합의가 없음
    • 구분하는 것 자체가 의미가 없다
      • 굳이 따지면 L3에 포함되는 것이 라우터
  • 인터넷의 핵심 요소
    • Router + DNS

TTL

  • 세포의 ‘텔로미어’
    • 복제가 될 수록 길이가 줄어들기 때문에 무한 증식을 막는다
  • 패킷은 목적지까지 도달하는데 실패하는 경우가 있음
    • 라우팅을 계속하면서 실패
    • 이런 패킷(좀비 패킷)이 살아있을 경우 네트워크에 부하가 생길 수 있음
  • Hop
    • 라우터 → 라우터 이동 단위
    • Hop을 거칠 때마다 1씩 감소
  • 즉 TTL이 128일 경우
    • 라우터를 128개 거쳤는데도 목적지에 도달하지 못할 경우 패킷을 네트워크에서 죽이는 것

단편화(segmentation)

  • MTU와 밀접 연관
  • 모든 라우터의MTU가 1500이 아니다
    • 1400Byte까지만 수신할 수 있는 router도 있음
    • 이 때 해당 router는 단편화를 수행한다
      • IP 주소를 복사하고, 헤더에 단편화 정보를 추가
    • 수신 endpoint는 단편화된 패킷을 조립해야하는 책임이 생김
      • L3에서 조립한다음에 segment를 끄집어내서 L4에 전달
  • 발생하지 않는 것이 좋음
    • MTU를 하향평준화 시키는 방법이 있음
    • 하지만 MTU가 1500도 안되는 컴퓨터는 없음
      • 도대체 어떤 상황에서 발생할까?
        • IPSec VPN을 사용할 때

DHCP

  • 필수 설정

    • ISP
      • IP 주소들을 갖고 있음
    • Subnet mask
    • Gateway IP 주소
    • DNS 주소
      • 반드시 있어야 한다.
      • 도메인 주소가 어떤 IP 주소와 연결되어 있는지 설정
  • 위의 설정들을 반드시 해야 함. 보통 자동으로 해결

    = DHCP를 활용하겠다

  • DHCP

    • Dynamic Host Configuration Protocol
    • 서버 쪽에서 자동 설정들을 갖고 있음
      • 클라이언트가 해당 서버에 접속을 하면 서버가 클라이언트에게 자동으로 할당
      • 서버한테 “나 주소 뭐 써도 돼?”
      • 사용가능한 IP pool을 갖고 있다
    • Dynamic = Runtime
  • 할당 과정

    • 컴퓨터의 네트워크 전원이 켜지면 Broadcast 트래픽이 나간다
      • 우리 네트워크 안에 DHCP Server가 있는가 탐색
      • DHCP 서버가 아닌 컴퓨터들은 해당 트래픽을 무시
    • 서버에 연결되면, 기존에 사용하던 주소를 써도 되는지 질의, 아닐 경우 새 주소 할당
    • 그 외 필수 정보 전달
      • 게이트웨이
      • DNS
      • 서브넷 마스크
  • DHCP는 반드시 broadcast domain안에 있어야 한다.

ARP

  • Address Resolution Protocol
  • Address
    • IP
    • MAC
    • 보통 IP주소와 MAC 주소를 쌍으로 관리한다.
      • 생각보다 잘 안바뀜
  • IP주소로 MAC주소를 알아내려 할 때 활용된다.
    • 다른 네트워크의 통신과는 관련 없음(그떄는 L3)
  • 보통의 경우 PC를 부팅하면 Gateway의 MAC주소를 찾아내기 위해 ARP Request가 발생한다.
    • DHCP 할당 이후에 발생
      • 이 떄는 Gateway의 MAC 주소를 모
    • ARP Request 또한 Broadcast
      • Gateway 엔드포인트만 응답을 보낸다
        • MAC 주소와 함께!
  • 일반적인 네트워크 패킷의 첫 L2 MAC 주소는 무조건 Gateway
    • 대상의 MAC 주소가 아님!!!
  • arp -a
    • 캐싱된 것을 보여준다

Ping과 RTT

  • Ping은 Round Trip Time을 측정할 목적으로 사용
    • 프로토콜 아니다!
  • ICMP 프로토콜
    • Internet Control Message Protocol
  • DoS 공격용으로 악

[아이템 28] 제네릭에서 배열 반환 불가문제

166p.의 3번째 문단의 내용이 이해가 가지 않습니다. 혹시 설명해주실 분 계신가요?

예컨대 제네릭 컬렉션에서는 자신의 원소 타입을 담은 배열을 반환하는 게 보통은 불가능하다.( 또 아이템 33에서 그 방법을 설명)

이 뜻이, 컬렉션에 이미 구현되어있는 메서드 중에서 컬렉션을 배열로 변환해주는 메서드가 없다는 뜻 인가요?
아이템 33에서는 가능한 방법을 설명해준다는데.. 봐..봐도 모르겠습니다 🥲
아이템 33에 배열로 반환하는게 있던가요

[아이템 15] 질문 모음

P.98 세번째 문단
public 클래스의 protected멤버는 공개API이므로 영원히 지원돼야 한다.

상속을 통해 어디서든 접근할 수 있으니 공개 API라고 하는 걸까요?

P.99 두번째 문단.
심지어 필드가 final이면서 불변 객체를 참조하더라도 문제는 여전히 남는다.

이 말 뜻이 public으로 지정된 필드를 외부에서 쓰고 있다면 public필드를 없앤다면 외부에서 사용하고 있는 코드를 모두 수정 해야하기 때문에 public필드를 없애는 방법으론 리팩토링이 불가능하다 라는 것을 말하는 것일까요?

책에 대한 질문은 아니지만 질문을 하나씩 올리는 게 더 좋을까요? 아님 아이템 별로 올리는 게 좋을까요?
답변하고 토론하기엔 전자가 좋아보이긴 한데 다들 어떻게 생각하는 지 궁금합니다!

[아이템 33] Annotation 관련

204페이지 최상단 예시

public <T extends Annotation>
    T getAnnotation(Class<T> annotationType)

이 코드의 의미를 이해하지 못하겠습니다! AnnotatedElement에 붙어 있는 에너테이션들 중에서 T 타입의 에너테이션 인스턴스만 가져오라는 함수인가요?

[아이템 15] 질문모음

질문

  1. 캡슐화가 여러 컴포넌트를 병렬로 개발할 수 있는이유가 궁금합니다! (96P 아래)
  2. package-private로 선언하면 내부구현이 되어 언제든 수정 가능하고, public은 하위 호환을 위해 영원히 관리해줘여한다.(97P 중간) 이 부분에서 내부구현이 된다고 수정가능한 이유와 하위 호환이라는 단어가 어떤 의미인지 궁금합니다.
  3. 해당 클래스가 표현하는 추상 개념을 완성하는 데 꼭 필요한 구성요소로써의 상수라면 public static final 필드로 공개해도 좋다.(99P 중간) 여기서 추상 개념을 완성하는데 꼭 필요한 상수가 어떤게 있는지 궁금합니다.

[아이템 17] 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

page 106 첫 번째 문단

자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 클래스에 가변 객체를 참조하는 필드가 하나라도 있다면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 해야 한다.

저는 이 문장을 아무 생각없이 getter를 추가하지 말자라는 뜻으로 해석했는데 다들 어떻게 생각하시나요?
구체적인 예를 들면, Lombok의 @Getter나 IDE에서 제공하는 getter 자동 완성과 같은 기능을 사용하기 전에
getter의 대상 필드가 참조 타입일 경우 getter를 사용하지 말라! 이런 식으로요!

그런데 저는 꼭 클라이언트가 참조 필드(예를 들어 컬렉션 등)를 사용하게 하고 싶으면
참조 필드의 복제본을 주는 방법 정도는 괜찮다고 생각하는데 이걸 getter로 하는 것은 이상할까요?

[아이템 50] 혹은 불변식이 깨지더라도 그 영향이 오직 호출한 클라이언트로 국한될 때로 한정해야 한다.

page 306 마지막 문단 ~ 끝
... 래퍼 클래스의 특성상 클라이언트는 래퍼에 넘긴 객체에 여전히 직접 접근할 수 있다. 따라서 래퍼의 불변식을 쉽게 파괴할 수 있지만 그 영향을 오직 클라이언트 자신만 받게 된다.

  • 이 클라이언트 클래스만 자신이 래퍼에 넘긴 객체에 직접 접근할 수 있고, 다른 클래스는 접근할 수 없기 때문에 불변식 파괴의 영향을 클라이언트만 받게 된다고 한 걸 까요?
  • 저는 클라이언트가 만든 래퍼 객체를 다른 객체가 활용하게 될 경우, 불변식 파괴의 영향이 다른 클래스까지 전파될 수 있다고 생각이 들어서 책의 내용이 와닿지 않았습니다. ☠️
  • 제가 이 문맥에서 클라이언트의 개념을 잘못 이해하고 있는 걸까요?

[아이템 62] 코드 62-5 예시 관련(deprecated)

page 364 코드 62-5에 있는 ThreadLocal 클래스가 java.lang.ThreadLocal과 흡사하다고 한 이유를 잘 모르겠습니다!

코드 62-5와 같은 클래스를 만들어 테스트를 돌려봤습니다.

// 코드 62-5와 같은 코드... 가 아니었음 제가 책을 잘못봐서 뻘질문이 됐습니다... 
public final class CustomThreadLocal<T> {

  private T value;

  public T get() {
    return this.value;
  }

  public void set(T value) {
    this.value = value;
  }
}
 @Test
 @DisplayName("다른 스레드에서 ThreadLocal의 값을 바꿔도 기존 ThreadLocal의 값은 바뀌지 않아야 한다.")
  void threadLocal_test() throws InterruptedException, ExecutionException {
    var threadLocal = new CustomThreadLocal<Integer>();
    threadLocal.set(15);

    // 자바가 제공하는 스레드풀 생성
    ExecutorService executorService = Executors.newFixedThreadPool(1);

    // 다른 스레드가 실행할 작업을 등록한 뒤 실행시킨다.(submit)
    // submit()이 반환한 Future 객체에 get()을 호출하면 둥록한 작업이 완료되어 Integer를 반환할 때까지 메인 스레드는 block된 상태.
    // 사용 이유 : Thread.sleep 보다 확실하게 다른 스레드의 실행을 보장받기 위해?
    Integer differentThreadValue = executorService.submit(() -> {
      threadLocal.set(20);
      return threadLocal.get();
    }).get();

    Integer mainThreadValue = threadLocal.get();
    assertThat(mainThreadValue).isEqualTo(15); // 테스트 실패  expected : 15, but was 20, 즉 메인스레드의 ThreadLocal의 값도 바뀐다.
    assertThat(differentThreadValue).isEqualTo(20);
  }

결과는 원래 스레드에서 설정한 값도 20으로 바뀌기 때문에 테스트를 통과하지 못했습니다.
참고로 java.lang.ThreadLocal로 바꿔서 테스트 했을 때는 통과했습니다.

책에서 현재 스레드 정보를 키 값으로 사용하는 코드를 생략한 걸까요?
아니면 책에서 제가 놓친 것이 있어서 그런지 궁금합니다.

[아이템 17 질문 모음]

  1. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 해야한다. (106P 맨위) 어떤말인지 와닿지않는다.
  2. 110p에 중간에 가변동반 클래스는 도대체 무엇일까요?
  3. 결론적으로 private final을 기본으로 만들라고 했는데 불변에서 결국 가장 큰 장점은 어떤걸까요? 많은 장점들이 있지만 이중에서도 가장 큰 이유가 궁금합니다.

[아이템34] Enum의 가장 좋은 사용법이 무엇이고 왜 그게 좋은 사용법인가요?

저는 궁금합니다. 제곧내..

Enum을 태그처럼 쓸 수 있는데,
아이템 23 태그달린 클래스보다는 계층 구조를 활용하라고 나와있습니다.

하지만 Enum을 쓰게 되면 결국 Enum값마다 if문이나 Switch문이 쓰이게 됩니다.

211p 코드 34-3을 보면 다음 예제가 있는데
image
얘도 Planet을 상속받는 각 클래스로 만드는것이 가능할텐데
Enum으로 관리하는 것에 무슨 의의가 있는지 궁금합니다.

책에서 나온 열거타입을 쓰는 경우는 다음과 같습니다.

본질적으로 열거 타입인 타입

  • 태양계 행성
  • 한 주의 요일
  • 체스말

허용하는 값 모두를 컴파일 타임에 이미 알고 있을 때

  • 메뉴 아이템
  • 연산 코드
  • 명령줄 플래그

이들이 왜 Enum으로 쓰기 좋은 코드인지 의논하고 싶습니다.

추가로 + 이넘과 전략패턴을 같이 쓰는 방법? 이것도 잘 이해가 안갑니다ㅠㅠ

[아이템 70] 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용하라.

page 390. 두 번째 문단

혹시 검사 예외를 활용해서 프로그램을 복구시키는 코드를 작성해 보신 경험이 있으신지 궁금합니다! 아니면 저희가 과정 초반부에 JdbcDriver를 활용할 때 작성한 예외 처리 코드가 그런 예시에 속하는 걸까요? 복구라는 개념이 잘 와닿지 않네요!😥

public int updateCustomerName(UUID customerId, String name) {
    try (
      var connection = DriverManager.getConnection("jdbc:mysql://localhost/order_mgmt", "root", "root1234!");
      var statement = connection.prepareStatement(UPDATE_BY_ID_SQL);
    ) {
      statement.setString(1, name);
      statement.setBytes(2, customerId.toString().getBytes());
      return statement.executeUpdate();
    } catch (SQLException throwable) {
      logger.error("Got error while closing connection", throwable); // 로깅만 하고 프로그램을 종료시키지는 않기 때문에 복구 코드?
    }
    return 0;
  }

[아이템 17] 질문 모음

  1. p.111

이 방식은 바깥에서 볼 수 없는 package-private 구현 클래스를 원하는 만큼 만들어 활용할 수 있으니 훨씬 유연하다.

아이템 1에서 설명한 EnumSet을 말하는 것과 같은 걸까요?


2. 불변 객체를 참조하는 객체라면 Thread-safe 할까요?

[아이템 15] 테스트만을 위해 클래스, 인터페이스, 멤버를 공개 API로 만들어서는 안 된다.

🖐️ 위치 : 99 페이지 첫 번째 문단

책과 살짝(?)벗어난 내용이지만 호기심에 여쭤봅니다!

다들 테스트 코드 작성하실 때 private 메서드와 관련된 테스트도 작성하시는지 궁금합니다!
만약 하신다면 어떤 방법으로 하시는 지도요!
저는 '하면 좋을 것 같은데 방법이 까다로워서, 테스트 코드가 역으로 개방-폐쇄 원칙을 저해할 것 같다.'
라고 생각합니다.

인터넷에서 살짝 조사를 해본 결과 이런 의견들이 있네요

테스트 해야 한다.

  1. 특정 테스트가 실패 했을 때 어디에서 문제가 발생했는지 구체적으로 잡아 준다.
  2. 테스트가 주는 효용(견고한 코드를 작성하고 있다는 확신, test coverage 100%!)이 커진다.

테스트 하지 말아야 한다.

  1. 내부 구현을 드러내기 때문에 캡슐화를 깬다.
  2. 만약에 테스트 대상의 매우 중요한 기능이 private 메서드로 되어 있으면, 차라리 다른 클래스로 분리해서 public 인터페이스로 바꾼 뒤에 테스트 해라.
    (private 메서드 테스트하고 싶다 == 리팩터링 해야 한다!)
  3. 유닛 테스트 자체와 테스트 대상과의 결합도가 높아진다.
  4. 충분한 edge case를 설정하고 public 인터페이스를 테스트 하면 private method도 꼼꼼하게 확인할 수 있다.

관련 링크
https://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones

[아이템 55] 옵셔널 반환은 신중히 하라 329p

329p 첫 문단에

이따금 기본값을 설정하는 비용이 아주 커서 부담이 될 때가 있다.
그럴때는 Supplier를 인수로 받는 orElseGet을 사용하면,
값이 처음 필요할때 Supplier를 사용해 생성하므로 초기 설정 비용을 낮출 수 있다.
(사실 이 메서드는 compute로 시작하는 Map 메서드들과 밀접하니 orElseCompute로 이름짓는게 더 나았을지도 모르겠다)

이 부분이 어렵게 느껴집니다 T T
혹시 이해하신 분 계신가요?-?
HELP!! 도와줘요 pre아만드!!

[아이템53] 가변인수는 신중히 사용하라 - 실험공유

궁금증의 시작

그런데 성능에 민감한 상황이라면 가변인수가 걸림돌이 될 수 있다.
가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화 한다. - 321p

과연 정말 유의미한 차이가 있을까?

가변인수를 인자로 받는 메서드 vs 일반인수를 인자로 받는 메서드

실험 대상 메서드는 다음과 같습니다

// 가변인수를 인자로 받는 메서드
  void variable(String... item) { 
         return ;
  }
// 일반인수를 인자로 받는 메서드
  void normal(String item1, String item2, String item3, String item4) { 
         return ;
  }

실험환경

Win10 64비트
image

테스트

String 인자 4개를 대상으로, (1억)100,000,000번 실행해보았을때의 성능 테스트를 진행해 보았습니다.

public class EffectiveJavaTime {

    String a = "a";
    String b = "b";
    String c = "c";
    String d = "d";

    @Test
    void timeTest1(){
        long start = System.nanoTime();
        for (int i = 0; i < 100_000_000; i++) variable(a, b, c, d);
        long end = System.nanoTime();
        System.out.println("가변인수 : " + (end - start));
    }

    @Test
    void timeTest2(){
        long start = System.nanoTime();
        for (int i = 0; i < 100_000_000; i++) normal(a, b, c, d);
        long end = System.nanoTime();
        System.out.println("일반인수 : " + (end - start));
    }

    void variable(String... item) {
        return ;
    }
    void normal(String item1, String item2, String item3, String item4) {
        return ;
    }
}

결과

결과가 나왔습니다. 확실히 가변인수가 시간이 더 오래걸리네용
image

이걸 10번정도 반복한 평균은 다음과 같습니다.
가변인수 : 14,983,366 nanotime (14.98 ms)
일반인수 : 3,438,500 nanotime (3.43 ms)
실험 결과, 가변인수가 일반인수보다 4.35배 더 오래 걸린다고 나오네요!

궁금증 ❓

대충 머리속에 있는 실험을 해보았는데,
뭔가 이 실험에서 이상한 부분이 있을까요 🤔 피드백 주시면 감사히 받겠습니다!!
이런 실험은 어떻게 하는게 좋을까요

[아이템 24] private 정적 멤버 클래스 (예시 Map)

148p. 두번째 문단의 예시가 이해가 가지 않습니다. 혹 이해하신 분이 계시다면 설명을 부탁드릴 수 있을까요?
추가로, 책에서 말하는 엔트리를 Map 구현체의 인스턴스로 이해했는데 잘못 이해하고 있는걸까요?

따라서 엔트리를 비정적 멤버클래스로 표현하는 것은 낭비이고, private 정적 멤버 클래스가 가장 알맞다. 엔트리를 선언할 때 실수로 static을 빠뜨려도 맵은 여전히 동작하겠지만, 모든 엔트리가 바깥 맵으로의 참조를 갖게되어 공간과 시간을 낭비할 것이다.

해당 문장 앞부분의 내용은 하기와 같이 이해했습니다.

키와 값을 매핑시키는 Map인스턴스를 생각해보자. 많은 Map 구현체는 각각의 키-값 쌍을 표현하는 엔트리 객체들을 가지고 있다. 모든 엔트리가 맵과 연관되어 있지만 엔트리의 메서드들(getKey, getValue, setValue)은 맵을 직접 사용하지는 않는다.

  • 이해한내용 : Map 구현체 (HashMap, TreeMap, LinkedHashMap)는 여러 객체들을 가지고있고, 실제 HashMap클래스 코드를 보면 getKey, getValue, setValue는 내부에서만 쓰이고 인스턴스 메서드로 직접 호출이 불가하다.

자바하면 객체지향 프로그래밍인데, 함수형 프로그래밍의 지평을 열은게 왜 좋은걸까?

라는 의문을 가졌었고
이에 대한 의문점을 찾기위해서 조사해보았습니다

그리고 다음 블로그의 첫 문장에서 뼈를 맞아버렸습니다. ⚡

자바 8에서 왜 함수형 프로그래밍이 도입되었을까?

그리고 돌이켜보면 너무 객체지향만을 선호하며 객체지향만이 정답이야!를 외치며 살았던 것 같네요.
함수형 프로그래밍 뭔지모르겠당~~ 어려운데 나랑은 상관없는 일이겠지~ 하고 종종 가볍게 넘기고는 했었는데
함수형 프로그래밍에 대해서도 다시 한 번 생각해봐야 겠네요 하하호호

[DDDD 1장] 영속성 오퍼레이션 위치 관련

page 29 중간

또한 종종 영속성 오퍼레이션을 비즈니스 로직 중간에 수행하기도 한다.

  1. 영속성 오퍼레이션은 비즈니스 로직을 다 수행하고 마지막에 수행되어야 하는 것이 바람직하기 때문에 저자가 문제 상황이라고 여긴 것일까요?

  2. 그리고 여기서 말하는 영속성 오퍼레이션은, repository.findById()와 같은 조회(Query)가 아니고 repository.save()와 같은 명령(Command)을 말하는 걸까요?

  3. 저는 예전 과제에서 repository를 통해 불러온 엔티티를 DTO로 바꾸는 연산을 서비스 메서드 마지막에 둔 적이 있는데, 이것도 저자의 기준에서는 문제가 되는 것일까요? 아니면 DTO 전환은 핵심 비즈니스 로직이 아니기 때문에 문제가 되지 않을려나요?

[아이템34] 열거 타입 상수 맵

P.216
하지만 열거 타입 상수는 생성자에서 자신의 인스턴스를 맵에 추가할 수 없다. 이렇게 하려면 컴파일 오류가 나는데, 만약 이 방식이 허용되었다면 런타임에 NullPointerException이 발생했을 것이다. 열거 타입의 정적 필드 중 열거 타입의 생성자에서 접근할 수 있는 것은 상수 변수 뿐이다 (아이템 24)

생성자에서 열거 타입 상수를 추가할 수 없는 이유가 그저 생성자가 실행되는 시점에는 정적 필드가 아직 초기화 되기 전이기 때문인가요?
여기서 말하는 정적 필드가 Map을 뜻하는 게 맞을까요??

[아이템 18] 질문 모음

p.119 두번째 문단

래퍼클래스는 콜백 프레임워크에서 자기 자신의 참조를 ~ 이를 SELF 문제라고 한다.

예제 코드인데 정확히 이해가 되지 않는 느낌입니다. 이해 하신 분 설명 부탁드립니다 ㅠㅠ


p.120 두번째 문단

두 사례 모두 컴포지션을 사용했다면 더 좋았을 것이다.

Properties를 키와 값으로 문자열만 허용하도록 할려면 어떻게 컴포지션을 이용해야 할까요??

[아이템 79] ConcurrentModificationException 관련

이건 처음에 질문으로 작성하려다 답을 알게 되어 자문자답(?)으로 그냥 작성해보겠습니다. 잘못된 내용 있으면 지적해주세요!

page 422 마지막 문단

이 프로그램은 23까지 출력한 다음 ConcurrentModificationException을 던진다. 관찰자의 added 메서드 호출이 일어난 시점이 notifyElementAdded가 관찰자들의 리스트를 순회하는 도중이기 때문이다.

저는 예시 코드에서 다른 스레드가 동작하는 코드가 존재하지 않기 때문에 위의 예외가 왜 발생하는지 이해가 되지 않았습니다. 단일 스레드에서도 락을 건 대상에 진입할 수 없는 건가? 싶어서 질문을 올리려 했는데 공식 문서를 보니 이런 설명이 있었습니다.

Note that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception.

즉 이 예외는 단일 스레드 환경에서도 발생할 수 있는 예외라서 책에서 이런 식으로 설명하고 넘어간 것 같습니다! 아마 아시는 분도 있으시겠지만 저처럼 이해를 못해서 시간 낭비하시는 분이 없었으면 좋겠다 하는 생각에 끄적이고 갑니다!

[DDDD 1장] 서비스 결합도 관련

page 29 마지막 문단

오퍼레이션을 수행하는 서비스가 또 다른 서비스를 직접 호출하는 강하게 결합된 서비스가 존재한다. 이 결합은 시스템 유지보수가 어려워질 뿐만 아니라 종종 비즈니스 프로세스에 문제를 일으키고 데이터가 불일치되는 결과로 이어진다.

  1. 저는 이걸 보고 "주문 관리 시스템에서 OrderService가 사용자의 정보를 확인하려고 UserService를 호출한다." 는
    예시가 생각났는데, 제가 생각한 예시가 맞을까요?

  1. 서비스 결합도를 낮추려면 어떤 해결책이 있을까요? 혹시 해결해보신 분 있으면 꿀팁 부탁드립니다! 제가 생각해본 해결책은 이렇습니다.
  • 컨트롤러에서 필요한 서비스들을 호출한다.
  • 특정 도메인에서 다른 도메인의 데이터가 필요할 경우, 컨트롤러에서 그 도메인의 서비스를 호출한 뒤, 반환 값을 DTO로 바꾼 다음 필요한 서비스의 매개변수로 전달한다.
    적절한 해결책이 될까요?

  1. 저자가 말한 문제 상황이 특정 서비스가 다른 도메인의 repository를 호출하는 것도 포함하는 걸까요? 아래와 같은 예시가 생각났습니다.
  • OrderService에서 컨트롤러부터 사용자 Id를 받아 userRepository.findById() 를 호출한다.

[아이템 26] 와일드카드 타입

page 159 핵심 정리

빠르게 훑어보자면, Set<Object>는 어떤 타입의 객체도 저장할 수 있는 매개변수화 타입이고, 
Set<?>는 모종의 타입 객체만 저장할 수 있는 와일드카드 타입이다.
  • 모종의 타입 객체라는 용어가 감이 잡히지 않습니다.
    제가 알기로는 Collection<?>에는 null을 제외한 어떤 객체도 저장할 수 없는 것으로 알고 있는데 (Object도 안되더라구요) 저만 난해하게 느낀 걸까요? 아니면 모종의 타입 객체가 null을 의미하는 걸까요?

[아이템 46] 병렬화와 반복의 관계

  1. 278p. 중간 부분에 forEach연산은 대놓고 반복적이라서 병렬화 할 수 없다. 라는 문장이 나오는데, 병렬화와 반복의 관계가 잘 이해가 가지 않습니다.
    예를들면. a~ z 까지 있다면, 반복문은 이걸 (순차적)으로 반복해야하는데 병렬화는 (예를들면) a b c 를 병렬로 처리하기 때문에 위의 반복적이라서 병렬화 할 수 없다. 라고 하는걸까요?

2 . downstream을 혹시 어떻게 이해하고 계신가요? 이번 아이템에 다운 스트림이라고 나오는데 이 개념을 잘 모르겠네요🥲

[아이템 22] 바이너리 호환성

p.140
그래서 다음 릴리스에서 이 상수들을 더는 쓰지 않게 되더라도 바이너리 호환성을 위해 여전히 상수 인터페이스를 구현하고 있어야 한다.

바이너리 호환성 검색 결과

뭔가를 바꾼 이후에도 에러 없이 기존 바이너리가 실행될 수 있는 상황을 바이너리 호환성이라고 한다. (바이너리 실행에는 인증, 준비, 해석 등의 과정이 포함된다.)
예를들어 인터페이스에 메소드를 추가했을 때 추가된 메소드를 호출하지 않는 한 문제가 일어나지 않는데 이를 바이너리 호환성이라고 한다.

위에는 인터넷에 나와있는 바이너리 호환성 뜻인데 나중에 쓰일 수 도 있으니깐 저런 호환성을 생각하는 것일까요? 굳이 더 이상 쓰지 않는데 저 호환성을 지킬 필요가 없어 보이는 데 의견이 궁금합니다!!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.