일단 씻고 나가자

23.07.27 본문

Study/닥치는 대로 주워 담기

23.07.27

일단 씻고 나가자 2023. 7. 28. 04:20

2023. 07. 27 목요일

 

- [Effective Java] 가변인자? 사용법, 주의사항? 힙 오염이란?

: 가변인자란 메서드의 매개변수 개수를 사용자의 임의대로 받을 수 있게 작성한 메서드다.

void function(String...str) 와 같이 ... 으로 사용하며,

받은 매개변수는 배열 형태로 전달된다. (빈 매개변수를 전달해도 가능)

function(String s, String...str) 와 같이 매개변수의 순서를 컴파일러는 인지하지 못하기 때문에 가변인자를 선언할 때는 꼭 매개변수의 마지막에 선언하여야 한다.

또한 가변인자를 활용한 메서드는 오버로딩을 하지 않는 것이 좋다.

https://sleepyeyes.tistory.com/29

 

힙 오염(heap pollution)이란 컴파일러가 제너릭을 다룰 때 생기는 오류이다.

Java 5에 제너릭이 처음 도입되던 시점에 같은 명칭의 클래스(ex. ArrayList)는 제너릭을 반영한 동일 클래스와 호환이 되도록 해야 했다. 하지만 이미 해당 클래스로 작성된 라이브러리가 수많이 존재했고, 따라서 컴파일이 끝난 시점에서 제네릭 클래스의 타입 파라미터를 제거하도록 만들었는데 이때 생기는 것이 힙 오염이다.

 

예를 들면
ArrayList<Integer> list = (ArrayList<Integer>)(Object)new ArrayList<String>();

해당 코드를 작성했을 때 별도의 warning 메시지만 띄우는데, 이유는 타입 캐스팅 연산자는 컴파일러가 아닌 가상 머신이 담당하며, 따라서 런타임 익셉션이 발생한다.

제너릭 타입 파라미터는 컴파일이 끝나면 컴파일러가 제거하고 그 자리에 Object를 넣는데, 이때 작성 당시에는 문제가 없지만 int I = (Integer) list.get(0); 같이 컬렉션에서 데이터를 꺼내올 때 타입 캐스팅을 하므로 꺼내올 때에 classcastexception 예외가 발생한다.

https://velog.io/@adduci/Java-%ED%9E%99-%ED%8E%84%EB%A3%A8%EC%85%98-Heap-pollution

 

 

- 4 way handshake? 전송 과정?

TCP가 연결을 해제하는 과정이다.

4단계로 이루어진다.

1. 클라이언트가 FIN/ACK 비트를 1로 바꾸고 seq num에 임의의 값을 넣어 보냄

2. 서버가 ACK 비트를 1로 바꾸고 ack num을 클라이언트의 seq num+1으로 넣어 보냄

3. 서버가 FIN/ACK 비트를 1로 바꾸고 ack num 동일, seq num에 임의의 값을 넣어 보냄

4. 클라이언트가 ACK 비트를 1로 바꾸고 ack num을 서버의 seq num+1으로, seq num을 서버의 ack num으로 넣어 보냄

 

전송 과정은 클라이언트가 첫 데이터의 번호(sequence number)와 길이를 보내면, 서버는 잘 받았다는 의미로 그 다음 번호(ack number)를 보내는 과정으로 이루어진다.

예를 들어 첫 데이터 번호가 1, 길이가 20이라면 서버는 21을 보낸다. (실제로 보내진 데이터는 1~20번이 된다)

 

 

- 네트워크 트래픽 관련 알고리즘 2개와 설명?

: 흐름 제어, 혼잡 제어. 둘 다 코드로 이루어져 있다.

 

1. 흐름 제어(Flow Control) - sliding window

// 두 컴퓨터가 통신할 때 컴퓨터의 사양이 달라 많은 데이터를 보내도 처리하는 데에 시간이 걸려 데이터 유실이 생김을 처리.

기존 처리 방식은 송신 후 수신 답변이 오면 다시 송신하는 방식으로 이루어져 있는데,

너무 비효율적이므로 통신하려는 두 컴퓨터의 사양(windows size)에서 송/수신이 가능한 크기의 최솟값만큼 한꺼번에 보내는 방식이다.

(이 값의 최솟값 계산은 최초 연결 시의 3 way handshake에서 이루어진다 - Win)

그 값이 예를 들어 3으로 전달됐다면, 1-2-3 데이터를 보내고 기다렸다가 1ack가 오면 2-3-4 데이터를 보낸다. 이때 2-3은 이미 보냈으므로 4만 보내고 다시 기다린다. 이렇게 크기만큼 두고 기다리는 방식이다. , ack를 받지 않는 데이터만 윈도우를 이동하며 보내는 방식이다.

 

다만 최근의 컴퓨터들은 사양이 좋으므로, 최근의 관심사는 window size가 아닌 ack의 시간이다. 송신 후 답을 받는 시간을 RTT(Round Trip Time)이라 하며, 이 시간을 기반으로 최솟값이 아닌 적절한 크기로 데이터를 전송한다.

 

2. 혼잡 제어(Congestion Control)

// 데이터 망을 이용 시 중간 단에서 어느 망을 이용해야 잘 전달이 될까 하는 알고리즘.

 

'Study > 닥치는 대로 주워 담기' 카테고리의 다른 글

23.08.02  (0) 2023.08.03
23.08.01  (0) 2023.08.02
23.07.26  (0) 2023.07.27
23.07.20  (0) 2023.07.21
23.07.19  (0) 2023.07.20