본문 바로가기

Dev Language26

Is a, Has a 관계 & 상속 Is – a와 Has – a 관계 Fruit 클래스에는 과일의 무게와 칼로리 열량을 저장할 수 있다. 그리고 Fruit 클래스를 상속받는 Banana 클래스에는 Fruit 클래스 멤버들을 상속받을 수 있으므로 바나나 무게와 칼로리 열량을 저장하는 멤버들을 가질 것이다. 또한 일반적으로 과일에는 적용되지 않고 바나나에만 적용되는 바나나 연구소 껍질 지수와 같은, 새 멤버들을 Banana 클래스에 추가할 수 있다. 파생 클래스에 새로운 기능도 추가할 수 있으므로 그 관계를 is-a-kind-of로 표시하는 것이 더 정확하겠지만, 흔히 is-a 관계라는 말을 사용한다. 가장 일반적인 public 상속은 has-a 관계를 나타내지 않는다. 예를 들어, 점심이 과일을 가질 수는 있지만 일반적으로 점심은 과일이 아.. 2016. 12. 23.
참조 변수 & 복사 생성자 참조 변수 C++에 추가된 새로운 복합형, 참조(reference)는 미리 정의된 어떤 변수에 실제 이름대신 쓸 수 있는 대용 이름이다. 참조의 주된 용도는 함수의 형식 매개변수에 사용하는 것이다. 큰 구조체를 처리해야 하는 함수에서 포인터 대신 참조를 사용할 수 있다. void swap(int x, int y){ // 두 매개변수의 값을 서로 바꿔주는 기능 구현 } int a = 10, b = 20; swap(a, b); - 위와 같이 선언하면 메모리 상에서 swap 함수가 호출될 때, 스택에 int x와 y를 생성하고 a와 b에 들어있는 값 10,20을 복사해서 사용함. 따라서 swap 함수 호출 이후에 cout 2016. 12. 6.
if문과 switch문 if문과 switch 문의 차이점 비교 조건이 일정 개수일 때까지는 if문이 빠르고 조건이 많아지면 switch문이 더 빠른 것이 일반적이다. switch문은 내부적으로 점프 테이블이 있어서 개수가 많을 수록 유리하지만, 최근에는 if문에 대한 최적화가 잘 되어 있어서 if문이 빠르다. -> Test ; Debug 모드에서는 switch 문이, Releas 모드에서는 if문이 더 빨랐다. 2016. 12. 6.
함수 오버로딩 함수 오버로딩 C++은 오버로딩 된 함수들 중 어느 것이 어느 것인지 어떻게 추적할까? C++은 각각의 함수들에 비밀 증명을 발급한다. 프로그램을 작성하여 컴파일하기 위해 C++ 개발 도구의 편집기를 사용하면, C++ 컴파일러는 사용자를 대신하여 이름 장식 또는 이름 맹글링(NAME MANGLING)이라는 마술을 부린다. 그것은 함수 원형에 지정되어 있는 형식 매개변수의 데이터 형을 기반으로 각각의 함 수 이름을 암호화하는 것이다. 예를 들어 long MyFunctionFoo(int, float); 이라는 이름 장식이 되어있지 않은 함수 원형이 있다면, 컴파일러는 스스로의 용도를 위해 이 형식을 ?MyFunctionFoo@@YAXH@Z 라고 내부 형식으로 변환한다. 이렇게 겉보기 장식을 통해 매개변수의 .. 2016. 12. 6.
배열과 포인터 배열 중요한 것은, 배열을 선언하면 내부적으로 포인터와 동일하게 작동한다는 것이다. 그래서 포인터 표기 *과 배열 표기[]는 거의 동일하게 사용할 수 있다. 예를 들어 int pt[3] = { 0 }; 으로 선언하면 pt[0] 과 *pt는 같은 값이다. pt[1]과 *(pt+1)은 같은 값이다. - 일반 변수를 함수의 매개변수로 사용하면 함수는 전달된 값의 복사본을 갖고 작업을 한다. 하지만 배열을 매개변수로 전달하면, 배열의 복사본을 생성하여 작업을 하는 것이 아니라 배열의 주소, 즉 포인터를 전달하여 배열의 원본을 가지고 작업한다. - 배열의 주소를 매개변수로 사용하는 것은 전체 배열을 복사하는 것보다 시간과 메모리를 절약한다. 복사본을 사용하는 것은 배열이 클 경우에는 부담이 된다. 반면 원본을 대.. 2016. 12. 5.
함수 원형이 필요한 이유 함수 원형이 필요한 이유 함수 원형은 컴파일러에게 함수의 인터페이스를 알려준다. 예를 들어 double cube(double x); 라는 함수 원형이 있고, main 안에서 double volume = cube(side); 로 선언이 되어있을 때, 1) 함수 원형은 cube()가 하나의 double형 매개변수를 가진다는 사실을 컴파일러에게 알려준다. 따라서 프로그램이 cube()에 매개변수를 제공하는 데 실패하면, 컴파일러는 함수 원형에 근거하여 에러를 검출한다. 2) cube()함수는 계산을 끝냈을 때 리턴 값을 (CPU의 레지스터나 메모리의) 어떤 지정된 위치에 넣는다. 그러면 호출한 함수(여기서는 main)가 그 위치에서 값을 꺼내온다. cube()가 double형 이라는 사실을 함수 원형이 컴파일.. 2016. 12. 5.