본문 바로가기

객체지향

(14)
추상화와 인터페이스 4. 추상화추상화란 공통의 속성이나 기능을 묶어 이름을 붙이는 것을 말한다. 예를 들어 걷는다, 뛴다, 달린다, 날라간다라는 기능들을 "움직인다"라는 고통의 속성으로 묶어서 추상화할 수 있다. 객체중심의 안정된 모델을 구축하고, 현실세계를 자연스럽게 표현할 수 있다는 장점이 있다. 1)추상메서드 : 내용이 없는 메서드, 구현은 하지 않고 선언만한다. 메서드의 내용이 너무 일반적인 내용이라서 부모 클래스에서 구체화하여 정의할 필요가 없는 경우, 추상 메서드로 선언만하고 상속받은 자식 클래스에서 재정의하도록 할 때 사용한다. 2)추상클래스 : 한 개 이상의 추상 메서드를 포함하는 클래스를 말한다. 일반클래스는 세부적이고 구체적인 것에 반해서 추상클래스는 구체적이지 않고 추상적이다. 추상메서드는 선언만되고 구..
객체지향 알아 둘 것 Q>가상함수 :C++의 가상함수 동작원리는 ? 가상 함수는 'vtable' 혹은 가상 테이블(virtual table)에 의존한다. 어떤 클래스의 함수가 virtual로 선언되어있으면 해당 클래스의 가상 함수 주소를 보관하는 vtable이 만들어진다. 컴파일러는 또한 해당 클래스의 vtable을 가리키는 vptr이라는 숨겨진 변수 (hidden variable)를 해당 클래스에 추가한다. 하위클래스가 상위 클래스의 가상 함수를 오버라이드 하지않으면 하위 클래스의 vtable은 상위 클래스의 가상 함수 주소를 보관한다. 이 vtable을 사용하여 가상 함수가 호출 될때 어느 주소에 있는 함수가 호출되어야하는지를 결정한다. c++의 동적 바인딩은 이가상테이블 메커니즘을 사용하여 실행된다. 따라서 하위클래스 ..
포인터와 참조 포인터(pointer) : 변수의 주소를 담는 변수 =>변수의 값을 읽거나 변경하는 등, 변수에 적용 가능한 연산은 모두 포인터를 통해 할수 있다=>두 포인터가 같은 주소를 가리키는 경우에 한 포인터가 가리키는 변수의 값을 변경하면 다른 포인터가 가리키는 변수의 값도 바뀐다. Q> 면접관이 어떤 자료구조를 메모리에 올리기 위해 필요한 메모리의 크기를 자주묻기 때문에 유의 해야 할 점 ! 포인터 변수의 크기는 아키텍처에 따라 달라진다. 32비트 컴퓨터에서는 32비트가 되고, 64비트 컴퓨터에서는 64비트가 된다. 참조 : 기존에 존재하는 객체에 붙는 또 다른 이름이며 별도의 메모리를 갖지 않는다. 2번째 줄에서 b는 a의 참조로 선언 되었다. 따라서 b를 변경하면 a도 바뀐다. 참조 대상 메모리가 어디인지..
가상소멸자 따라서 , Student에 배정된 메모리가 제대로 반환되지 않을 수 있으므로 문제가 발생할 수 있다 .이 문제를 고치기위해서, Person의 소멸자를 가상 소멸자로 선언하면 된다. 출처:코딩 인터뷰 189가지 프로그래밍 문제와 해법 완전분석(프로그래밍 인사이트 )
가상함수 Q> 이런 결과가 나오는 이유 ? 왜냐하면 , aboutMe 함수가 어떤 타입인지는 컴파일 시간에 결정되기 때문이다. 이러한 메커니즘을 정적 바인딩 (static binding)이라고 한다 . Q>만일 Student 클래스에서 구현된 aboutMe를 호출하고 싶다면? => Person 클래스의 aboutMe 메서드를 virtual로 선언해야한다. //Virtual 가상함수를 통해 제일 하위 클래스의 aboutMe를 찾아 실행#include#includeusing namespace std; #define NAME_SIZE 50 //매크로 정의 class Person {int id;//모든 멤버는 기본적으로 privatechar name[NAME_SIZE]; public:virtual void aboutMe..
클래스와 상속 [1]의 경우 [2]의 경우 [3]의 경우 [4]의 경우 C++에서 모든 데이터 멤버와 메서드는 기본적으로 private 이다. public 키워드를 사용하면 그 값을 변경할 수 있다. #includeusing namespace std; #define NAME_SIZE 50 //매크로 정의 class Person {int id;//모든 멤버는 기본적으로 privatechar name[NAME_SIZE]; public:void aboutMe(){cout