프로그래밍과 프로그래밍 언어
프로그래밍 언어
•
기계어 (Machine Language)
◦
0, 1의 이진수로 구성된 언어이다
◦
컴퓨터의 CPU는 본질적으로 기계어만 처리가 가능하다
•
어셈블리어
◦
기걔어의 명령을 ADD, SUB, MOVE 등과 같은 상징적인 니모닉 기호로 일대일 대응시킨 언어이다
•
고급언어
◦
사람이 이해하기 쉽고 복잡한 작업, 자료구조, 알고리즘을 표현하기 위해 고안된 언어
◦
Pascal, Basic, C/C++, JAVA, C#
◦
컴파일러
▪
고급언어로 작성된 프로그램을 기계어 코드로 변환
C++ 언어
표준
•
1998년 미국 표준원 (ANSI)
◦
C++ 언어에 대한 표준 설정
•
ISO/IEC 14882 문서에 작성됨
•
표준에 의해 작성된 C++ 프로그램
◦
모든 플랫폼, 모든 표준 C++ 컴파일러에 의해 컴파일
◦
동일한 실행 결과 보장
◦
운영체제와 컴파일러의 종류에 관계없는 높은 호환성
C++ 설계 목적
•
C언어의 문법 체계 계승
◦
소스 레벨 호환성
▪
기존에 작성된 C 프로그램을 그대로 가져다 사용
◦
링크 레벨 호환성
▪
C 목적 파일과 라이브러리를 C++ 프로그램에서 링크
•
객체 지향 개념 도입
◦
캡슐화, 상속, 다형성
◦
소프트웨어의 재사용을 통해 생산성이 향상
◦
복잡하고 큰 규모의 소프트웨어의 작성, 관리, 유지보수가 용이하다
•
엄격한 타입 체크
◦
실행 시간 오류의 가능성을 줄임
◦
디버깅이 편리하다
•
실행 시간의 효율성 저하를 최소화
◦
실행 시간을 저하시키는 요소와 해결
▪
작은 크기의 멤버 함수 잦은 호출 가능성 → 인라인 함수로 실행 시간 저하 해소
C언어에 추가한 기능
•
함수 중복 (Function Overloading)
◦
매개변수의 개수나 타입이 다른 동일한 이름의 함수들을 선언
•
디폴트 매개변수 (Default Parameter)
◦
매개변수에 디폴트 값이 전달되도록 함수를 선언
•
참조와 참조변수 (Reference)
◦
하나의 변수에 별명을 사용하는 참조변수 도입
•
참조에 의한 호출 (Call-by-Reference)
◦
함수 호출 시 참조 전달
•
new / delete 연산자
◦
동적 메모리 할당/해제를 위해 new와 delete 연산자를 도입
•
연산자 재정의
◦
기존 C++ 연산자에 새로운 연산 정의
•
제네릭 함수와 클래스
◦
데이터 타입에 의존하지 않고, 일반화시킨 함수나 클래스 작성이 가능하다
C++ 객체 지향 특성
캡슐화 (Encapsulation)
캡슐화
•
데이터를 캡슐로 싸서 외부의 접근으로부터 보호한다
•
C++ 에서 클래스 (Class 키워드)로 캡슐 표현
클래스와 객체
•
클래스 : 객체를 만드는 틀
•
객체 : 클래스라는 틀에서 생겨난 실체
•
객체 (Object), 실체(Instance) 는 같은 뜻
상속성 (Inheritance)
객체지향 상속
•
자식이 부모의 유전자를 물려 받는 것과 유사
C++ 상속
•
객체가 자식 클래스의 멤버와 부모 클래스에 선언된 모양 그대로 멤버들을 가지고 탄생
다형성 (Polymorphism)
다형성
•
하나의 기능이 경우에 따라 다르게 보이거나 다르게 작동하는 현상
•
연산자 중복, 함수 중복, 함수 재정의 (Overriding)
C++ 에서 객체 지향을 도입한 목적
1.
소프트웨어의 생산성 향상
•
소프트웨어의 생명주기 단축 문제 해결 필요
•
기 작성된 코드의 재사용 필요
•
C++ 클래스 상속 및 객체 재사용으로 해결
2.
실세계에 대한 쉬운 모델링
•
물체 혹은 객체의 상호작용에 대한 묘사가 필요
•
실세계는 객체로 구성된 세계
•
객체를 중심으로 하는 객체 지향 언어가 적합
객체지향언어
- 객체들을 정의하고, 객체들의 상호 관계, 상호작용으로 구현
C++ 과 제네릭 프로그래밍
제네릭 함수와 제네릭 클래스
•
제네릭 함수 (Generic Function)
◦
동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 함수
•
제네릭 클래스 (Generic Class)
◦
동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 클래스
•
template 키워드로 선언
◦
탬플릿 함수 혹은 템플릿 클래스라고도 부른다
•
Java, c# 등 다른 언어에도 동일한 개념이 있다
제네릭 프로그래밍 (Generic Programming)
•
제네릭 함수와 제네릭 클래스를 활용하여 프로그램을 작성하는 새로운 프로그래밍 패러다임
•
점점 중요성이 높아지고 있음
C++ 언어의 아킬레스
•
C++ 언어는 C언어와의 호환성을 추구한다
◦
장점 : 기존에 개발된 C프로그램 코드를 활용할 수 있다
◦
단점 : 캡슐화의 원칙이 무너진다
▪
C++에서 전역변수와 전역함수를 사용할 수 밖에 없다
▪
부작용 발생 염려
링킹 (Linking)
•
목적 파일끼리 합쳐 실행 파일을 만드는 과정
◦
목적 파일은 바로 실행할 수 없음
•
목적 파일과 C++ 표준 라이브러리의 함수를 연결, 실행 파일을 만드는 과정
프로그램 실행과 디버깅
•
실행 파일은 독립적으로 바로 실행이 가능하다
•
실행 중에 발생하는 오류
◦
원하는 결과가 나오지 않거나 실행 중에 프로그램의 비정상 종료
•
디버깅
◦
실행 중에 발생한 오류를 찾는 과정
◦
디버거
▪
디버깅을 도와주는 프로그램
◦
소스 레벨 디버깅
▪
C++ 소스를 한 라인씩 실행하고, 변수 값의 변화를 보면서 오류 발견
▪
비주얼 스튜디오는 소스 레벨 디버깅을 지원한다
C++ 표준 라이브러리
•
C++ 표준 라이브러리는 3개의 그룹으로 구분한다
◦
C 라이브러리
▪
기존 C 표준 라이브러리를 수용, C++에서 사용할 수 있게 한 함수들
▪
이름이 c로 시작하는 헤더 파일에 선언됨
◦
C++ 입출력 라이브러리
▪
콘솔 및 파일 입출력을 위한 라이브러리
◦
C++ STL 라이브러리
▪
제네릭 프로그래밍을 지원하기 위한 템플릿 라이브러리