모의 기술면접 오답노트

찬민·2024년 8월 9일
0

TIL

목록 보기
33/62

기술 면접 오답노트

전반적으로 정답을 다 얘기했지만 디테일이 부족했고 생각이 정리가 안돼 답을 전달하는데 많이 부족했다 느껴 연습이어서 다행이었던 기술면접이었다.


1. 배열과 링크드 리스트의 차이점은?

배열(Array)링크드 리스트(Linked List)는 데이터 저장을 위한 대표적인 자료구조이다. 하지만 이 두 자료구조는 구조와 동작 방식에서 여러 차이점이 있다.

  • 배열:

    • 구조: 배열은 메모리상에서 연속적인 공간에 데이터를 저장한다. 배열은 고정된 크기로 선언되며, 메모리 공간이 연속적으로 할당된다.
    • 접근 속도: 인덱스를 통해 O(1)의 시간 복잡도로 특정 요소에 즉시 접근할 수 있다. 예를 들어, arr[5]를 호출하면 6번째 요소에 바로 접근할 수 있다.
    • 크기 변경: 배열의 크기는 초기 선언 시 정해지며, 이후 변경이 어렵다. 크기를 늘리려면 새로운 배열을 할당하고 데이터를 복사해야 한다.
    • 장점: 메모리의 연속적 배치로 인해 접근 속도가 매우 빠르다. 또한, 메모리 오버헤드가 적어 메모리 사용이 효율적이다.
    • 단점: 요소의 삽입과 삭제가 비효율적이다. 중간에 요소를 삽입하거나 삭제할 때마다, 모든 요소를 이동시켜야 하므로 O(n)의 시간이 걸린다.
  • 링크드 리스트:

    • 구조: 링크드 리스트는 요소(Node)가 데이터와 다음 요소의 주소(포인터)를 함께 저장한다. 요소들은 메모리에 연속적으로 배치되지 않는다.
    • 접근 속도: 인덱스를 통한 직접 접근이 불가능하다. 특정 요소를 찾으려면 첫 번째 요소부터 순차적으로 탐색해야 하므로 O(n)의 시간이 걸린다.
    • 크기 변경: 크기를 동적으로 조절할 수 있다. 새로운 요소를 추가할 때 메모리를 동적으로 할당받아 연결하면 되므로, 크기에 제한이 없다.
    • 장점: 삽입과 삭제가 효율적이다. 중간에 요소를 삽입하거나 삭제할 때, 포인터만 변경하면 되므로 O(1)의 시간이 걸린다.
    • 단점: 메모리 사용 효율이 떨어진다. 각 요소가 다음 요소를 가리키는 포인터를 추가로 저장해야 하므로, 메모리 오버헤드가 발생한다. 또한, 요소 접근이 느리다.

배열은 빠른 접근이 필요하고 크기가 고정된 상황에 적합하고, 링크드 리스트는 빈번한 삽입과 삭제가 필요한 경우에 유리하다.


2. TCP와 UDP의 차이점은?

TCP(Transmission Control Protocol)UDP(User Datagram Protocol)는 인터넷에서 데이터를 전송하는 데 사용되는 두 가지 주요 프로토콜이다. 이들은 서로 다른 특성과 용도를 가진다.

  • TCP:

    • 연결 지향적 프로토콜: 데이터를 전송하기 전에 송신자와 수신자 간의 연결을 확립한다. 이를 통해 신뢰성 있는 데이터 전송을 보장한다.
    • 데이터 전달 보장: 데이터가 손실되면 재전송하며, 데이터가 순서대로 도착하도록 보장한다. 이를 위해 패킷에 순서 번호를 붙이고, 수신자는 이를 기반으로 데이터 조립을 한다.
    • 흐름 제어와 혼잡 제어: 네트워크 상태에 따라 전송 속도를 조절해, 네트워크 혼잡을 방지하고 수신자가 데이터를 처리할 수 있도록 조절한다.
    • 응용 사례: HTTP, FTP, 이메일 등 데이터의 신뢰성이 중요한 애플리케이션에서 사용된다.
  • UDP:

    • 비연결 지향적 프로토콜: 송신자와 수신자 간의 연결을 확립하지 않고 데이터를 전송한다. 패킷을 독립적으로 전송하며, 수신자는 도착한 패킷을 바로 처리한다.
    • 데이터 전달 보장 없음: 데이터가 손실되거나 순서가 뒤바뀌어도 재전송하지 않는다. 따라서 신뢰성은 떨어지지만, 빠른 전송이 가능하다.
    • 간단한 구조: 오버헤드가 적고, 패킷을 빠르게 전송할 수 있어 실시간 애플리케이션에 적합하다.
    • 응용 사례: VoIP, 동영상 스트리밍, 온라인 게임 등 빠른 전송이 중요한 애플리케이션에서 사용된다.

