절차적 프로그래밍과 객체 지향의 차이
절차지향은 순차적인 처리를 중요시합니다. 컴퓨터 처리 구조와 비슷하므로 상대적으로 빠르지만 유지보수가 힘듭니다.
객체지향은 데이터와 동작을 묶어서 생각하고, 코드의 재사용과 유지보수가 쉽다는 장점이 있습니다. 또한, 객체지향은 캡슐화 상속성 추상화 다형성의 4가지 특징이 있습니다.
객체지향의 4가지 특징
캡슐화, 다형성, 상속성, 추상화입니다.
캡슐화는 객체 스스로가 자신의 상태를 책임지며, 해당 객체의 역할 수행에 집중할 수 있도록 자율성을 높이는 방식을 뜻합니다.
상속성은 부모 클래스가 자식 클래스에게 속성과 기능을 물려주어 부모 클래스의 속성과 기능을 동일하게 사용하는 방식입니다.
상속은 자신의 멤버 변수와 멤버 함수를 자식 클래스에게 물려주는 것입니다. 부모 클래스의 모든 멤버들을 자식 클래스가 물려 받습니다. 자식 클래스가 부모 클래스의 속성을 재사용합니다.
추상화는 대상의 특성 중 필요한 공통점만 다루어, 현실의 복잡성을 극복해 목적에 집중할 수 있도록 합니다.
다형성은 객체들의 타입이 다르면 똑같은 함수를 호출해도 서로 다른 동작을 수행합니다. 하나의 코드로 다양한 타입의 객체를 처리할 수 있는 기술입니다.
C++ 의 빌드 과정
빌드과정은 전처리, 컴파일러, 어셈블러, 링커로 진행됩니다.
전처리는 코드의 주석을 제거해 define을 치환하는 기능을 합니다. 컴파일러는 어셈블리 파일로 변환해 어셈블러에서 오브젝트 파일로 변환시킵니다. 오브젝트는 0과 1로 이루어진 코드를 의미합니다. 링커에서 오브젝트 파일들을 묶어서 실행 코드 파일로 변환합니다. 운영체제가 로딩할 수 있도록 주소 정보를 할당한 파일을 만들어 냅니다. 번역된 파일을 하나로 연결해 실행 가능한 파일로 만들어 줍니다.
생성자(Contructor)와 소멸자(Destructor)는 무엇인가요?
C++에서 객체를 생성하거나 제거할 때 생성자와 소멸자가 사용됩니다.
생성자를 이용해 객체를 생성함과 동시에 멤버 변수를 초기화 할 수 있습니다. 생성자는 특별한 메소드로 클래스 이름과 동일한 이름으로 구현됩니다.
생성자를 구현하지 않는다면 객체를 생성할 때 Default로 멤버 변수를 NULL로 초기화 됩니다. 또한 생성자는 입력 매개변수를 다르게함으로써 중복 정의할 수 있습니다.
소멸자는 객체를 더 이상 사용하지 않을 때 객체를 제거하기 위해 호출되는 함수 입니다. 객체의 메모리 반환을 위해 사용합니다.
C++에서 Default Constructor는 무엇을 의미하나요?
기본 생성자는 객체를 생성할 때 매개 변수를 선언하기 위해 생성자가 필요합니다. 이때 생성자가 없는 경우 컴파일러에 의해 자동적으로 생성자를 default constructor라고 합니다. 이때 클래스에 생성자가 하나라도 선언되어 있다면, default constructor는 자동으로 생기지 않아 오류가 발생할 수 있습니다.
구조체(Struct)와 클래스(Class)의 차이
구조체의 기본 지시자는 public, 클래스는 private입니다. C++ 에서는 동작 방식과 사용 방식이 차이가 없지만, C에서의 구조체는 오직 멤버 변수만을 담을 수 있습니다.
클래스(Class), 객체(Object), 인스턴스(Instance)의 차이
오버로딩(Overloading)과 오버라이딩(Over riding)의 차이
오버로딩은 같은 이름의 함수에 매개변수를 다르게 재정의하는 것을 말합니다. 파라미터 개수, 파라미터의 자료형에 따라 여러 개의 같은 이름의 함수를 만들 수 있습니다.
1) 오버라이딩은 상속 관계에 있는 클래스 간에 기초 클래스의 함수를 파생해 클래스에서 함수의 이름과 매개변수는 유지한 채 재정의 하는 것입니다.
2) 상속 받았을 때 부모 클래스의 함수를 사용하지 않고 다른 기능을 실행할 때 함수를 자식 클래스에 같은 이름, 자료형으로 재정의해서 사용합니다.
동적 바인딩과 정적 바인딩
컴파일 타임에 호출될 함수가 결정되는 것을 정적 바인딩이라고 하며, 함수는 기본적으로 정적 바인딩 됩니다. 런타임에 호출될 함수가 결정되는 것을 동적 바인딩이라고 합니다.
동적 바인딩은 가상함수를 바꿔 선언해 사용합니다. 컴파일 시점에서 결정나기 때문에 가상함수를 사용해 객체의 타입에 따라 멤버 함수를 선택합니다. 가상 함수는 컴파일 시점에 바인딩이 이뤄지지 않고 보류 상태로 둡니다.
동적 바인딩을 사용하면 어떤 포인터에 의해 접근했는지 상관없이 참조된 인스턴스의 실제 클래스 형에 따라 재정의된 함수 호출이 가능합니다.
가상 함수(Virtual Funtion)
가상함수는 파생 클래스에서 재정의할 것으로 기대되는 멤버 함수를 의미합니다.
부모 클래스에서 선언한 함수가 자식 클래스에서 재정의할 것을 알려주며, 상속에서 오버라이딩할 때 사용됩니다.
가상함수(Virtual Funtion)의 동작원리
가상함수 테이블은 멤버 함수와 가상 함수가 함수의 식별자 정보를 담은 Key와 함수의 주소 정보를 담은 Value를 갖고 테이블을 구성합니다.
가상함수를 가진 클래스의 인스턴스가 가상 함수를 호출할 때, 가상 함수 테이블의 주소 값을 가지는 가상 포인터를 통해 주소를 참조 받으며, 주소의 가상 함수 테이블을 조사하여 호출한 함수 이름에 맞는 가상 함수를 호출합니다.
가상 소멸자를 사용해야 하는 이유
기초 클래스에 가상 소멸자가 선언되지 않고, 파생 클래스의 객체가 동적으로 할당 되었을때, 객체를 delete연산자에 의해 소멸자를 호출하면 파생 클래스의 소멸자가 아닌 기초 클래스의 소멸자만 호출하며 파생 클래스가 할당된 메모리가 정상적으로 해제되지 않습니다.
따라서 기초 클래스에 명시적으로 소멸자를 선언할 필요가 없더라도, 아무 일도 하지 않는 가상 소멸자를 선언해야합니다.