본문 바로가기

Development37

컴파일러의 컴파일과 링크 처리 과정 - 전처리기를 찾아서 값을 다 바꿔놓는다. (전처리 과정) - 헤더 파일들을 다 모아서 포함되어 있는 선언문들을 모은 후, 그 선언문들을 미리 정리해놓는다. (헤더 분석 과정) - 이때, 헤더가 없거나 하면 파일이 없다고 컴파일 에러가 난다. (컴파일 에러) - 코드 분석을 한다. 분석 전에는 이미 헤더 정리가 끝났으므로 분석에 필요한 테이블이 정리되어있다. - 코드 분석 중 알 수 없는 자료형이나 함수가 나타나면 링크 에러가 발생한다. undefined type .... (링크 에러) - 함수 분석 중 뒤에 이상한 문자가 오거나해서 이것이 함수인지, 무엇인지 헷갈릴때 컴파일 에러가 발생한다. (컴파일 에러) - 타입별로 단어 분석이 모두 끝나고 assembly 언어가 모두 준비되면 obj 파일이 생성된.. 2013. 12. 11.
가상함수 테이블의 메모리 구조 - 가상 함수를 하나 이상 포함하는 클래스의 경우 기본 가상함수 테이블이 생성된다. - 이후, 인스턴스 생성시 인스턴스용 가상함수 테이블이 생성된다. - 인스턴스가 여러개 생성시 메모리 절약을 위하여 여러 인스턴스가 동일한 가상함수 테이블을 가르키게 된다. - 이때, 인스턴스에서 오버라이딩된 가상함수가 없으면, 가상함수 테이블은 자동으로 부모클래스의 가상함수 정의를 참조하고, 오버라이딩된 가상함수가 있으면, 재정의된 가상함수 정의를 참조하게된다 - 가상함수 테이블은 런타임시 결합(동적 결합)되므로 시작시에는 같은 함수를 참조하고 있다가, 호출시에 함수의 주소가 동적할당된다. 일반 함수들은 미리 결합이 되는 정적 결합이다. - 가상 함수는 가상 함수의 포인터를 가지고 있어야 되므로 가상함수를 가진 클래스는.. 2013. 12. 11.
함수 오버라이딩(overriding)과 오버로딩(overloading) - C에서는 함수호출시 함수의 이름을 기준으로 호출을 하여 동일한 함수 선언이 불가능 하지만, C++에서는 함수호출시 함수 이름과 매개변수 선언 정보를 기준으로 호출하므로 동일한 이름의 전달 인자가 다른 함수를 만들 수 있다. 이를 함수 오버로딩이라 한다. - 상속관계에 있는 클래스간에 상위 클래스가 정의한 함수와 동일한 이름, 동일한 매개변수 선언을 가진 함수를 하위 클래스에서 재정의 하는 것을 함수 오버라이딩이라 한다. - 오버라이딩을 위해서는 함수에 virtual 키워드를 붙여서 가상 함수로 만들어야한다. - 만일 상속관계에 있는 클래스 사이에서 상위 클래스에 동일한 함수가 있을때, 하위 클래스에서 매개 변수 선언이 틀린 함수를 재정의하면, 재정의가 되지 않고, 오버로딩이 되어 다른 함수로 인정된다. 2013. 12. 11.
virtual - 하나 이상의 가상함수를 가지고 있는 클래스가 있을 경우 컴파일러는 가상함수 테이블을 만든다. - 이 가상함수 테이블은 실제 객체가 참조하고 있는 함수의 포인터를 가지고 있다. - C++에서는 객체의 함수 호출시 객체 자료형에 따른 함수 호출을 하는데, 함수에 virtual 키워드 붙어있을 경우 이 가상함수 테이블을 참조해서 함수를 호출하게 된다. - 즉, virtual 함수는 가상 함수 테이블이라는 함수 포인터 배열을 참조하여 실제 객체가 가르키는 함수를 호출할 수 있게 해준다. - 상속, 오버라이딩으로 대표되는 객체 지향적 프로그래밍의 핵심 키워드이다. 2013. 12. 11.