TCP는 신뢰성이 중요할 때, UDP는 속도가 중요할 때 사용된다. 둘 다 네트워크 통신에서 중요한 역할을 한다.


3. HTTP와 HTTPS의 차이점?

HTTP(Hypertext Transfer Protocol)HTTPS(Hypertext Transfer Protocol Secure)는 웹에서 데이터를 주고받는 프로토콜이다. 이 둘은 기본적으로 동일한 역할을 하지만, 보안 측면에서 큰 차이가 있다.

  • HTTP:

    • 보안 없음: HTTP는 데이터를 평문으로 전송한다. 중간에 누군가가 데이터를 가로채면 내용이 그대로 노출된다.
    • 포트 80 사용: 기본적으로 80번 포트를 사용하여 통신한다.
    • 응용 사례: 보안이 필요하지 않은 일반적인 웹 페이지에서 사용된다. 예를 들어, 뉴스 사이트나 블로그 등의 비민감한 정보가 전송될 때 사용된다.
  • HTTPS:

    • 보안 추가: HTTPS는 SSL/TLS 프로토콜을 사용하여 데이터를 암호화한다. 이를 통해 데이터가 전송 중에 가로채지더라도 내용을 해독할 수 없도록 보호한다.
    • 포트 443 사용: 기본적으로 443번 포트를 사용하여 통신한다.
    • 인증서 필요: HTTPS를 사용하려면 SSL/TLS 인증서가 필요하다. 이 인증서를 통해 서버의 신원을 확인하고, 클라이언트와 서버 간의 암호화된 연결을 설정한다.
    • 응용 사례: 인터넷 뱅킹, 전자상거래, 로그인 페이지 등 민감한 정보를 주고받을 때 사용된다.

HTTPS는 HTTP에 보안 계층을 추가한 프로토콜로, 데이터 전송의 기밀성과 무결성을 보장한다. 이는 현대 웹에서 필수적인 요소이다.


4. 객체지향 프로그래밍의 4가지 주요 개념은 무엇인가?

객체지향 프로그래밍(OOP)은 소프트웨어 개발의 중요한 패러다임 중 하나로, 데이터와 데이터를 처리하는 메서드를 객체로 묶어 관리하는 방식이다. OOP의 네 가지 주요 개념은 다음과 같다.

  • 추상화(Abstraction):

    • 복잡한 시스템을 단순화하여 중요한 부분만 노출하고, 불필요한 세부 사항은 숨기는 기법이다. 예를 들어, 자동차 운전자는 엔진의 동작 원리를 몰라도 운전할 수 있다. OOP에서 추상화는 인터페이스나 추상 클래스를 통해 구현된다.
  • 캡슐화(Encapsulation):

    • 데이터와 메서드를 객체 내에 감싸고, 외부에서의 직접 접근을 제한하는 방법이다. 이는 데이터 보호와 모듈화를 가능하게 한다. 예를 들어, 클래스의 필드를 private으로 선언하고, 필드에 접근하기 위한 메서드를 제공하여 객체의 내부 상태를 보호할 수 있다.
  • 상속(Inheritance):

    • 기존 클래스(부모 클래스)의 특성과 기능을 새로운 클래스(자식 클래스)가 물려받아 사용할 수 있도록 하는 기법이다. 이를 통해 코드의 재사용성을 높이고, 공통된 기능을 추출하여 유지보수를 쉽게 한다. 예를 들어, Animal 클래스를 상속받아 Dog 클래스와 Cat 클래스를 구현할 수 있다.
  • 다형성(Polymorphism):

    • 하나의 메서드나 객체가 다양한 형태로 동작할 수 있도록 하는 특성이다. 다형성은 메서드 오버로딩과 오버라이딩을 통해 구현된다. 예를 들어, draw() 메서드를 호출할 때, Shape 클래스의 객체가 Circle인지 Rectangle인지에 따라 다르게 동작할 수 있다.

이 네 가지 개념은 객체지향 프로그래밍의 핵심 원리로, 복잡한 시스템을 이해하고 설계하는 데 중요한 역할을 한다.


5. 상속과 다형성(Polymorphism)의 차이점은?

