면접 대비 CS 질문 요약 (1~6)

나무에물주기·2022년 12월 18일
4
post-thumbnail

면접 대비 CS 질문 (1~6)

1. 포인터란 ?

  • C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부릅니다.
  • char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.

2. 구조체와 클래스

  • 구조체와 클래스를 사용하는 이유 : 동일한 속성의 데이터들을 하나로 묶어서 관리하기 위해 사용한다.
  • 구조체 : 연관성이 있는 다양한 자료형의 변수들을 한데 모아 묶어 놓은 그룹이다. (사용자 정의 자료형)
  • 클래스 : 연관성이 있는 다양한 자료형의 변수들과 메소드들을 함께 묶어 놓은 그룹이다. (사용자 정의 자료형) 객체를 만드는 틀로, 상속을 통해 코드를 중복 해서 적을 필요가 없다. (코드의 재사용)
  • 구조체와 클래스의 공통점 : 서로 다른 자료형을 하나의 집합으로 묶을 수 있다, 사용자가 직접 정의하여 새로운 자료형처럼 사용이 가능하다, 도트(.)연산자를 통해 속성을 참조한다.
  • 구조체와 클래스의 차이점 : 구조체는 값 형식이고 클래스는 참조 형식이다.

  • 구조체는 단순 값 저장이지만 클래스는 new 연산자를 통해 객체를 생성하고 할당해줘야지만 사용이 가능하다, 아무 것도 참조하지 않은 클래스 변수에 값을 대입하려고 했으니 오류가 발생한다.
  • 구조체는 스택할당을 사용하고 클래스는 힙 할당을 사용한다.
  • 구조체는 안이 비면 안 되는데 클래스는 비어있어도 된다.

3. 이중 포인터, 삼중 포인터란?

  • 이중 포인터란, 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다.
  • 삼중 포인터란, 이중 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다.
  • 싱글 포인터, 이중 포인터, 삼중 포인터 변수는 종류와 상관없이 무조건 주소 값을 저장하는 변수이다.

4. 스택과 큐

  • 스택(stack)이란 쌓아 올린다는 것을 의미한다. 따라서 스택 자료구조라는 것은 책을 쌓는 것 처럼 차곡차곡 쌓아 올린 형태의 자료구조를 의미한다.
  • 스택의 특징 : 스택은 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을 수 있고, top으로 지정한 곳을 통해서만 접근 할 수 있다.
  • top에는 가장 위에 있는 자료는 가장 최근에 들어온 자료를 가리키고 있으며, 삽입되는 새 자료는 top이 가리키는 자료의 위에 쌓이게 된다.
  • 따라서 스택은 시간 순서에 따라 자료가 쌓여서 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다는 구조적 특징을 가지게 된다.
  • 이러한 스택의 구조를 후입선출(LIFO, Last - In - First - Out) 구조라고 한다.
  • 비어있는 스택에서 원소를 추출하려고 할 때 stack underflow라고 하며, 스택이 넘치는 경우 stack overflow라고 한다.

  • 큐(queue)란 줄, 혹은 줄을 서서 기다리는 것을 의미한다. 따라서 일상생활에서 줄을 서서 기다리는 것, 먼저 들어 온 것을 먼저 처리하는 선입선출(FIFO, First - In - First - Out) 방식의 자료구조를 의미한다.
  • 큐는 한쪽 끝에서 삽입 작업이, 다른 쪽 끝에서 삭제 작업이 양쪽으로 이루어진다.
  • 이때 삭제 연산만 수행되는 곳을 프론트(front), 삽입 연산만 이루어 지는 곳을 리어(rear)로 정하여 각각의 연산 작업만 수행된다.
  • 큐의 리어에서 이루어지는 삽입연산을 인쿠(enQueue), 프론트에서 이루어지는 삭제연산을 디큐(deQueue)라고 부른다.
  • 즉 큐에서 프론트 원소는 가장 먼저 큐에 들어왔던 첫 번째 원소가 되는 것이며, 리어 원소는 가장 늦게 큐에 들어온 마지막 원소가 되는 것 이다.

5. 객체 지향 프로그래밍이란?

  • 객체지향 프로그래밍(Object - Oriented - Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
  • 객체란 ? : 객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.
  • 객체지향 프로그래밍을 레고에 빗대어 표현한다면, 객체가 레고의 조각이 될 것이고, 레고의 조각을 조립해서 무언가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.
  • 객체는 또한 레고 조각과도 비슷하게 여러군데에서 재사용 할 수 있는데 이는 부품화와 재사용성 이라는 객체지향 프로그래밍의 특징을 보여주기도 한다.

6. 객체지향 프로그래밍의 특징

  • 객체 지향 프로그래밍은 크게 추상화, 캡슐화, 상속, 다형성의 네 가지 특징을 가진다.

1. 추상화 : 객체에서 공통된 속성과 행위를 추출 하는 것, 공통의 속성과 행위를 찾아서 타입을 정의하는 과정, 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것. 큰 개념 에서 의 공통적인 특징들을 추상화 한 다음, 추가로 만들 부분만 새로 생성해주면 된다.

2. 캡슐화 : 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함), 낮은 결합도를 유지할 수 있도록 설계하는 것. 캡슐화를 통한 정보은닉을 활용 할 수 있음. (접근 제어자의 활용)

3. 상속 : 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말한다, 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능.

3 - 1 상속의 장점 : 재사용으로 인한 코드가 줄어든다, 범용적인 사용이 가능하다, 자료와 메서드의 자유로운 사용 및 추가가 가능하다.

3 - 2 상속의 단점 : 상위 클래스의 변경이 어려워진다, 불필요한 클래스가 증가 할 수 있다, 상속이 잘못 사용될 가능성이 있다.

4. 다형성 : 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것, 어떠한 요소에 여러 개념을 넣어 놓는 것, 객체지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성 이라는 특징을 갖게 된다.

4 - 1 오버로딩 : 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것.

4 - 2 오버라이딩 : 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것

  • 객체 지향 프로그래밍의 장단점

장점 : 클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고, 대규모 소프트웨어 개발에 적합하다, 클래스 단위로 수정이 가능하기 때문에 유지 보수가 편리하다, 클래스를 재사용하거나, 상속을 통해 확장함으로써 코드 재사용이 용이하다

단점 : 처리속도가 상대적으로 느리다, 객체의 수가 많아짐에 따라 용량이 커질 수 있다, 설계시 많은 시간과 노력이 필요하게 될 수 있다.

  • SOLID (객체 지향 설계 원칙)

객체 지향적으로 설계하기 위해 SOLID라 불리는 다섯 가지 원칙이 있다.

  1. 단일 책임 원칙 (SRP, Single Responsibility Principle)
  • 하나의 클래스는 단 하나의 책임만 가져야 한다.
  • 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다.
  1. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)
  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다
  • 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.
  1. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)
  • 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  1. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
  • 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
  • 인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  • 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.
  1. 의존관계 역전 원칙 (DIP, Dependency Inversion Principle)
  • 추상화에 의존해야지 구체화에 의존하면 안된다.
  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
profile
개인 공부를 정리함니다

0개의 댓글