[포스코x코딩온] 스마트팩토리 입문과정 | 면접 대비 | C++ 기술면접 대비(1)

김영웅·2023년 4월 30일
0
post-thumbnail

이번 포스팅은 기술면접에 있어서 예상 질문과 C++에 대해 알고 있어야 할 내용들을 학습하고자 작성했다.


[C++ 기술면접 대비]

  • C와 C++의 차이
  • C++의 특징
  • 생성자(constructor)와 소멸자(destructor)란 무엇인가?
  • struct와 class의 차이
  • C++에서 Virtual은 왜 존재하는가?
  • 오버로딩(Overloding)과 오버라이딩(Overriding)
  • \n과 endl의 차이
  • malloc과 new의 차이
  • 얕은 복사와 깊은 복사
  • C++ 프로그램 빌드 과정
  • 메모리 영역

- C와 C++의 차이

C와 C++의 차이는 C는 절차(지향)적 프로그래밍 언어라는 점과 C++은 객체(지향)적 프로그래밍 언어라는 점이다.
절차지향 언어는 일련의 처리 절차를 정해진 문법에 따라 순서대로 기술해 나가는 언어이다.
객체지향 언어는 현실 세계의 개체(Entity)를 기계의 부품처럼 하나의 객체(Object)로 만들어, 기계적인 부품들을 조립하여 제품을 만들 듯이 소프트웨어를 개발할 때도 객체들을 조립해서 프로그램을 작성할 수 있도록 한 프로그래밍 기법이다.

- C++의 특징

[객체지향]

  • 객체(Object)

    객체는 데이터와 데이터를 처리하는 함수를 묶어 놓은(캡슐화한) 하나의 소프트웨어 모듈이다.
[데이터]
- 객체가 가지고 있는 정보로 속성이나 상태, 분류 등을 나타낸다.
- 속성(Attribute), 상태, 변수, 상수, 자료 구조라고도 한다.
[함수]
- 객체가 수행하는 기능으로 객체가 갖는 데이터(속성, 상태)를 처리하는 알고리즘이다.
- 객체의 상태를 참조하거나 변경하는 수단이 되는 것으로 메소드(Method, 행위), 서비스(Service), 동작(Operation), 연산이라고도 한다.
  • 클래스(Class)

    클래스는 공통된 속성과 연산(행위)을 갖는 객체의 집합으로, 객제의 일반적인 타입(Type)을 의미한다.
- 클래스는 각각의 객체들이 갖는 속성과 연산을 정의하고 있는 틀이다.
- 클래스는 객체지향 프로그램에서 데이터를 추상화하는 단위이다.
- 클래스에 속한 각각의 객체를 인스턴스(mnstance)라 하며, 클래스로부터 새로운 객체를 생성하는 것을 인스턴스화(Instantiation)라고 한다.
- 동일 클래스에 속한 각각의 객체(인스턴스)들은 공통된 속성과 행위를 가지고 있으면서, 그 속성에 대한 정보가 서로 달라서 동일 기능을 하는 여러 가지 객체를 나타내게 된다.
- 최상위 클래스는 상위 클래스를 갖지 않는 클래스를 의미한다.
- 슈퍼 클래스(Super Class)는 특정 클래스의 상위(부모) 클래스이고, 서브 클래스(Sub Class)는 특정 클래스의 하위(자식) 클래스를 의미한다.
  • 캡술화(Encapsulation)

    캡술화는 데이터(속성)와 데이터를 처리하는 함수를 하나로 뮤는 것을 의미한다.
- 캡술화된 객체는 인터페이스를 제외한 세부 내용이 은페(정보 은닉)되어 외부에서의 접근이 제한적이기 때문에 외부 모듈의 번경으로 인한 파급 효과가 적다.
- 캡술화된 객체들은 재사용이 용이하다.
- 객제들 간의 메시지를 주고받을 때 상대 객제의 세부 내용은 알 필요가 없으므로 인터페이스가 단순해지고, 객체 간의 걸합도가 낮아진다.
  • 상속(lnheritance)

    상속은 이미 정의된 상위 클래스(부모 클래스)의 모든 속성과 연산을 하위 클래스(자식 클래스)가 물려받는 것이다.
- 상속을 이용하면 하위 클래스는 상위 클래스의 모든 속성과 연산을 자신의 클래스 내에서 다시 정의하지 않고서도 즉시 자신의 속성으로 사용할 수 있다.
- 하위 클래스는 상위 클래스로부터 상속받은 속성과 연산 외에 새로운 속성과 연산을 첨가하여 사용할 수 있다.
- 상위 클래스의 속성과 언산을 하위 클레스가 사용할 수 있기 때문에 객제와 클래스의 재사용, 즉 소프트웨어의 재사용(Reuse)을 높이는 중요한 개념이다.
- 다중 상속(Muliple Inheritance) : 한 개의 클래스가 두 개 이상의 상위 클래스로부터 속성과 연산을 상속받는 짓이다.
  • 다형성(Polymorphism)

    다형성은 메시지에 의해 객체(클래스)가 연산을 수행하게 될 때 하나의 메시지에 대해 각각의 객체(클래스)가 가지고 있는 고유한 방법(특성)으로 응답할 수 있는 능력을 의미한다.
- 객체(클래스)들은 동일한 메소드명을 사용하며 같은 의미의 응답을 한다.
- 응용 프로그램 상에서 하나의 함수나 연산자가 두 개 이상의 서로 다른 클래스의 인스턴스들을 같은 클래스에 속한 인스턴스처럼 수행할 수 있도록 하는 것이다.
  • 연관성(Relationship)

    연관성은 두 개 이상의 객체(클래스)들이 상호 참조하는 관계를 말한다.

