
- IDE와 소스코드 편집기는 어떤 차이가 있는가?
IDE 개발자가 쉽게 개발을 하도록 만든 집합체 이고 그 하위로 소스코드 편집기 가 내포되어있습니다.
- 동일성과 동등성의 차이를 설명해 보세요.
동일성과 동등성은 두 인스턴스를 비교할 때 사용되는 개념입니다.
동일성은 두 인스턴스의 존재가 같은 존재인지 판단하는 것으로 자바에서는 ==연산자로 두 인스턴스의 레퍼런스 변수를 비교합니다.
비교의 결과가 true라면 두 인스턴스는 동일한 인스턴스다.
동등성은 두 인스턴스가 같은 값으로 평가되는지 확인하는 것으로, String 클래스는 자바는 equals() 메서드를 통해 확인하고, 직접 선언한 클래스는 equals() 메서드를 오버라이딩해 어떤 조건에서 동등하다고 판단할지를 정해줘야합니다.
public class Main{
public class void main(String[] argc){
String str1 = new String("is same?")
String str2 = new String("is same?")
System.out.println(str1 == str2)
}
}
-실행결과-
false
자바에서 동일하다고 말하는 경우는 같은 인스턴스를 참조하고 있을 때이다.
인스턴스의 값을 비교할려면 equals()를 사용.
직접선언한 클래스는 String, Integer클래스말고 우리가 class 키워드를 사용해서 새로 만든 클래스를 뜻한다.
- 객체지향에 대해 설명해 보세요.
객체지향은 현재 가장 널리 사용되고 있는 프로그래밍 방법론입니다.
객체지향의 핵심은 추상화와 다형성이라고 생각합니다.
추상화와 다형성은 곧 인터페이스로 연결되는데요.
인터페이스없이 애플리케이션을 개발하면 클라이언트 코드가 구체적인 클래스를 의존하게 되고, 하나의 클래스가 변경되면 다른 클래스도 변경해 줘야하는 문제가 생깁니다.
이런 문제를 해결하려면 클라이언트 코드가 구체적인 클래스가 아니라 인터페이스에 의존해야합니다. 결국 클라이언트 코드와 구체적인 클래스 모두 인터페이스에 의존하게 되는 것입니다.
이처럼 코드를 변경했을 때 얻을 수 있는 몇가지 이점이 있습니다.
첫째, 클라이언트 코드는 해당 인터페이스를 구현하고 있는 구체적인 클래스의 세부 구현을 몰라도 됩니다.
인터페이스에 의존하고 있기 때문에 구체적인 클래스가 바뀌더라도 인터페이스가 바뀌지 않는 한 클라이언트 코드로 변경 내용이 전파되지 않는다는 것입니다.
둘째,클라이언트 코드는 해당 인터페이스를 구현하고 있는 구체적인 클래스가 구현되지 않았더라도 자신의 코드를 개발할 수 있습니다.
테스트 코드를 만들어 해당 인터페이스가 해야 하는 역할에 대해 정의해 주기만 하면 됩니다.
추상적인 존재는 보통 다형성도 가집니다. 인터페이스의 레퍼런스 변수는 해당 인터페이스를 구현하는 여러 클래스들의 인스턴스를 담을 수 있습니다.
그리고 레퍼런스 변수안에 어떤 인스턴스가 들어 있는지 신경 쓰지 않고 메서드를 호출하면 안에 들어 있는 인스턴스의 종류에 따라 완전히 다른 동작이 실행될 수 있습니다.
만약 이런 성질 없이 인터페이스가 필수로 구현해야할 메서드의 집합의 역할만 했다면 인터페이스를 선언해도 추상화했을 때의 이점을 누릴 수 없게 될 것입니다.
- ArrayList의 크기(size)가 어떻게 변하는지 설명해 보세요.
자바 버전마다 그 구현 방식이 다를 수 있지만 기본적인 틀은 최초 ArrayList 내부에 특정 크기의 배열이 생성된다음 용량이 가득 찰 때마다 일정 비율로 늘려진다고 알고 있습니다.
자바 8버전 이상 기준으로 했을때 크기를 지정하지 않으면 최초 10 크기의 배열이 생성되고, 용량이 가득 찰 떄마다 1.5배씩 늘어나는 것으로 알고있습니다.
- 오버라이딩과 오버로딩의 차이점을 말해 보세요.
오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스에서 새롭게 정의하는 것을 의미하고, 오버로딩은 동일한 메서드의 이름으로 서로 다른 파라미터와 리턴 타입의 메서드를 여러개 정의하는 것을 의미합니다.
오버로딩의 loading은 무언가를 싣는다는 의미가 있으니 중복적재, 즉 메서드를 여러개 싣는다는 연상
남은 오버라이딩은 자연스럽게 메서드를 재정의한다고 기억하자
5-1) 오버라이딩과 오버로딩의 조건을 각각 설명해보세요.
6. 프로토콜에 대해 설명하시오.
프로토콜이란 통신 규약으로, 일종의 약속입니다. 사람도 같은 언어를 사용해야 의사소통이 가능한 것처럼, 네트워크 역시 보내는 쪽과 받는 쪽이 서로 동일한 형식과 규칙으로 데이터 주고 받아야 통신이 가능하다.
우리가 많이 사용하는 프로토콜에는 TCP와 HTTP등이 있습니다.
7. 웹 브라우저에서 www.google.com에 접속하면 어떤 일이 생기는지 설명해 보세요.
사용자의 웹 브라우저에서 www.google.com을 입력하고 enter를 치면 해당 요청은 DNS에 goole이라는 도메인 어떤 IP주소를 가지고 있는지를 묻습니다.
DNS에서 google의 IP주소를 알려주면 그때부터 트래픽이 구글 웹 서버를 향행 출발합니다.
이것은 네트워크상의 라우터, 스위치 등 여러 네트워크 장비를 거쳐 구글의 웹 서버에 도달합니다.
구글 웹 서버에서 해당 요청에 맞는 HTML 파일을 응답으로 돌려주면, 그 HTML 파일은 왔던 길을 되돌아가 클라이언트에게 도착해 사용자 웹 브라우저에 렌더링 됩니다.
7-1 브라우저에서 URL을 처리하는 과정을 설명해보세요 만약 URL이 www.google.com이 아니라 www.google.com/search?q=rul과 같이 되어있다면 어떤 과정이 필요한가요 ?
"브라우저의 URL 처리 과정을 기본 URL과 쿼리스트링이 있는 URL로 나누어 설명드리겠습니다.
먼저, 기본적인 URL인 www.google.com의 처리 과정은:
www.google.com/search?q=url과 같은 URL은 추가적인 처리가 필요합니다:
? 이후 부분을 분리
키와 값을 분리 (q=url)
URL 디코딩 수행 (예: %20은 공백으로 변환)
서버는 이 파라미터들을 기반으로 적절한 응답 생성
이러한 파싱 과정을 통해 브라우저는 사용자의 요청을 정확히 서버에 전달할 수 있습니다.
7-2) 만약 DNS가 www.google.com이라는 도메인에 대한 정보를 가지고 있지 않다면 어떻게 되나요 ?
"DNS가 특정 도메인에 대한 정보를 가지고 있지 않을 경우, DNS는 계층적 구조를 통해 순차적으로 검색을 수행합니다.
먼저 DNS의 계층 구조를 보면:
"DNS는 계층적 구조로 되어있어서, 특정 도메인의 정보가 없을 경우 Root DNS부터 시작해서 단계적으로 쿼리를 수행합니다. Root DNS → TLD DNS → Authoritative DNS 순서로 진행되며, 이를 DNS 재귀적 쿼리라고 합니다. 또한 성능 향상을 위해 각 단계에서 받은 정보는 일정 기간 캐시로 저장됩니다."
7-4) 트래픽은 사용자의 PC에서 구체적으로 어떤 과정을 거쳐 빠져나가나요 ? OSI 7계층이나 TCP/IP 4계층을 기준으로 설명해 보세요.
응용 계층: 사용자가 웹 브라우저에서 URL 입력 (HTTP 요청 생성).
전송 계층: HTTP 요청이 TCP 프로토콜로 캡슐화되고, 패킷 분할 및 포트 번호 부여.
네트워크/인터넷 계층: 패킷에 IP 주소를 부여하여 목적지 결정.
데이터 링크/네트워크 액세스 계층: MAC 주소를 추가하여 로컬 네트워크로 전달.
물리 계층: 전기 신호 또는 무선 신호로 변환하여 네트워크 장치(라우터 등)로 전송.
TCP/IP 모델은 실질적인 인터넷 프로토콜을 기반으로 트래픽 흐름을 4단계로 단순화합니다.
7-5) 라우터는 어떻게 구글 웹서버를 찾아가나요 ?
IP 주소 기반: 라우터는 패킷의 IP 헤더를 분석하여 목적지를 판단합니다.
최적 경로 탐색: 라우팅 알고리즘(OSPF, BGP 등)을 통해 최적 경로를 선택합니다.
계층적 전달: 각 라우터는 자신과 연결된 네트워크만 관리하며, 목적지가 직접 연결되지 않은 경우 상위 라우터로 전달합니다.
"라우터가 구글 서버를 찾아가는 과정은 크게 두 단계로 나눌 수 있습니다.
첫째, DNS 조회를 통해 www.google.com의 IP 주소를 알아냅니다. 이는 Local DNS부터 시작해서 단계적으로 찾아가는 과정입니다.
둘째, IP 주소를 알아낸 후에는 BGP 프로토콜을 사용해 최적의 경로를 찾습니다. 각 라우터는 라우팅 테이블을 가지고 있고, 이 정보를 기반으로 다음 라우터로 패킷을 전달하는 과정을 반복하여 최종 목적지인 구글 서버에 도달하게 됩니다.
구글의 경우 전 세계에 여러 데이터센터가 있어서, 사용자와 가까운 서버로 연결되도록 로드 밸런싱도 함께 이루어집니다."
7-5) 구글 웹 서버 장비에서 어떻게 트래픽이 웹 서비스로 접근하나요 ?
"서버 장비에 도착한 트래픽은 포트 번호를 통해 적절한 서비스로 연결됩니다.
예를 들어, 사용자가 웹 브라우저로 https://google.com에 접속하면, HTTPS 프로토콜의 기본 포트인 443번으로 요청이 들어옵니다. 서버에서는 이 443번 포트를 모니터링하고 있는 웹 서버가 해당 요청을 받아서 처리하게 됩니다.
결국 포트 번호는 서버 내에서 트래픽을 적절한 서비스로 연결해주는 일종의 통로 역할을 한다고 볼 수 있습니다."
7-6) 사용자의 웹 브라우저에 HTML이 렌더링되는 것 외에 다른 과정이 또 있을까요 ?
CSS, 자바스크립트, 이미지 파일등이 추가로 요청된다. 이 요소들의 URL은 보통 HTML 페이지 내에 들어 있기 때문에 먼저 HTML페이지를 받아 오고 난 뒤에 다른 요소들을 다운로드하여 최종 화면이 렌더링 된다.
이 과정에서 이미지 파일의 용량이 크거나 네트워크 속도가 낮은 경우, 다른 요소에 비해 이미지 파일이 늦게 로딩되는 현상을 볼 수 있다.
8) TCP와 UDP의 차이에 대해 설명해 보세요
TCP UDP는 둘다 전송계층에 속하는 프로토콜입니다. 그러나 트래픽을 전송하는 방식에 있어서 두 프로토콜은 큰 차이를 보이는데요. 우선 TCP의 경우 트래픽을 보낼 때 패킷이라는 단위를 사용합니다 이 패킷의 전송 과정 전후로 연결을 맺고 끊는 과정이 포함되고, 전송 도중에도 올바르게, 그리고 순서대로 도착했는지를 확인하는 과정이 있습니다.
그래서 패킷 전송시 신뢰성이 더 높습니다.
그러나 UDP는 트래픽을 보낼때 데이터그램이라는 단위를 사용하며, 전송 도중 TCP처럼 확인하는 과정이 없습니다.
따라서 상대적으로 TCP보다 신뢰성은 낮지만 속도가 빠릅니다.
++ HTTP/3가 TCP대신 UDP를 사용하는 이유
참고 : https://evan-moon.github.io/2019/10/08/what-is-http3/
https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP-30-%ED%86%B5%EC%8B%A0-%EA%B8%B0%EC%88%A0-%EC%9D%B4%EC%A0%9C%EB%8A%94-%ED%99%95%EC%8B%A4%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EC%9E%90 (추천 )
udp는 커스터 마이징이 가능하기 때문에 TCP가 가지고 있는 기능을 모두 구현 할 수 있음 따라서 udp위에 QUIC를 추가하여 확장
9) 공인 IP와 사설 IP의 차이는 무엇인가요 ?
공인 IP는 전 세계 인터넷 어디에서도 접근 가능한 유일한 주소입니다. IPv4를 기준으로 사용할 수 있는 IP주소는 대략 43억개 정도인데, 인터넷이 연결된 모든 기기에 IP주소를 부여하기에는 그 수가 너무 부족합니다.
그래서 IPv6처럼 더 많은 IP주소를 할당할 수 있는 방식이 등장했지만 아직 널리 사용되고 있지는 않고, 사설 IP가 IP주소 부족 문제를 부분적으로나마 해결해 주고 있습니다.
사설 IP는 어떤 네트워크 망 내부에서만 사용되는 IP주소로 보통 1
92.168로 시작하며 우리가 가장 흔히 볼 수 있는 IP이기도 합니다.
사설 IP를 사용하는 이유는 공인 IP 할당에 많은 비용이 들어간다는 이유도 있지만 네트워크 망을 외부와 분리하여 해킹 등의 위험으로부터 상대적으로 안전하게 인프라를 구성하려는 목적도 있습니다.
10) 로드밸런싱에 대해 설명해 보세요.
로드 밸런싱이란 하나의 서버가 받아야 할 트래픽을 여러서버가 나눠 받도록 부하를 분산하는 것입니다.
부하 분산을 위해서는 L4, L7 스위치 같은 네트워크 장비나 엔진엑스 같은 소프트 웨어 사용하여 서버를 구성합니다. 이렇게 하면 부하가 효과 외에도 스케일 아웃하기 좋은 환경이 됩니다. 또한 수평적으로 확장이 가능하기 때문에 들어오는 트래픽이 늘어나는 상황에 대응하기 좋다는 장점이 있습니다.
[서버] -> [서버][서버] [서버]
:서버의 개수를 늘리는 방식
예: 2대의 서버를 4대로 증설
장점:
비용이 상대적으로 저렴
하나의 서버가 다운되어도 전체 서비스 유지
필요에 따라 유연하게 확장/축소 가능
단점:
데이터 동기화 필요
관리 복잡도 증가
[서버] -> [더 큰 서버]
: 서버 자체의 성능을 향상시키는 방식
예: CPU 업그레이드, RAM 증설
장점:
관리가 단순
데이터 동기화 불필요
단점:
비용이 많이 듦
확장에 한계가 있음
장애 시 전체 서비스 중단
트래픽이 증가하는 상황에서는 보통 스케일 아웃 방식을 선호하는데, 이는 로드 밸런서를 통해 효율적으로 구현할 수 있습니다.