Chapter 01. C 언어 기반의 C++ 1 정충교 )
강좌 운영 2 선수과목 컴퓨터프로그래밍 1(100811) 컴퓨터프로그래밍 2(100812) 교재 열혈 C++ 프로그래밍, 인피니티북스, 윤성우저 평가 중간 : 25%, 기말 : 35%, 출석 ( 출석 및 실습문제 데모 ): 30%, 확 인문제풀이 노트 : 10% 강의 중 문제풀이 ( 문제풀이를 위한 개인노트를 준비해야 함 – 문제풀이 노트 평가 2 회 )
강사 3 담당교수 정충교 컴퓨터학부 연구실 호 조교 이남세 컴퓨터학부 연구실 호 홈페이지
수업 시간, 장소 4 이론 강의 월요일 오후 1 시 – 2 시 50 분 공 호 실습 수요일 오후 3 시 – 4 시 50 분 공 호
확인문제와 실습문제 매 강의 끝에 확인문제와 실습문제가 주어짐 확인문제는 이론강의 시간 후반부에 노트에 손으로 프로그램을 작성함 실습 문제는 실습시간에 완성하여 검사를 받아야 함 실습시간 내에 실습문제 전체를 완성하여 검사를 받지 못하는 경우 목요일 저녁 6 시까지 프린트물 ( 프로그램 코드와 실행 결과 ) 을 5 층 과제 제출함에 제출해야 함 ( 그 이후에는 받지 않음 ) 실습시간에 실습문제 중 일부만을 검사하지 않음 ( 전체를 검사 받거나 전체를 프린트물로 제출해야 함 ) 5
Chapter printf 와 scanf 를 대신하는 입출력 방식
C++ 버전의 Hello World 출력 프로그램 헤더파일의 선언 #include 출력의 기본구성 std::cout<<‘ 출력대상 1’<<‘ 출력대상 2’<<‘ 출력대상 3’; 개행의 진행 std::endl 을 출력하면 개행이 이뤄진다. 예제를 이해하려 들지 말고 관찰하자. 그리고 위의 세 가지 사실을 확인하자. 예제를 통해서 확인할 사실 몇 가지 실행결과 C 언어에서는 출력의 대상에 따라 서식지정을 달 리했지만, C++ 에서는 그러한 과정이 불필요하다. 8
scanf 를 대신하는 데이터의 입력 입력의 기본구성 std::cin>>’ 변수 ’ 변수의 선언위치함수의 중간 부분에서도 변수의 선언이 가능하다. 예제를 통해서 확인할 사실 몇 가지 출력에서와 마찬가지로 입력에서도 별도의 서식 지정이 불필요하다. C++ 에서는 변수의 선언위치에 제한을 두지 않는다. 실행결과 9
C++ 의 지역변수 선언 이렇듯 연이은 데이터의 입력을 명령할 수 있다. for 문 안에서도 변수의 선언이 가능하다. std::cin 을 통해서 입력되는 데이터의 구분은 스페이스 바, 엔터, 탭과 같은 공백을 통해서 이뤄 진다. 실행결과 10
Chapter 함수 오버로딩 (Function Overloading)
함수 오버로딩의 이해 C++ 은 함수호출 시 ‘ 함수의 이름 ’ 과 ‘ 전달되는 인자의 정보 ’ 를 동시에 참조하여 호출할 함수를 결정한다. 따라 서 이렇듯 매개변수의 선언이 다르다면 동일한 이름의 함수도 정의 가능하다. 그리고 이러한 형태의 함수정의 를 가리켜 ‘ 함수 오버로딩 (Function Overloading)’ 이라 한다. 12
함수 오버로딩의 예 매개변수의 자료형이 다르므로 함수 오버로딩 성립 매개변수의 수가 다르므로 함수 오버로딩 성립 반환형의 차이는 함수 오버로딩 의 조건을 만족시키지 않는다. – 컴파일되지 않음 ! 13
Chapter 매개변수의 디폴트 값
매개변수에 설정하는 ‘ 디폴트 값 ’ 의 의미 인자를 전달하지 않으면 7 이 전달된 것으로 간주한다. 여기서의 디폴트 값은 7! 따라서 이 함수를 대상으로 하는 다음 두 함수의 호출은 그 결과가 같다. MyFuncOne( ); MyFuncOne(7); 인자를 전달하지 않으면 각각 5 와 7 이 전달된 것으로 간주한다. 따라서 이 함수를 대상으로 하는 다음 두 함수의 호출은 그 결과 가 같다. MyFuncTwo( ); MyFuncTwo(5, 7); 15
디폴트 값은 함수의 선언에만 위치 함수의 선언을 별도로 둘 때에는 디폴트 값의 선언을 함수의 선 언부에 위치시켜야 한다. 컴파일러는 함수의 디폴트 값의 지정여부를 알아야 함수의 호출 문장을 적절히 컴파일 할 수 있다. 16
부분적 디폴트 값 설정 전달되는 인자가 왼쪽에서부터 채워지므로, 디폴트 값은 오른쪽에서부터 채워져야 한다. 전달되는 인자가 왼쪽에서부터 채워지므로, 오른쪽이 빈 상태로 왼쪽의 매개변수에만 일부 채워 진 디폴트 값은 의미를 갖지 못한다. 따라서 컴파일 에러를 일으킨다. 매개변수의 일부에만 디폴트 값을 지정 하고, 채워지지 않은 매개변수에만 인자 를 전달하는 것이 가능하다. 17
Chapter 인라인 (inline) 함수
매크로 함수의 장점과 함수의 inline 선언 선행처리 결과 정점. 함수가 인라인화 되어 성능의 향상으로 이어질 수 있다. 단점. 함수의 정의 방식이 일반함수에 비해서 복잡하다. 따라서 복잡한 함수의 정의에는 한계가 있다. 매크로 함수의 정점은 취하고 단점은 보완한 것이 C++ 의 인라인 함수이다. 실행결과 함수를 inline 으로 선언하면 컴파일러는 이 함수를 가능하면 인라인코드로 처리한다. 성능을 위해 컴파일러는 inline 선언 함수를 인라인처리하지 않을 수 있고, inline 선언 없는 함수도 인라인처리할 수 있다. 19
인라인 함수에는 없는 매크로 함수만의 장점 매크로 함수는 자료형에 독립적이다. inline 선언된 함수를 위의 형태로 호출하려면, 각 자료형 별로 함수가 오버로딩 되어야 한다. 즉, 매크로 함수와 달리 자료형에 독립적이지 못하다. inline 함수를 자료형에 독립적으로 선언하는 방법 ! 템플릿을 학습할 때 배우게 됨 20
Chapter 이름공간에 대한 소개
이름공간의 기본원리 BestComImpl 이라는 이름의 공간 ProgComImpl 이라는 이름의 공간 존재하는 이름공간이 다르면 동일 한 이름의 함수 및 변수를 선언하 는 것이 가능하다. 이름공간 BestComImpl 에 정의된 SimpleFunc 의 호출 이름공간 ProgComImpl 에 정의된 SimpleFunc 의 호출 이름공간 - 프로젝트의 진행에 있어서 발생할 수 있는 이름의 충돌을 막아줌 범위 지정 연산자 22
이름공간 기반의 함수 선언과 정의의 분리 이름공간 BestComImpl 에 위치하는 함수 SimpleFunc 의 선언과 정의의 분리 이름공간 ProgComImpl 에 위치하는 함수 SimpleFunc 의 선언과 정의의 분리 23
동일한 이름공간 내에서의 함수호출 선언된 이름공간의 이름이 동일하다면, 이 둘은 동일한 이름공간으로 간주한다. 즉, SimpleFunc 와 PrettyFunc 는 동일한 이름 공간안에 존재하는 상황이다. 이름공간을 명시하지 않고 함수를 호출하면, 함수의 호출문이 존재하는 함수와 동일한 이름 공간 안에서 호출할 함수를 찾게 된다. 따라서 SimpleFunc 함수 내에서는 이름공간을 명시하 지 않은 상태에서 PrettyFunc 함수를 직접호출 할 수 있다. 24
이름공간이 다른 이름공간을 포함 이름공간 Parent 이름공간 Parent::SubOne 이름공간 Parent::SubTwo Parent::SubOne::num Parent::num Parent::SubTwo::num 이름공간은 다른 이름공간을 포함할 수 있다. 따라서 계층적 구조를 갖게끔 이름공간을 구성할 수 있다. 25
std::cout, std::cin, std::endl 에 선언되어 있는 cout, cin 그리고 endl 은 이름공간 std 안에 선언되어 있다. 이렇듯 이름충돌을 막기 위해서, C++ 표준에서 제공하는 다양한 요소들은 이름공간 std 안에 선언되어 있다. 26
using 을 이용한 이름공간의 명시 이후부터 cin, cout, endl 은 std::cin, std::cout, std::endl 을 의미한다는 선언 이름공간 std 에 선언된 함수와 변수에는 std 라는 이 름공간을 적어주지 않고 바로 접근하겠다는 선언 너무 빈번한 using namespace 의 선언은 이름의 충돌을 막기위한 이름공간의 선언을 의미 없게 만든다. 따라서 제한적으로 사용할 필요가 있다. 27
이름공간의 별칭 지정과 전역변수의 접근 AAA::BBB::CCC 에 대해 ABC 라는 이름의 별칭 선언 후, 위와 같이 하나의 별칭으로 이름공간의 선언을 대신할 수 있다. 범위지정 연산자는 지역변수가 아닌 전역변수의 접근에도 사용이 가능하다. 28
확인 문제 29 반지름이 a, 높이가 b 인 원통의 부피를 구하는 함수를 작성하고 사용 자로부터 원통의 a, b 값을 입력받아 그 부피를 출력하는 main 함수를 작성하시오. 원주율 pi 는 3.14 로 근사하시오. a, b 는 double 타입으로 선언하시오. 함수의 이름은 CylinderVolume 으로 하시오. 파라미터 a, b 의 기본 값은 1 로 하시오.
실습 문제 30 실습 1 P 문제 3 번을 2 단부터 9 단까지 출력하도록 바꾸시오. 실습 2 P 문제 4 번에서 세금을 급여의 3% 부과한다면 판매원들에게는 실제 얼마가 지급되는지 계산하도록 바꾸시오.
실습 문제 31 실습 3 아래 코드는 숫자 5 와 문자 'b' 를 1 만큼 증가시킨 결과를 출력하는 프로그램입 니다. 이 프로그램에서 사용하고 있는 increment 함수를 오버로딩으로 구현하 시오. int main(void) { int number = 5; increment(&number); std::cout<<number<<std::endl; char character = 'b'; increment(&character); std::cout<<character<<std::endl; } P 코드를 참고하시오.
실습 문제 32 실습 4 P 문제 1 에서는 " 매개변수의 디폴트 값 지정 방식 " 으로 작성된 프로그 램을 " 함수 오버로딩 방식 " 으로 변경했습니다. 앞의 확인문제 ( 원통의 부피를 구하는 문제 ) 를 " 매개변수의 디폴트 값 지정 방식 " 과 " 함수 오버로딩 방식 " 으로 각각 구현하시오. " 매개변수의 디폴트 값 지정 방식 " 으로 프로그램할 때는 a, b 두 파라미터 모두에 디폴트 값을 지정하시오. main 함수는 아래와 같습니다. int main(void) { cout<<"[2, 3] "<<CylinderVolume(2, 3)<<endl; cout<<"[2, D] "<<CylinderVolume(2)<<endl; cout<<"[D, D] "<<CylinderVolume()<<endl; }
실습 문제 33 실습 5 P.41 NameSp3.cpp 는 하나의 파일로 작성되어 있습니다. 이를 P 에서 처럼 세 개의 파일로 구분하여 컴파일하고 실행하시오. 세 파일은 아래와 같아 야 합니다. 헤더파일 (Functions.h) – main 을 제외한 나머지 함수들의 프로토타입 선언 소스파일 1 (Functions.cpp) – main 을 제와한 나머지 함수들의 구현 소스파일 2 (Main.cpp) – main