Chapter 00. C++ 배경 박종혁교수 UCS Lab Tel: 970-6702 Email: jhpark1@seoultech.ac.kr SeoulTech 2019-2 nd 프로그래밍입문 (2)
2 프로그래밍과프로그래밍언어 2 프로그래밍언어 기계어 (machine language) 0, 1 의이진수로구성된언어 컴퓨터의 CPU 는본질적으로기계어만처리가능 어셈블리어 기계어의명령을 ADD, SUB, MOVE 등과같은상징적인니모닉기호 (mnemonic symbol) 로일대일대응시킨언어 어셈블러 : 어셈블리어프로그램을기계어코드로변환 고급언어 사람이이해하기쉽고복잡한작업, 자료구조, 알고리즘을표현하기위해고안된언어 Pascal, Basic, C/C++, Java, C# 컴파일러 : 고급언어로작성된프로그램을기계어코드로변환
3 사람과컴퓨터, 기계어와고급언어 35 + 56 =? 01010000 00101001 11101011 기계어 어셈블 LOAD AX 35 LOAD BX 56 ADD AX BX 어셈블리어 컴파일 int i; i = 35 + 56; C++
프로그래밍언어의진화와 C++ 의기원 Assembly 4 1954 Fortran 1958 Algol Martin Richards 1967 BCPL 1964 Basic Ken Tompson 1970 B Ken Tompson 과 Dennis Ritchie 1972 C 비야네스트롭스트룹 Bjarne Stroustrup 1983 C++ 1983 Objective-C 1987 Perl 1991 Visual Basic 1995 PHP 1995 Java 1995 Javascript 4 2000 C#
5 C 언어로부터의발전 절차지향 (Procedural Oriented Programming) 객체지향 (Object Oriented Programming)
6 C++ 언어의개발 C++ 는 1980 년대초에 AT&T 벨연구소의 Bjarne Stroustrup( 덴마크 ) 에의하여개발 C++ 는 C 언어를유지, 확장한것 C with Classes -> C++ C++ 는 C 언어에클래스개념을추가하고이어서가상함수, 연산자중복정의, 다중상속, 템플릿, 예외처리등이기능이차례로추가
7 C++ 의설계철학 엄격한타입검사, 범용언어, 효율적, 이식성 여러가지의프로그래밍스타일을지원 ( 절차지향프로그래밍, 데이터추상화, 객체지향프로그래밍, 일반화프로그래밍 ) 프로그래머가자유롭게선택할수있도록설계 최대한 C 와호환 플랫폼에의존적이거나일반적이지않은특징은제거
8 표준 C++ 프로그램의중요성 C++ 언어의표준 1998 년미국표준원 (ANSI, American National Standards Institute) C++ 언어에대한표준설정 ISO/IEC 14882 문서에작성됨. 유료문서 표준의진화 1998 년 (C++98), 2003 년 (C++03), 2007 년 (C++TR1), 2011 년 (C++11) 표준의중요성 표준에의해작성된 C++ 프로그램 모든플랫폼. 모든표준 C++ 컴파일러에의해컴파일 동일한실행결과보장 운영체제와컴파일러의종류에관계없는높은호환성 비표준 C++ 프로그램 Visual C++, Borland C++ 등컴파일러회사고유의비표준구문 특정 C++ 컴파일러에서만컴파일 호환성결여
9 Multi-Paradigm C++ 다양한프로그래밍패러다임지원으로모든문제를효과적으로해결 일반화, 객체지향, 메타템플릿프로그래밍을이용한코드의쉬운재활용 일반화 (Generic) 객체지향 (OOP) C++ 메타템플릿 C 언어의절차적특징과강력해진함수형디자인 절차적 (Procedural) 함수형 (Functional)
절차적프로그래밍 절차적프로그래밍에서는데이터보다는알고리즘 ( 절차 ) 을중시 10
11 절차적프로그래밍의단점 무조건적인점프문장 -> 난해
12 구조화프로그래밍 무조건적인점프없음 여전히데이터와알고리즘은분리되어있음
객체지향프로그래밍 객체지향프로그래밍에서는데이터와알고리즘이묶여있음 13
14 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법
객체지향의과정 15
16 객체지향의개념들 캡슐화 (encapsulation) 정보은닉 (information-hiding) 상속 (inheritance) 다형성 (polymorphism)
17 표준 / 비표준 C++ 프로그램의비교 표준 C++ 규칙에따라작성된 C++ 프로그램 표준 C++ 규칙에따라작성되지않는비주얼 C++ 프로그램 #include <iostream> int main() { std::cout << "Hello ; return 0; } 모든 C++ 컴파일러에의해컴파일 비주얼 C++ 전용키워드 #include <iostream> int cdecl main() { std::cout << "Hello"; return 0; } 볼랜드 C++ 컴파일러 비주얼 C++ 컴파일러 GNU C++ 컴파일러 볼랜드 C++ 컴파일러 비주얼 C++ 컴파일러 GNU C++ 컴파일러 실행파일 실행파일 실행파일 실행파일 실행파일 실행파일 컴퓨터 컴퓨터 "C declarator"
18 C++ 언어의주요설계목적 C 언어와의호환성 C 언어의문법체계계승 소스레벨호환성 - 기존에작성된 C 프로그램을그대로가져다사용 링크레벨호환성 C 목적파일과라이브러리를 C++ 프로그램에서링크 객체지향개념도입 캡슐화, 상속, 다형성 소프트웨어의재사용을통해생산성향상 복잡하고큰규모의소프트웨어의작성, 관리, 유지보수용이 엄격한타입체크 실행시간오류의가능성을줄임 디버깅편리 실행시간의효율성저하최소화 실행시간을저하시키는요소와해결 작은크기의멤버함수잦은호출가능성 -> 인라인함수로실행시간저하해소
19 C 언어에추가한기능 인라인함수 (inline function) 함수호출대신함수코드의확장삽입 함수중복 (function overloading) 매개변수의개수나타입이다른동일한이름의함수들선언 디폴트매개변수 (default parameter) 매개변수에디폴트값이전달되도록함수선언 참조와참조변수 (reference) 하나의변수에별명을사용하는참조변수도입 참조에의한호출 (call-by-reference) 함수호출시참조전달 new/delete 연산자 동적메모리할당 / 해제를위해 new 와 delete 연산자도입 연산자재정의 (operator overloading) 기존 C++ 연산자에새로운연산정의 제네릭함수와클래스 데이터타입에의존하지않고일반화시킨함수나클래스작성가능
20 C++ 객체지향특성 - 캡슐화 캡슐화 (Encapsulation) 데이터를캡슐로싸서외부의접근으로부터보호 C++ 에서클래스 (class 키워드 ) 로캡슐표현 클래스와객체 클래스 - 객체를만드는틀 객체 - 클래스라는틀에서생겨난실체 객체 (object), 실체 (instance) 는같은뜻 클래스 ( 객체를정의하는틀 ) 객체생성 객체들 - 실체 멤버들 class Circle { private: int radius; // 반지름값 public: Circle(int r) { radius = r; } double getarea() { return 3.14*radius*radius; } }; 원을추상화한 Circle 클래스 원객체들 ( 실체 )
21 C++ 객체지향특성 - 상속 객체지향상속 (Inheritance) 자식이부모의유전자를물려받는것과유사 C++ 상속 객체가자식클래스의멤버와부모클래스에선언된모양그대로멤버들을가지고탄생
22 C++ 객체지향특성 - 다형성 다형성 (Polymorphism) 多形性 하나의기능이경우에따라다르게보이거나다르게작동하는현상 연산자중복, 함수중복, 함수재정의 (overriding) 2 + 3 --> 5 남자 + 여자 --> 남자여자 redcolor 객체 + bluecolor 객체 --> purplecolor 객체 + 연산자중복 void add(int a, int b) {... } void add(int a, int b, int c) {... } void add(int a, double d) {... } add 함수중복 함수재정의 ( 오버라이딩 )
23 정리 ) C 와 C++ C C++ 프로그래밍방식구조적프로그래밍객체지향프로그래밍 프로그램분할방법기능객체 구현단위함수클래스 규모 중소형프로그램작성에적합 중대형프로그램작성에적합
24 참고문헌 C++ ESPRESSO, 천인국저, 인피니티북스, 2011 김용성의 C&C++ 완벽가이드 (2nd Edition), 영진출판사, 2011 명품 C++ Programming, 황기태, 생능출판사, 2018
Q&A 25