- 생성자(constructor)와 소멸자(destructor)란 무엇인가?

  • 생성자(constructor)
    C++에서 객체를 생성할 때 생성자가 사용된다.
- 클래스 이름과 동일한 이름을 가진다.
- 반환값이 없다.
- 객체가 생성될 때 자동으로 호출된다.
- 오버로딩이 가능하다.
- 기본 생성자(Default Constructor)는 매개변수가 없는 생성자를 의미한다. 클래스에 생성자가 정의되어 있지 않으면 자동으로 기본 생성자가 만들어진다.
이때 클래스에 생성자가 하나라도 선언되어있다면 기본 생성자는 자동으로 생기지 않아 오류가 발생할 수 있다.
  • 소멸자(destructor)
    C++에서 객체를 제거할 때 소멸자가 사용된다.
- 클래스 이름 앞에 ~를 붙여서 사용.
- 반환값이 없다.
- 객체가 소멸될 때 자동으로 호출된다.
- 오버로딩이 불가능하다.

- 구조체(struct)와 클래스(class)의 차이

[공통점]

- 구조체와 클래스 모두 데이터를 묶어서 표현하는 기능을 가지고 있다.
- 구조체와 클래스 모두 멤버 변수와 멤버 함수를 가질 수 있다.
- 구조체와 클래스 모두 상속을 지원한다.

[차이점]

- 구조체는 모든 멤버가 기본적으로 public으로 선언되며, 캡슐화 개념이 없다. 반면 클래스는 캡슐화를 기본 개념으로 삼으며, private 멤버로 선언된다.
- 구조체는 생성자를 가질 수 있지만, C와 유사한 방식으로 사용되며, 가상 메소드를 가질 수 없다. 반면 클래스는 생성자를 가질 수 있으며, 가상 메소드를 지원한다.
- C++에서 구조체는 C와의 호환성을 유지하기 위해 유지되었다. 따라서, 멤버 접근 제어 지시자를 변경하지 않았다. 반면 클래스는 객체지향적인 프로그래밍 방식을 지원하기 위해 새로운 키워드로 추가되었다.
- 클래스는 보다 복잡한 객체를 만들 수 있으며, 객체지향적인 접근 제어가 가능하다. 반면 구조체는 단순한 데이터의 묶음으로 사용되었다.
-> 따라서, 구조체와 클래스는 기본적으로 데이터를 묶는 기능을 가지고 있지만, 클래스는 캡슐화를 포함한 객체지향적인 개념을 더욱 강조하고, 보다 복잡한 객체를 구현할 수 있으며, 멤버 접근 제어가 가능하다. 반면 구조체는 단순한 데이터의 묶음으로 사용되고, C와의 호환성을 유지하기 위한 목적으로 사용된다.

[구조체(struct)와 클래스(class)가 비슷한 이유]

구조체는 C 언어에서 이미 사용되고 있었기 때문에, C++에서도 구조체를 사용하기로 결정되었다. 
또한, 클래스는 구조체에서 파생된 개념으로, C++에서 객체지향 프로그래밍의 핵심적인 개념 중 하나이다. 
클래스는 구조체와 같이 데이터를 묶을 수 있는 기능을 갖추고 있지만, 클래스는 캡슐화, 상속, 다형성 등의 객체지향 개념을 지원한다. 
이러한 개념을 통해 보다 복잡한 객체를 모델링하고, 객체간의 관계를 보다 명확하게 정의할 수 있다. 
따라서, 구조체와 클래스는 기본적으로 비슷한 개념이지만, 클래스는 객체지향 프로그래밍의 기능들을 더욱 확장한 것이라고 할 수 있다.

- C++에서 Virtual은 왜 존재하는가?

함수 앞에 virtual을 붙이면 가상 함수가 된다.

가상함수는 파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미한다. 즉 부모 클래스에서 선언한 함수가 자식 클래스에서 재정의할 것을 알려준다. 상속에서 오버라이딩 할 때 사용한다. 
바인딩은 프로그램 요소의 성격을 결정해주는 것이다. 이 과정이 컴파일 시점에서 이뤄지면 정적바인딩 실행도중에 이뤄지면 동적바인딩이다. C++에서는 기본은 정적바인딩이다. 
동적바인딩을 하기 위해 가상함수를 바꿔 선언하여 사용한다. 컴파일 시점에서 결정나기 때문에 가상함수를 사용하여 객체의 타입에 따라 멤버 함수를 선택한다. 가상 함수는 컴파일 시점에 바인딩이 이뤄지지 않고 보류상태로 둔다. 
동적바인딩을 사용하면 어떤 포인터에 의해 접근되었는 지에 상관없이 참조된 인스턴스의 실제 클래스형에 따라 재정의된 함수 호출이 가능하다. 

- 오버로딩(Overloding)과 오버라이딩(Overriding)

[오버로딩(Overloding)]

함수 중복 정의

오버로딩은 함수명이 같은 함수를 중복 정의 하는 것이다. 
파라미터 개수, 파라미터의 자료형에 따라 여러개의 같은 이름의 함수를 만들 수 있다.

[오버라이딩(Overriding)]

함수 재정의

오버라이딩은 상속 관계에서 함수 재정의할 때 사용한다. 
상속받았을 때 부모 클래스의 함수를 사용하지 않고 다른 기능을 실행할 때 함수를 자식클래스에 같은 이름, 같은 자료형으로 재정의 해서 사용한다. 

다음에 계속 -> [C++ 기술면접 대비(2)]

0개의 댓글