상속(Inheritance)다형성(Polymorphism)은 객체지향 프로그래밍(OOP)에서 중요한 개념이지만, 그 목적과 사용 방식에서 차이가 있다.

  • 상속:

    • 목적: 상속의 주된 목적은 코드의 재사용성을 높이는 것이다. 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아, 중복 코드를 줄이고 공통된 기능을 효과적으로 관리할 수 있다.
    • 구조: 자식 클래스는 부모 클래스의 모든 필드와 메서드를 상속받아 사용할 수 있으며, 필요에 따라 추가 기능을 구현하거나 부모 클래스의 기능을 수정할 수 있다.
    • 예시: Animal 클래스를 상속받아 Dog 클래스와 Cat 클래스를 만들 수 있다. 두 클래스는 공통적으로 move()와 같은 메서드를 사용할 수 있다.
  • 다형성:

    • 목적: 다형성의 목적은 동일한 인터페이스나 메서드를 통해 다양한 객체가 서로 다른 방식으로 동작하도록 하는 것이다. 이를 통해 코드를 더 유연하고 확장 가능하게 만든다.
    • 구현 방식: 다형성은 메서드 오버로딩(같은 이름의 메서드가 매개변수에 따라 다르게 동작)과 오버라이딩(상속받은 메서드를 자식 클래스에서 재정의)으로 구현된다.
    • 예시: Shape 클래스를 상속받은 Circle 클래스와 Rectangle 클래스가 있다면, draw() 메서드는 각 클래스에서 다르게 구현될 수 있다. 하지만 외부에서는 동일한 draw() 메서드를 호출하여 다양한 형태의 도형을 그릴 수 있다.

상속은 코드 재사용을 통해 개발 효율성을 높이는 데 중점을 두고, 다형성은 객체의 유연성과 확장성을 강조한다. 둘 다 객체지향 프로그래밍의 중요한 요소이다.


6. SQL과 NoSQL의 차이는 무엇인가요?

SQLNoSQL은 데이터베이스 관리 시스템(DBMS)의 두 가지 주요 유형이다. 각각의 특성과 사용 사례에서 큰 차이가 있다.

  • SQL:

    • 구조적 데이터: SQL 데이터베이스는 데이터를 테이블 구조로 저장한다. 각 테이블은 열과 행으로 구성되며, 데이터 간의 관계를 정의한다.
    • 정형화된 스키마: SQL 데이터베이스는 엄격한 스키마를 사용한다. 테이블 구조가 정해지면, 데이터는 그 구조에 맞게 저장되어야 한다.
    • 관계형 데이터베이스: SQL은 관계형 데이터베이스 관리 시스템(RDBMS)에서 사용된다. 데이터 간의 관계를 외래 키(foreign key)를 통해 정의하며, 복잡한 쿼리를 통해 다양한 데이터를 연관 지어 처리할 수 있다.
    • ACID 특성: SQL 데이터베이스는 원자성, 일관성, 고립성, 지속성(ACID)을 보장하여 트랜잭션의 안전성을 제공한다.
    • 예시: MySQL, PostgreSQL, Oracle, MS SQL Server 등이 있다.
  • NoSQL:

    • 비구조적 데이터: NoSQL 데이터베이스는 데이터를 테이블이 아닌 다양한 형태로 저장할 수 있다. 예를 들어, 문서형, 키-값 저장소, 그래프형, 컬럼 패밀리형 데이터베이스 등이 있다.
    • 유연한 스키마: NoSQL 데이터베이스는 유연한 스키마를 제공한다. 데이터 구조가 고정되어 있지 않으며, 필요에 따라 동적으로 변경될 수 있다.
    • 수평적 확장성: NoSQL 데이터베이스는 대규모 분산 시스템에 적합하다. 수평적 확장이 용이하여, 데이터의 양이 증가함에 따라 쉽게 확장할 수 있다.
    • BASE 특성: NoSQL 데이터베이스는 기본적으로 가용성(Basically Available), 소프트 스테이트(Soft State), 최종 일관성(Eventually Consistent)을 보장한다. 이는 ACID와 반대되는 특성이다.
    • 예시: MongoDB, Cassandra, Redis, DynamoDB 등이 있다.

SQL은 정형화된 데이터와 복잡한 쿼리가 필요한 환경에 적합하고, NoSQL은 비정형 데이터와 대규모 분산 시스템에 적합하다. 두 데이터베이스 유형은 각각의 장단점이 있으며, 용도에 따라 선택적으로 사용된다.


7. SQL에서 JOIN의 종류와 각각의 차이점은?

