※ 키워드 제시 후 그와 관련된 설명을 풀어가는 느낌으로 답변하기.
개념을 정리할 때 키워드를 정해서 공부하면 이해가 수월할 것 같다
Q1. 배열과 링크드리스트의 차이점
배열 (Array) 과 링크드리스트 (Linked List) 는 둘 다 데이터를 저장하는 자료 구조
- 데이터 연속성
배열은 연속된 메모리 공간에 요소들이 물리적으로 붙어서 저장됨.
따라서 배열을 선언할 때 미리 고정된 크기를 지정해야 함.
링크드리스트는 불연속적인 메모리 공간에 개별 노드의 연결로 저장됨.
따라서 동적으로 크기 변경이 가능함.
- 접근(검색/참조) 시간
배열은 각 데이터가 들어있는 상자에 인덱스 번호표가 붙어있음.
인덱스를 통해 특정 요소 검색 시 바로 접근 가능 : 상수시간 O(1) 소요
링크드리스트의 각 노드는 data + next 포인터(다음 노드를 가리키는 역할)로 구성됨.
처음부터 next 정보 링크를 타고 순차적으로 탐색해야 함 : 선형시간 O(n) 소요
- 삽입/삭제 시간
배열은 메모리 공간에 요소들이 연속적으로 저장되므로,
해당요소가 추가/빠지면 나머지 요소들도 전부 이동해야 함 : 선형시간 O(n) 소요
링크드리스트는 다음노드의 위치를 가리키는 next 포인터를 갖고있으므로,
링크를 끊고(==포인터만 수정) 데이터를 삽입/삭제하면 됨 : 상수시간 O(1) 소요
다만, 삽입/삭제할 위치를 찾는 데(==접근 시간)는 O(n) 시간이 소요될 수 있다.
- 메모리 효율성
배열은 미리 고정된 크기의 메모리를 할당하므로,
쓰레기공간이 생기게 됨, 요소의 수가 배열 크기보다 작을 경우 메모리 낭비될 수 있음.
링크드리스트는 필요한 만큼만 노드를 생성하므로,
효율이 더 좋음. 근데 포인터도 저장하니까 전체적으로는 메모리를 더 사용할 수 있다.
※ 시험보는 것처럼 외워서 말하는 게 아니라
자기만의 방식으로 이해한 내용을 풀어서 설명하기
칭찬받은 부분이다 히히
Q2. TCP와 UDP의 차이점
- 연결/비연결 지향
TCP(Transmission Control Protocol)는 연결 지향성 프로토콜.
데이터 전송 전에 송신자와 수신자 간에 연결이 확립되어야 함.
연결을 설정하기 위해 3-way handshake라는 절차를 사용하며, 이 연결이 확립된 후에만 데이터를 주고받을 수 있음.
UDP(User Datagram Protocol)은 비연결 지향성 프로토콜.
데이터 전송 전에 송신자와 수신자 간에 연결을 설정하지 않음.
따라서 데이터를 전송하기 위한 오버헤드가 적음.
- 신뢰성
TCP는 데이터의 신뢰성을 보장함.
데이터가 전송된 후, 수신자는 수신 확인(ACK)을 송신자에게 보냄. 만약 패킷이 손실되거나 손상되면, TCP는 이를 감지하고 패킷을 재전송함.
데이터의 순서를 보장함. 데이터가 순서대로 도착하도록 함
UDP는 신뢰성을 보장하지 않음.
송신자는 데이터를 전송하면 끝이고, 수신자가 데이터를 받았는지 손실되었는지 확인하지 않음.
데이터의 순서를 보장하지 않음.
- 속도제어
TCP는 흐름 제어와 혼잡 제어 메커니즘을 갖추고 있음.
흐름 제어 : 수신자가 처리 가능한 데이터 양을 초과하지 않도록 송신자의 전송 속도 조절
혼잡 제어 : 네트워크 혼잡을 피하기 위해 전송 속도 조절
UDP는 흐름 제어나 혼잡 제어를 하지 않음
송신자는 단순히 가능한 빠르게 데이터를 전송하고, 네트워크의 상태를 고려하지 않음
※ 답변을 할 때 중요한 개념 (ex 3-way handshake) 을 함께 언급하면서
다음 질문을 내가 아는 개념으로 유도하는 것도 중요하다
안그럼 모르는 질문으로 넘어가게 됨
Q3. HTTP와 HTTPS의 차이점
Hypertext : 링크처럼 다른 문서로 넘어갈 수 있는 텍스트
Transfer : 전송을 의미
Protocol : 통신 규약
- 기본 개념
HTTP는 웹 브라우저가 웹 서버에게 요청을 하면 웹 서버가 웹 브라우저에게 응답을 해서 데이터를 주고받는 프로토콜.
HTTPS는 안전을 의미하는 Secure 가 추가된 개념. HTTP 위에 암호화 프로토콜을 추가하여 데이터 전송 시 보완을 강화하는 프로토콜.
- 보안 / 데이터 무결성
HTTP는 데이터를 암호화하지 않고 전송함.
네트워크 상에서 데이터를 가로채는 공격(ex 스니핑)으로 인해 민감한 정보가 노출될 수 있음
따라서 데이터 전송 중에 데이터가 변조될 수 있는 위험이 있음
HTTPS는 SSL/TLS 암호화를 사용하여 데이터를 안전하게 전송함.
암호화된 데이터를 전송함으로써 중간에서 데이터가 탈취되더라도, 해당 데이터를 읽을 수 없음
따라서 전송 중 데이터가 변조되거나 손상되지 않음. 무결성 보장
- 포트번호
HTTP : 기본적으로 80번 포트
HTTPS : 기본적으로 443번 포트
- 인증서
HTTP는 인증서를 사용하지 않기 때문에, 데이터 전송 시 웹사이트의 신뢰성을 확인할 수 있는 방법이 없음.
HTTPS는 SSL/TLS 인증서를 사용하여 웹사이트의 신원을 확인함.
인증서는 신뢰할 수 있는 인증 기관(CA, Certificate Authority)에서 발급되며 웹사이트가 안전한지 여부를 브라우저에서 확인할 수 있음. (웹사이트 주소 옆에 자물쇠 아이콘)
- 사용 사례
HTTP는 보안이 상대적으로 덜 중요한 공개 웹 페이지나 데이터가 노출되어도 상관없는 경우에 사용됨
HTTPS는 보안이 중요한 웹 페이지에서 사용됨
ex) 로그인 페이지, 결제 페이지, 개인정보를 다루는 웹 페이지.
※ 확실히 아는 것이 아니면 예시를 드는 게 오히려 마이너스일 수 있음 ㅠ
나는 HTTP가 일반적인 줄 알았는데
요즘은 보안강화와 브라우저 정책으로 인해 대부분의 웹사이트가 HTTPS를 사용하고 있다고 한다....
Q4. 객체지향 프로그래밍의 4가지 주요 개념
Object-Oriented Programming 객체 지향 프로그래밍
프로그램을 '객체' 하나하나의 모임으로 구성하는 방식.
객체 = 속성인 데이터 + 행동인 메서드 를 함께 묶은 개념
이 객체를 생성하기 위한 템플릿 = 클래스
- 캡슐화(Encapsulation)
데이터의 무결성을 유지하고 객체의 상태를 외부에서 잘못된 방식으로 조작하지 못하게 함.
코드를 보다 모듈화하고 복잡성을 줄이며 유지보수를 용이하게 만듦
- 상속(Inheritance)
하나의 클래스(부모 클래스 또는 슈퍼클래스)의 속성과 메서드를 다른 클래스(자식 클래스 또는 서브클래스)가 물려받는 것.
자식 클래스는 부모 클래스의 기능을 그대로 사용하거나, 확장하여 새로운 기능을 추가할 수 있음.
코드의 재사용성을 높여주며, 계층적인 구조를 통해 클래스 간의 관계를 명확하게 정의
공통된 기능을 부모 클래스에서 정의하고, 이를 여러 자식 클래스에서 공유함으로써 중복 코드를 줄일 수 있음
- 다형성(Polymorphism)
하나의 메서드가 여러 다른 클래스에서 다양한 형태로 구현될 수 있는 능력.
동일한 메서드 호출이 객체의 실제 타입에 따라 다르게 동작할 수 있
코드의 유연성과 확장성을 높임
동일한 코드가 다양한 객체에 대해 올바르게 동작할 수 있게 하여, 프로그램을 보다 일반적이고 유연하게 설계할 수 있음
- 추상화(Abstraction)
복잡한 시스템에서 핵심적인 개념이나 기능만을 표현하고, 불필요한 세부 사항은 감추는 것.
사용자에게 필요한 기능만을 제공하고, 구현의 세부 사항을 숨김으로써 인터페이스를 단순화할 수 있음
사용자가 객체의 내부 구조를 이해하지 않고도 객체를 사용할 수 있게 하며, 코드를 더 쉽게 이해하고 사용할 수 있도록 도와줌.
Q5. 상속과 다형성(Polymorphism)의 차이점
상속은 코드 재사용과 계층적 관계를 정의하는 데 중점을 두고,
다형성은 다양한 객체들이 동일한 인터페이스를 통해 다르게 동작할 수 있게 하는 유연성을 제공함.
- 정의
상속 : 하나의 클래스(부모 클래스 또는 슈퍼클래스)가 가진 속성과 메서드를 다른 클래스(자식 클래스 또는 서브클래스)가 물려받는 것
자식 클래스는 부모 클래스의 기능을 그대로 사용하거나, 확장하여 새로운 기능을 추가할 수 있음
다형성 : 하나의 메서드가 여러 다른 클래스에서 다양한 형태로 구현될 수 있는 능력
동일한 메서드 호출이 객체의 실제 타입에 따라 다르게 동작할 수 있는 것을 의미
- 목적
상속의 주된 목적은 코드의 재사용성과 계층적 관계를 표현
코드 중복을 줄이고 유지보수성을 높임
다형성의 목적은 코드의 유연성 및 확장성을 제공하는 것
동일한 메서드나 인터페이스가 다양한 클래스에서 다르게 구현될 수 있으며, 코드의 일반화와 다형성을 통해 객체 지향 설계를 유연하게 만들 수 있음.
- 구현 방식
상속은 클래스 간의 관계를 통해 구현
자식 클래스는 부모 클래스를 상속받아 그 기능을 확장하거나 재정의할 수 있음
다형성은 주로 메서드 오버라이딩(부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의)과 인터페이스를 통해 구현
인터페이스는 클래스들이 동일한 메서드를 다르게 구현할 수 있도록 하고 다양한 객체들이 동일한 방식으로 사용될 수 있게 함
Q6. SQL과 NoSQL의 차이점
- 데이터 모델
SQL 데이터베이스는 관계형 데이터베이스(Relational Database)라고도 불리며, 데이터를 테이블(표)의 형태로 저장함
각 테이블은 고정된 스키마(열과 데이터 타입)를 가지며 테이블 간의 관계는 외래 키(Foreign Key) 등을 통해 정의됨.
데이터는 구조화된 형식으로 엄격하게 관리됨.
NoSQL 데이터베이스는 비관계형 데이터베이스(Non-relational Database)로, 데이터 모델이 유연함.
주요 데이터 모델에는 문서(Document), 키-값(Key-Value), 그래프(Graph), 열(Column) 기반 저장소가 있음.
NoSQL 데이터베이스는 고정된 스키마를 요구하지 않으며, 다양한 형태의 데이터(구조화된 데이터, 반구조화된 데이터 등)를 저장할 수 있음.
- 스케일링
SQL 데이터베이스는 일반적으로 수직적 확장(Scale-up)을 통해 성능을 향상시킴
더 강력한 하드웨어(더 많은 CPU, RAM 등)를 추가하여 데이터베이스의 성능을 높임
NoSQL 데이터베이스는 수평적 확장(Scale-out)에 최적화되어 있음
더 많은 서버를 추가하여 데이터베이스의 성능과 저장 용량을 확장할 수 있음
- 스키마 유연성
SQL 데이터베이스는 엄격한 스키마를 요구함.
테이블이 생성될 때 스키마를 정의해야 하며, 추가 시 이 스키마를 준수해야 함.
NoSQL 데이터베이스는 스키마리스(Schema-less) 또는 동적 스키마를 허용함.
데이터 구조가 변경될 수 있으며, 각 데이터 항목이 서로 다른 필드나 데이터 타입을 가질 수 있음을 의미.
- 사용 사례
SQL 데이터베이스는 복잡한 쿼리, 다중 테이블 간의 관계, 강력한 데이터 무결성이 필요한 전통적인 애플리케이션에서 주로 사용
ex) 금융 시스템, ERP, CRM
NoSQL 데이터베이스는 대규모 데이터 처리, 비정형 데이터, 빠른 스키마 변경이 필요한 애플리케이션에서 주로 사용
ex) 소셜 미디어, 빅데이터 분석, IoT, 실시간 웹 애플리케이션
※ 본인의 경험을 예시로 들어 설명하기
답변에 본인의 프로젝트 경험을 예시로 들어 설명하면 좋다
+ 간접경험 상상하기
경험이 없다면 공부할 때 이 개념을 어느 경우에 사용하고 선택해야 좋을지
구체적인 사례를 찾아보고 니경험 내경험으로 생각해보면서 공부하기
Q7. SQL에서 JOIN의 종류와 각각의 차이점?
- inner join
두 테이블에서 매칭되는(즉, 공통된) 레코드만 반환
조인 조건에 맞는 데이터가 두 테이블에 모두 존재해야만 결과에 포함됨
ex) 고객 테이블과 주문 테이블을 조인할 때, 고객과 주문이 모두 일치하는 경우에만 결과로 나타나는 경우
- left join
왼쪽 테이블의 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드가 있는 경우에만 해당 레코드를 반환
오른쪽 테이블에 일치하는 레코드가 없으면 NULL 값이 반환
ex) 모든 고객을 조회하면서, 각 고객의 주문이 있다면 그 정보를 함께 보여주고, 주문이 없는 고객도 결과에 포함시키고 싶은 경우
- right join
오른쪽 테이블의 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드가 있는 경우에만 해당 레코드를 반환
왼쪽 테이블에 일치하는 레코드가 없으면 NULL 값이 반환
ex) 모든 주문을 조회하면서, 주문한 고객이 있다면 그 정보를 함께 보여주고, 고객 정보가 없는 주문도 결과에 포함시키고 싶은 경우
- full join
왼쪽 테이블과 오른쪽 테이블의 모든 레코드를 반환
조인 조건에 일치하는 레코드는 결합되고, 일치하지 않는 레코드는 NULL 값을 사용하여 반환
ex) 모든 고객과 모든 주문을 조회하면서, 고객과 주문이 일치하지 않더라도 모두 결과에 포함시키고 싶은 경우
- cross join
두 테이블의 모든 조합(카티션 곱)을 반환
첫 번째 테이블의 각 행과 두 번째 테이블의 각 행을 모두 조합한 결과가 생성
ex) 모든 고객과 모든 상품을 조합하여 가능한 모든 구매 시나리오를 분석하고 싶은 경우
- self join
동일한 테이블 내에서 자체적으로 조인하는 방식
테이블은 자기 자신과 결합되며, 서로 다른 두 별칭을 사용하여 마치 두 개의 테이블처럼 취급됨
ex) 직원 테이블에서 관리자를 기준으로 직원들을 그룹화하거나, 트리 구조의 데이터에서 부모-자식 관계를 표현하고 싶은 경우
※ 이문제는 공부하긴 했는데 이해한게 아니라 외운거라서 답변을 제대로 못했다..
모르면 모른다고 솔직하게 빠르게 말한 건 잘한거라고 하셧음(물론 답변을 하는게 좋음)
질문자도 시간낭비 안하고 좋다구 함ㅜ
Q8. 서브쿼리와 조인의 차이점
둘다 특정 데이터 조회 시 사용하는 구문
- 구조
서브쿼리 : 쿼리 안에 또다른 쿼리가 중첩된 구조. 메인 쿼리 실행 전에 서브쿼리가 먼저 실행된다
조인 : 여러 테이블 간의 관계를 기반으로 데이터를 결합해서 하나의 결과 집합으로 만드는 구조
- 용도
서브쿼리 : 특정 조건을 만족하는 데이터를 필터링하거나, 집계된 값을 이용할 때
조인 : 여러 테이블에서 관련 데이터를 함께 조회할 때, 복잡한 데이터 구조를 처리할 때
Q9. 컴파일러와 인터프리터의 차이점
컴파일러와 인터프리터는 이름그대로 소스코드를 실행 가능한 형태로 번역하는 도구
- 실행방식
컴파일러 : 소스코드를 전체적으로 번역해서 기계어로 변환을 한 후에 실행 파일을 생성. 프로그램 실행 전에 번역이 이뤄짐.
인터프리터 : 소스코드를 한줄씩 읽고 번역하면서 즉시 실행. 프로그램 실행 중에 번역이 이루어짐
- 속도
컴파일러 : 이미 번역된 코드를 실행하는거니까 실행속도가 빠름
인터프리터 : 실행할 때마다 코드를 번역해야하기 때문에 실행 속도가 느림
- 오류발견 시점
컴파일러 : 컴파일이 성공해야 실행파일이 생성되므로 컴파일 시점에서 오류를 발견할 수 있음
인터프리터 : 코드를 실행하는 도중에서야 오류를 발견할 수 있고, 오류가 발생하면 프로그램이 멈춤
- 사용사례
컴파일러 : 성능과 속도가 중요한 게임이나, 운영체제같은 대규모 프로그램
인터프리터 : 코드 수정 후에 바로 결과를 확인할 수 있기 때문에 테스트나 디버깅이 중요한 경우, 또 프로토타입 개발중에 수정이 많이 필요한 경우
※ 단어 선택 하나하나를 조심히 하기ㅠㅠ
특히 일반화의 위험이 있는 단어는 선택을 지양해야 한다.
컴파일러가 실행 전에 '모든' 오류를 발견할 수 있는 건 아니라고 하심.
개발자에게는 이런 사소한 실수가 엄청 잘 들린다구 한다.