JOIN은 두 개 이상의 테이블에서 데이터를 결합하여 조회하는 SQL 연산이다. JOIN에는 여러 종류가 있으며, 각 종류에 따라 결과가 달라진다.

  • INNER JOIN:

    • 동작: INNER JOIN은 두 테이블에서 공통된 값을 가진 행만 반환한다. 즉, 조건에 맞는 데이터만 결합하여 결과로 반환된다.
    • 예시:
      SELECT A.name, B.department
      FROM employees A
      INNER JOIN departments B ON A.department_id = B.id;
      이 쿼리는 employees 테이블과 departments 테이블을 department_id를 기준으로 결합하여, 일치하는 데이터만 반환한다.
  • LEFT (OUTER) JOIN:

    • 동작: LEFT JOIN은 왼쪽 테이블의 모든 데이터를 반환하며, 오른쪽 테이블에서 일치하는 데이터가 없는 경우 NULL로 채운다.
    • 예시:
      SELECT A.name, B.department
      FROM employees A
      LEFT JOIN departments B ON A.department_id = B.id;
      이 쿼리는 employees 테이블의 모든 행을 반환하며, departments 테이블에 일치하는 데이터가 없으면 NULL 값을 반환한다.
  • RIGHT (OUTER) JOIN:

    • 동작: RIGHT JOIN은 RIGHT JOIN은 LEFT JOIN과 반대로, 오른쪽 테이블의 모든 데이터를 반환하고, 왼쪽 테이블에 일치하는 데이터가 없는 경우 NULL로 채운다.
    • 예시:
      SELECT A.name, B.department
      FROM employees A
      RIGHT JOIN departments B ON A.department_id = B.id;
      이 쿼리는 departments 테이블의 모든 행을 반환하며, employees 테이블에 일치하는 데이터가 없으면 NULL 값을 반환한다.
  • FULL (OUTER) JOIN:

    • 동작: FULL JOIN은 두 테이블에서 일치하는 데이터뿐만 아니라, 일치하지 않는 데이터도 모두 반환한다. 왼쪽 또는 오른쪽 테이블에 일치하지 않는 경우 NULL로 채운다.
    • 예시:
      SELECT A.name, B.department
      FROM employees A
      FULL JOIN departments B ON A.department_id = B.id;
      이 쿼리는 employeesdepartments 테이블의 모든 데이터를 결합하며, 일치하지 않는 경우 NULL로 반환한다.
  • CROSS JOIN:

    • 동작: CROSS JOIN은 두 테이블의 모든 가능한 조합을 반환한다. 즉, 두 테이블의 Cartesian 곱을 생성한다.
    • 예시:
      SELECT A.name, B.department
      FROM employees A
      CROSS JOIN departments B;
      이 쿼리는 employeesdepartments의 모든 가능한 조합을 반환한다. 즉, 각 직원마다 모든 부서와의 조합을 결과로 반환한다.

JOIN 연산은 여러 테이블에서 데이터를 결합하고, 관계를 기반으로 데이터를 조회하는 데 필수적이다. 각각의 JOIN 유형은 특정 시나리오에서 적합하게 사용된다.


8. 서브쿼리와 조인의 차이점은?

서브쿼리(Subquery)JOIN은 모두 SQL에서 데이터를 조회하는 방법이지만, 사용 방식과 목적에서 차이가 있다.

  • 서브쿼리:

    • 정의: 서브쿼리는 하나의 SQL 문 내에서 다른 SQL 쿼리를 포함하는 구조이다. 주로 SELECT, INSERT, UPDATE, DELETE 문 내에서 사용된다.
    • 용도: 서브쿼리는 보통 특정 조건을 만족하는 데이터를 필터링하거나 계산된 값을 반환하는 데 사용된다. 서브쿼리는 독립적으로 실행되며, 결과를 상위 쿼리에서 사용한다.
    • 예시:
      SELECT name
      FROM employees
      WHERE salary > (SELECT AVG(salary) FROM employees);
      이 쿼리는 전체 직원의 평균 급여보다 높은 급여를 받는 직원의 이름을 반환한다. 서브쿼리는 평균 급여를 계산하고, 상위 쿼리는 그 값을 사용해 필터링한다.
  • JOIN:

    • 정의: JOIN은 여러 테이블의 데이터를 결합하여 하나의 결과 집합을 생성하는 SQL 연산이다. 테이블 간의 관계를 기반으로 데이터를 연결하여 조회한다.
    • 용도: JOIN은 주로 관계형 데이터베이스에서 여러 테이블 간의 관계를 기반으로 데이터를 결합하고, 필요한 데이터를 조회하는데 사용된다.
    • 예시:
      SELECT A.name, B.department
      FROM employees A
      INNER JOIN departments B ON A.department_id = B.id;
      이 쿼리는 직원의 이름과 부서를 반환한다. JOIN은 employeesdepartments 테이블을 결합하여 일치하는 데이터를 반환한다.

서브쿼리는 쿼리 내에서 데이터를 필터링하거나 계산된 값을 반환하는 데 사용되고, JOIN은 여러 테이블에서 관련 데이터를 결합하여 조회하는 데 사용된다. 각각의 기법은 상황에 맞게 선택적으로 사용되며, SQL 쿼리 작성 시 필수적인 도구이다.

0개의 댓글