126
C ++ 프프프프프 프프

C ++ 프로그래밍 시작

  • Upload
    evania

  • View
    108

  • Download
    1

Embed Size (px)

DESCRIPTION

C ++ 프로그래밍 시작. Introduce C++ Language. C++ 언어란 ? C++ 언어는 c 언어를 확장시킨 언어 C 언어의 함수 , 배열 , 포인터 , 구조체를 포함하여 모든 문법적인 부분을 그대로 사용할 뿐 아니라 일부 문법은 훨씬 사용하기 편하게 개선이 되었음 C 언어는 절차지향언어이지만 C++ 언어는 객체지향 언어 C++ 언어의 특징 확장자는 *.cpp 함수 중간에 변수 선언이 가능 cin, cout 등 객체를 이용한 입 ・출력을 제공한다 . - PowerPoint PPT Presentation

Citation preview

Page 1: C ++  프로그래밍 시작

C ++ 프로그래밍 시작

Page 2: C ++  프로그래밍 시작

Introduce C++ Language C++ 언어란 ?

C++ 언어는 c 언어를 확장시킨 언어 C 언어의 함수 , 배열 , 포인터 , 구조체를 포함하여 모든 문법적인 부분을 그대로

사용할 뿐 아니라 일부 문법은 훨씬 사용하기 편하게 개선이 되었음 C 언어는 절차지향언어이지만 C++ 언어는 객체지향 언어

C++ 언어의 특징 확장자는 *.cpp 함수 중간에 변수 선언이 가능 cin, cout 등 객체를 이용한 입・출력을 제공한다 . 메모리 구조는 c 언어와 동일함 구성환경은 c 언어와 동일

Page 3: C ++  프로그래밍 시작

C++ 언어의 탄생 및 역사 C++ 언어는 1980 년 벨 연구소의 Bjarne Stroustrup 에 의해 탄생 1980 년 당시에 C with class 라는 이름으로 발표되었으나 1983 년 C+

+ 로 변경되어 현재까지 사용되고 있음 1998 년 ANSI 산하 공인 표준 연구회에서 C++ 언어에 대한 국제 표준안

제정

Introduce C++ Language

Page 4: C ++  프로그래밍 시작

간단한 소스코드 작성

헤더 파일의 선언 -> #include <iostream> ∙ 출력의 기본구성 -> std::cout << [ 출력대상 1] << [ 출력대상 2] << [

출력대상 3] ∙ 개행의 진행 -> std::endl

C++ 간단한 소스코드

Page 5: C ++  프로그래밍 시작

iostream.h VS iostream iostream.h 헤더파일은 cin 과 cout 객체를 사용하기 위해 추가하는 헤더파일 iostream.h 는 과거의 표준방식을 따르겠다는 의미고 , iostream 은 현재의

표준방식을따르겠다는 의미임

cout 객체 cout 은 좌측 쉬프트 연산자 (<<) 뒤에 있는 데이터를 출력 출력하고자 하는 데이터의 타입을 지정하지 않아도 자체적으로 출력 출력 데이터가 여러 개인 경우 좌측 쉬프트 연산자 (<<) 로 구분

소스 코드 분석

Page 6: C ++  프로그래밍 시작

cin#include <iostream>

int main(void){

int val1;std::cout<<“ 첫 번째 숫자입력 : “;std::cin>>val;

int val2;std::cout<<“ 두 번째 숫자입력 : “;std::cin>>val2;

int result=val1+val2;std::cout<<“ 덧셈결과 : “<<result<<std::endl;

return 0; }

Cin 이라는 객체

C++ 에서는 변수의 선언위치에 제한을 두지 않는다 .

Page 7: C ++  프로그래밍 시작

cin 객체 cin 은 입력 받은 값을 우측 쉬프트 연산자 (>>) 뒤에 있는 변수에 저장 입력하는 데이터의 타입을 지정하지 않아도 변수의 타입에 맞게 자체적으로 입력 입력 데이터가 여러 개인 경우 우측 쉬프트 연산자 (>>) 로 구분

소스코드 분석

∙ 입력의 기본구성 -> std::cin >> [ 변수 ] ∙ 변수의 선언위치 -> 함수의 중간 부분에서도 변수의 선언이 가능

Page 8: C ++  프로그래밍 시작

std::endl 줄 바꿈을 수행하는 명령 '\n' 과 동일한 명령으로 출력버퍼를 비우는 기능이 포함 됨

소스코드 분석

Page 9: C ++  프로그래밍 시작

cin 과 cout 은 타입에 관계없이 자체적으로 입・출력이 가능

C 언어의 printf 나 scanf 처럼 서식문자를 사용하지 않음

cin 과 cout 을 이용한 입・출력의 특징 실수는 유효 자릿수까지 출력 , 경우에 따라 지수 형태로도 출력 char 형 포인터 입력 : 주소부터 차례대로 문자열을 저장한 후 맨 뒤에

널 문자 ('\0') 를 자동으로 추가 char 형 포인터 출력 : 주소부터 널 문자 ('\0') 이전의 문자열 출력 포인터에 저장 된 주소를 출력할 경우는 포인터 형이나 int 형으로 형

변환 우측 쉬트프 (>>) 로 문자열 입력 시 공백 문자 포함 문자열을 받을 수

없음 우측 쉬프트 연산자 (>>) 는 연속적인 데이터를 입력 받기 위해 공백을

입력의 끝으로 처리하기 때문

cin 과 cout 의 특징

Page 10: C ++  프로그래밍 시작

C++ 의 지역변수 선언#include <iostream>

int main(void){

int val1;int result = 0;std::cout<<“ 두 개의 숫자입력 : “;std::cin>>val1>>val2;

if(val1<val2){

for(int i=val1+1; i<val2; i++)result+=i;

}else{

for(int i=val2+1;i<val2;i++)result+=;

}

return 0; }

C++ 지역 변수

for 문 안에서도 변수의 선언이 가능하다 . for 문 지역변수

연이은 데이터의 입력을 명령 할 수 있다 .

Page 11: C ++  프로그래밍 시작

실습문제 1 C++ 언어를 사용 하여 구구단 프로그램 만들기

1. cout 과 cin 객체 사용 2. 단수를 입력 받아 3. 2~9 단 사이에 구구단을 출력 해주는 프로그램

Page 12: C ++  프로그래밍 시작

실습문제 2 C++ 언어를 사용 하여 문자열 개수 맞추기

문자열과 문자를 입력받는다 . 문자열에서 입력받은 문자의 개수가 몇 개인지

카운트 하는 프로그램을 작성해보자 .

Page 13: C ++  프로그래밍 시작

Function Overloading

Page 14: C ++  프로그래밍 시작

Function Overloading 함수 오버로딩이란 ?

C 언어는 함수 이름만으로 함수를 호출하기 때문에 같은 이름의 함수사용이 불가능

C++ 는 함수이름과 매개변수의 정보를 함께 가지고 호출하기 때문에 같은 이름의 함수 사용이 가능

함수 이름은 같지만 매개변수의 타입이나 개수가 다른 것을 함수 오버로딩이라 함

함수 오버로딩은 하나의 함수가 마치 여러 일을 하는 것처럼 정의할 수 있기 때문에 다형성 (polymorphism) 이 구현 됨

Page 15: C ++  프로그래밍 시작

함수 오버로딩의 이해int MyFunc(int num){

num++;return num;

}

Function Overloading

#include <iostream>

int main(void){

MyFunc(20); //MyFunc(int num) 함수의 호출

MyFunc(30,40); //MyFunc(int a,int b) 함수의 호출

return 0; }

int MyFunc(int a, int b){

return a+b;}

Page 16: C ++  프로그래밍 시작

함수 오버로딩

Function Overloading

Page 17: C ++  프로그래밍 시작

Function Overloading 예제

#include <iostream>void func( ){

std::cout<<“void 매개변수 함수입니다 .”<<std::endl;}void func(int a){

std::cout<<“int 변수 1 개 함수입니다 . “ <<std::endl;}void func(int a , int b){

std::cout<<“int 변수 2 개 함수입니다 .”<<std::endl;}void func(char a){

std::cout<<“char 변수 1 개 함수 입니다 .” <<std::endl;}

int main(void){

func( );func(10);func(10, 20);func(‘A’);return 0;

}

Page 18: C ++  프로그래밍 시작

실습 문제 1 함수 오버로딩을 사용하여 main 함수에서 필요로 하는 change 함수를 만들어 보도록 하라 .

#include <iostream>

int main(void){

int su1=10,su2=20;change(&su1,&su2);std::cout<<su1<<" "<<su2<<std::endl;

double dou1=10.1,dou2=20.1;change(&dou1,&dou2);std::cout<<dou1<<" "<<dou2<<std::endl;

char ch1='A',ch2='B';change(&ch1,&ch2);std::cout<<ch1<<" "<<ch2<<std::endl;

}

실행의 예

Page 19: C ++  프로그래밍 시작

실습 문제 2 함수 오버로딩을 사용하여 main 함수에서 필요로 하는 swap 함수를 만들어

보도록 하라 . #include <iostream>

int main(void){

int num1=20, num2=30;swap(&num1, &num2);std::cout<<num1<<‘ ‘<<num2<<std::endl;

char ch1=‘A’, ch2=‘Z’;swap(&ch1, &ch2);std::cout<<ch1<<‘ ‘<<ch2<<std::endl;

double dbl1=1.111, dbl2=5.555;swap(&dbl1, &dbl2);std::cout<<dbl1<<‘ ‘<<dbl2<<std::endl;return 0;

}

실행의 예

Page 20: C ++  프로그래밍 시작

Default Parameter

Page 21: C ++  프로그래밍 시작

디폴트 매개변수란 ? Default Parmeter 란 매개변수에 기본 값이 있는 함수를 말함 함수 호출 시 전달되는 값이 있으면 전달된 값으로 대체되고 전달되는

값이 없으면 자신의 기본 값을 사용하는 설정 함수 오버로딩과 마찬가지로 Default Parameter 또한 하나의 함수가

마치 여러 일을 하는 것처럼 정의할 수 있기 때문에 다형성(polymorphism) 이 구현 됨

Default Parameter

Page 22: C ++  프로그래밍 시작

#include <iostream>void func(int a = 10 , int b = 20){

std::cout<<" 첫번째 인자 : "<<a;std::cout<<" "<<" 두번째 인자 : "<<b<<std::endl;

}

int main(void){

func( ); // 디폴트 매개변수값으로 받음func(3); // 왼쪽 매개변수 디폴트값에 저장됨func(100, 200); // 디폴트 매개변수값에 덮어씌어 버림return 0;

}

Default Parameter

Page 23: C ++  프로그래밍 시작

Default Parameter 디폴트 매개변수의 규칙 1( 부분적 디폴트 값 )

매개변수의 디폴트 값은 오른쪽에서부터 차례대로 할당

※ 전달되는 인자가 왼쪽에서부터 채워지므로 , 오른쪽이 빈 상태로 왼쪽의 매개변수에만 일부 채워진 디폴트값은 의미를 갖지 못한다 . 따라서 컴파일 에러를 일으킨다 .

Page 24: C ++  프로그래밍 시작

Default Parameter 디폴트 매개변수의 규칙 2

함수 선언과 정의를 나눠 쓸 경우 디폴트 값은 선언 부에만 사용

Page 25: C ++  프로그래밍 시작

다음 함수의 문제점 찾기

실습문제 1

Page 26: C ++  프로그래밍 시작

inline 함수

Page 27: C ++  프로그래밍 시작

inline 함수란 ? 매크로 함수의 단점을 보완한 함수

Inline 함수의 특징 함수 호출에 의한 작업이 생략되어 프로그램 성능이 향상 함수 호출부마다 함수 정의부의 코드가 복사되기 때문에 전체 코드는

증가 매크로 함수의 처리는 전 처리기가 하지만 inline 함수의 처리는

컴파일러가 처리 함수의 크기가 작은 경우 활용 inline 함수의 코드 크기가 너무 큰 경우 컴파일러가 무시하기도 함

inline 함수

Page 28: C ++  프로그래밍 시작

매크로 함수#define SQUARE(x) ((x)*(x))int main(void){

std::cout<<SQUARE(5)<<std::endl;return 0;

}

int main(void){

std::cout<<((5)*(5))<<std::endl;return 0;

}

선행처리 결과( 매크로는 전처리기가 처리한다 .)

장점 . 함수가 인라인화 되어 성능의 향상으로 이어 질 수 있다 .단점 . 함수의 정의 방식이 일반함수에 비해서 복잡하다 . 따라서 복잡한 함수의 정의에는 한계가 있다 .

Page 29: C ++  프로그래밍 시작

inline 함수의 선언

inline 함수

Page 30: C ++  프로그래밍 시작

namespace

Page 31: C ++  프로그래밍 시작

Namespace Namespace 란 ?

이름 공간이라는 개념은 대형 프로젝트 내에서 이름 충돌을 막기 위한

도구로 일반적으로 규모가 작은 프로젝트 내에서는 거의 사용 되지 않음

Page 32: C ++  프로그래밍 시작

Example1 ( 함수의 이름의 충돌 )

Namespace

Page 33: C ++  프로그래밍 시작

Example2 ( 이름 충돌의 해결 )

Namespace

Page 34: C ++  프로그래밍 시작

Example2 분석

Namespace

존재하는 이름공간이 다르면 동일 한 이름의 함수 및 변수를 선언하는 것이 가능하다 .

범위 지정 연산자

Page 35: C ++  프로그래밍 시작

Namespace

이름 공간 기반의 함수 선언과 정의의 분리

Page 36: C ++  프로그래밍 시작

선언된 이름공간의 이름이 동일하다면 , 이둘은 동일한 이름공간으로 간주한다 . 즉 , Sim-pleFunc 와 PrettyFunc 는 동일한 이름 공간안에 존재하는 상황이다 .

동일한 이름 공간

Namespace

Page 37: C ++  프로그래밍 시작

이름공간을 명시하지않고 함수를 호출하면 , 함수의 호출문이 존재하는 함수와 동일한 이름공간 안에서 호출할 함수를 찾게된다 . 따라서 SimpleFunc 함수 내에서는 이름공간을 명시하지 않은 상태에서 PrettyFunc 함수를 직접 호출 할수 있다 .

동일한 이름 공간 내에서의 함수호출

Namespace

Page 38: C ++  프로그래밍 시작

이름 공간의 중첩

Namespace

Page 39: C ++  프로그래밍 시작

std::cout // 이름공간 std 에 선언된 coutstd::cin // 이름공간 std 에 선언된 cinstd::endl // 이름공간 std 에 선언된 endl

namespace std{

cout . . . . . cin . . . . . endl . . . . .

}

<iostream> 에 선언되어 있는 cout,cin,endl 은 이름공간 std 안에 선언되어 있다 .이렇듯 이름충돌을 막기 위해서 , C++ 표준에서 제공하는 다양한 요소들은 이름공간 std 안에 선언 되어 있다 .

Namespace

Page 40: C ++  프로그래밍 시작

using 을 이용한 이름공간의 명시

#include <iostream>namespace Hybrid{

void HybFunc(void){

std::cout<<“So simple function!”<<std::endl;std::cout<<“In namespace Hybrid!”<<std::endl;

}}int main( ){

using Hybrid::HybFunc;HybFunc( );return 0;

}

Namespace

이름공간 Hybrid 에서 Hyb-Func 를 찾아라 라는 일종의 선언이다 .

Page 41: C ++  프로그래밍 시작

using 을 이용한 cin,cout,endl 을 전역에 명시

std 안에서 cin,cout,endl 을 찾으라고 전역에 명시하는것과 같음

Namespace

Page 42: C ++  프로그래밍 시작

using 을 이용한 namespace std 를 전역 선언

Namespace

이름공간 std 에 선언된 모든 것에 대해 이름공간 지정의 생략

※ 하지만 빈번한 using names-pace 의선언은 이름의 충돌을 막기위한 이름공간의 선언을 의미 없게 만든다 .따라서 제한적으로 사용할 필요가 있다 .

Page 43: C ++  프로그래밍 시작

이름공간에 별칭 부여와 전역변수 접근

Namespace

Page 44: C ++  프로그래밍 시작

Example

Namespace

Page 45: C ++  프로그래밍 시작

Reference (참조자 )

Page 46: C ++  프로그래밍 시작

Reference 란 ? 기존에 선언된 변수에 붙이는 별칭

Reference

Page 47: C ++  프로그래밍 시작

Reference Reference 의 특징

Reference 는 선언 시 & 연산자를 사용 Reference 변수를 선언함과 동시에 초기화 해야 한다 . 상수는 초기화 할 수 없다 . Reference 의 데이터 형은 참조하는 변수의 데이터 형과 같아야

한다 . 참조 대상을 변경 할 수 없다 . 변수 하나에 여러 개의 Reference 를 적용할 수 있다 .

Page 48: C ++  프로그래밍 시작

Reference Reference 예제

Page 49: C ++  프로그래밍 시작

다시보는 call-by-value 와 call-by-ref-erence

Reference

Page 50: C ++  프로그래밍 시작

Reference Reference 를 이용한 Call by Refer-

ence

Page 51: C ++  프로그래밍 시작

Reference 실습문제 1

Page 52: C ++  프로그래밍 시작

Reference 실습문제 2 – 오버로딩을 사용하여 만들 것

Page 53: C ++  프로그래밍 시작

새로운 자료형 bool

Page 54: C ++  프로그래밍 시작

자료형 bool C++ 에서는 bool 형이라는 새로운 데이터 형을 제공 , 하지만

컴파일러의 지원여부에 따라 C 언어에서도 사용 할 수 있음 bool 형은 true 와 false 의 값을 갖는 1byte 데이터 형으로 참과

거짓을 판별

bool 자료형

Page 55: C ++  프로그래밍 시작

bool 자료형

Page 56: C ++  프로그래밍 시작

bool 자료형

Page 57: C ++  프로그래밍 시작

const

Page 58: C ++  프로그래밍 시작

const Const keyword 란 ?

변수를 상수처럼 사용하고자 할 때 사용함 변수 상수화와 포인터 상수화 , 레퍼런스 상수화로 구분 됨

변수 상수화 변수 앞에 const keyword 를 붙이면 상수화 됨 상수는 선언과 동시에 초기화 되어야 함

Page 59: C ++  프로그래밍 시작

const 포인터 상수화

데이터 형 앞에 const 가 선언된 경우 포인터에 저장된 주소로 간접 접근하여 값을 변경하려고 하면 오류 발생 ( 포인터가 가리키는 값의 변경이 안 됨 )

데이터 형 뒤에 const 가 선언된 경우 포인터에 저장된 주소를 변경하면 오류 발생 ( 단 , 이 경우 포인터가 가리키는 값의 변경은 가능 )

const 가 데이터 형 앞 , 뒤 둘 다 선언된 경우 포인터로 가리키는 값을 변경할 수 없으며 포인터에 저장된 주소도 변경 할 수 없음

Reference 상수화 Reference 선언 시 데이터 형 앞에 const 가 선언된 경우 , Reference

로 공유하는 변수의 값을 변경할 수 없음

Page 60: C ++  프로그래밍 시작

포인터 상수화 예제

const

Page 61: C ++  프로그래밍 시작

참조자 상수화 예제

실습예제

Page 62: C ++  프로그래밍 시작

멤버변수 상수화 클래스에서 멤버변수 선언 시 상수화 시킬 수 있음

멤버함수 상수화 클래스 내에 정의된 멤버함수를 상수화 시킬 수 있음

※아직 클래스의 개념을 모르고 있으므로 추후에 배우도록 함

const

Page 63: C ++  프로그래밍 시작

New & Delete ( 동적할당 )

Page 64: C ++  프로그래밍 시작

new / delete 연산자

new 연산자 malloc 함수에 비해 사용하기 간편함 형 변환을 하지 않아도 됨 생성자를 호출할 수 있음 ( 생성자는 뒤에서 다시 자세히

배우도록 함 )

delete 연산자 동적으로 할당된 메모리의 해제는 한 번만 가능

Page 65: C ++  프로그래밍 시작

new / delete 연산자

New / delete 연산자 사용 방법

Page 66: C ++  프로그래밍 시작

포인터를 사용하지 않고 힙메모리에 접근하기

new / delete 연산자

Page 67: C ++  프로그래밍 시작

실습문제

학생의 인원을 입력 받고 입력 받은 인원만큼의 메모리를 할당하여 학생의 이름 , 국어 ,영어 , 수학을 입력 받아

그대로 출력하는 프로그램을 만들어보자 .

Page 68: C ++  프로그래밍 시작

C++ 표준함수 호출하기

Page 69: C ++  프로그래밍 시작

C++ 의 표준헤더 : c 를 더하고 .h 를 빼라 .

C++ 의 표준헤더 사용

Page 70: C ++  프로그래밍 시작

OOP ( 객체지향 프로그래밍 )

Page 71: C ++  프로그래밍 시작

객체 지향 프로그래밍

객체지향 프로그램 (Object Oriented Programming) 가장 주목 받는 최근 프로그램 기법 중에 하나이다 . C#, Java,

VB, Delphi, Power Builder 등 현재 프로그램에서 주류를 이루는 대부분의 프로그램 언어들은 객체 지향 프로그램 기법을 지원한다 . 객체지향 프로그램이 등장하게 된 배경은 C 언어나 코볼 등의 언어는 절차지향 개발 방식이다 . 절차지향이란 함수를 중심으로 프로그램을 작성하는 언어로 구조적 프로그래밍 방식 (Structured Programming) 이라고 부른다 . 절차지향 개발 방식은 대량의 데이터를 함수로 나눠 순차적으로 처리할 때 적합한 프로그램이 방식이다 . 그러나 이 방식은 규모가 큰 기업 형 프로젝트에는 효율성이 떨어진다 . 즉 , 점차 프로그램의 규모가 커지면서 이에 적합한 개발 방법론으로 등장한 개념이 객체지향 프로그래밍 기법이다 .

Page 72: C ++  프로그래밍 시작

객체지향 프로그래밍의 논지 절차지향을 기반으로 한 모듈화 프로그래밍에는 대형 프로젝트를

진행함에 있어 코드의 관리 및 유지보수에 불편함이 따름 객체지향은 위에 따른 문제를 해결하기 위한 개발 방법론이자 코드관리 이론 모든 경우에 객체지향이 좋은 패러다임이라 단정 지을 수 없다 C++ 은 객체지향이 아닌 멀티패러다임을 지향

객체 지향 프로그래밍

Page 73: C ++  프로그래밍 시작

객체지향 프로그래밍은 현실을 모방한다 .

현실을 논리적으로 바꾼다고 생각 하면 된다 . ( 속성 과 기능으로 표현 가능 )

객체지향 프로그래밍의 단계별 진행 1. 물색 ( 대상선택 ) 2. 속성 설정 ( 변수 ) 3. 기능 설정 ( 함수 )

객체 지향 프로그래밍

Page 74: C ++  프로그래밍 시작

구조체 와 클래스

Page 75: C ++  프로그래밍 시작

Class 란 ? 객체지향 언어는 현실을 그대로 반영하여 프로그램의 세계로 옮긴 다는 것을 주요 기반으로 한다 . 이 때 , 현실에 있는 하나의 대상체를 제작하고자 하는 프로그램에 필요한 속성과 동작만을 추려내어 설계하여 정의한 문법을 class 라고 부르게 된다 . 현실에 있는 대상을 프로그램으로 옮기기 위해 쓰는 설계도라고 할 수 있다 . 메모리에 형성된 상태는 아니며 단순히 정의된 문법이다 .

객체란 ? 설계하여 생성된 class 를 바탕으로 만들어 낸 class 변수를

의미한다 . 메모리에 실제 형성되었으며 형성된 공간을 . 연산자를 통해 접근하여 사용할 수 있다 .

클래스 와 객체

Page 76: C ++  프로그래밍 시작

추상화란 ? class 를 설계하는 과정을 추상화라 한다 . 현실에 존재하는

특정 대상체의 속성과 동작을 추려내어 프로그램 안에 구축해나가는 설계과정을 의미하는 용어이다 .

클래스 용어

객체 (Object) : 클래스를 대상으로 생성된 변수 멤버 변수 : 클래스 내에 선언 된 변수 멤버 함수 : 클래스 내에 정의 된 함수

Page 77: C ++  프로그래밍 시작

구조체 와 클래스 C 언어에서는 struct 키워드를 이용해 관련 있는 변수들을 묶어

구조체로 정의 C++ 에서는 변수들과 함수들도 묶어 정의 할 수 있음 C++ 에서는 class 라는 키워드를 사용하여 클래스를 사용 클래스란 쉽게 구조체의 확장 버전이라 생각하기로 함

구조체 와 클래스

Page 78: C ++  프로그래밍 시작

구조체 와 클래스 클래스 예제

Page 79: C ++  프로그래밍 시작

정보은닉 과 캡슐화

Page 80: C ++  프로그래밍 시작

접근제어 지시자 구조체와 클래스의 차이점 중 하나 접근 제어 키워드는 public, protected, private 세 가지가

있음 protected 는 뒤의 상속부분에서 다시 배우도록 함

정보은닉

Page 81: C ++  프로그래밍 시작

정보은닉 정보은닉의 필요성

클래스 멤버 변수는 일반적으로 PRIVATE 영역에 저장한다 . 의도치 않은 외부 접근에 대한 오류를 방지하기 위함

캡슐화의 정의 하나의 객체는 독립적으로 완벽한 역할을 수행할 수 있어야 한다 . 내부에서 발생하는 경계 검사 등의 동작은 외부에서 알 필요가 없다 .

Page 82: C ++  프로그래밍 시작

캡슐화

※ 객체지향 프로그램은 데이터와 함수를 묶어 하나의 “블랙박스(black box)” 를 생성할 수 있는데 이를 캡슐화라 한다 . 즉 , 캡슐화란 객체에 데이터와 함수를 숨겨두고 인터페이스 통로를 입력하고 결과 값을 받는 것을 말한다 . 즉 , 객체를 사용하는 개발자 는 인터페이스만 알면 될 뿐 내부적인 동작은 알 필요가 없음을 말하는데 이 개념은 정보 은닉 (information hiding) 과도 연결된다 . 예를 들어 우리는 핸드폰 문자 전송 시 어떠한 원리로 문자가 전송 되는 지 알 필요가 없다 . 우리는 문자를 보내는 방법( 인터 페이스 ) 만 알면 내부적인 동작 방법은 알 필요가 없는 것이다 . 객체지향에서 캡슐화는 접근제어 (public, protected, private) 를 이용해 구현 할 수 있다 .

Page 83: C ++  프로그래밍 시작

실습예제

모니터 클래스를 만들어 보자

Page 84: C ++  프로그래밍 시작

1. 만든 Class 를 헤더파일로 복사해서 붙여 넣는다 .(ex. mon-itor.h)

2. main 소스에서 “monitor.h” 를 include 한다 .

하나의 대상을 클래스화 시켜 만들어 주면 그 클래스를 바탕으로 객체화 할수 있다 . 이것은 언제든지 재사용이 가능하며 공유 또한 가능하다 .

객체의 장점

Page 85: C ++  프로그래밍 시작

실습문제

오디오를 만들어서 오디오의 기능들을 만들어 보자getter , setter 함수로 만든다

1. track2. 볼륨값3. 브랜드값

Page 86: C ++  프로그래밍 시작

생성자 / 소멸자

Page 87: C ++  프로그래밍 시작

생성자 객체가 생성될 때 자동으로 호출되는 함수 일반적으로 객체가 제대로 동작할 수 있게 준비하는 역할 함수 이름은 클래스의 이름과 같아야 하며 return 값이 없음 일반 함수와 마찬가지로 오버로딩이 가능하다 .

소멸자 ( 파괴자 ) 객체가 소멸할 때 자동으로 호출되는 함수 일반적으로 객체가 사용한 내용을 정리하는 역할 클래스이름과 동일하게 짓되 앞에 tilde(~) 문자를 붙임 소멸자는 하나의 클래스에 하나 이상 존재할 수 없음

생성자 / 소멸자

Page 88: C ++  프로그래밍 시작

생성자 / 소멸자 생성자 및 소멸자 기본 예제

Page 89: C ++  프로그래밍 시작

생성자 / 소멸자

생성자 Overloading

Page 90: C ++  프로그래밍 시작

멤버변수 상수화 클래스에서 멤버변수 선언 시 상수화 시킬 수 있음 상수화 된 멤버변수는 선언하면서 초기화 되어야 하기 때문에

생성자에서 콜론 (:) 초기화를 이용하여 초기화해야 함

멤버함수 상수화 클래스 내에 정의된 멤버함수를 상수화 시킬 수 있음 멤버함수를 상수화 시키려면 함수명 뒤에 const키워드를 붙임 상수화 된 함수를 외부 정의 시 함수 선언부와 함수 정의부 모두 const 를 붙여야

함 상수화 된 멤버 함수의 특징

∙ 멤버변수의 변경 불가능

∙ 상수화 된 멤버함수만 호출 가능

∙ 멤버변수의 주소 리턴이 불가능

생성자 / 소멸자

Page 91: C ++  프로그래밍 시작

생성자 / 소멸자 생성자가 꼭 필요한 경우 - Initializer

멤버 변수 중에 const 변수가 있는 경우

Page 92: C ++  프로그래밍 시작

this

Page 93: C ++  프로그래밍 시작

this 포인터 this 는 자기 자신을 가리키는 (참조하는 ) 용도로 사용되는 포인터 자기 참조 포인터라고도 함

this

Page 94: C ++  프로그래밍 시작

this 포인터 this 는 멤버함수에 접근한 객체를 가르키는 포인터 이다 . 컴파일러가 자동으로 만들어 주는 포인터이다 .

this

main 에 Number a,b; 를 만든다고 가정을 할때 우리는 a 안에 num 이라는 변수를 메모리에 할당받고 b 안에 num 이라는 변수를 메모리에 할당 받는다 .하지만 멤버함수는 하나를 가지고 같이 쓴다 .

Page 95: C ++  프로그래밍 시작

this 포인터 사용

this

Page 96: C ++  프로그래밍 시작

static( 정적멤버 )

Page 97: C ++  프로그래밍 시작

정적멤버 클래스 내 static 을 붙여 선언한 멤버를 말 함 정적멤버는 클래스 내에 선언된 멤버지만 클래스의 멤버는 아님 정적멤버는 main 함수가 호출되기 전 메모리 공간에 올라가서 초기화되기 때문에 객체 생성과는 상관없이 사용할 수 있음

정적 멤버의 특징 ∙ 정적 멤버 외부 정의 시 static 키워드는 선언부에만 사용 ∙ 정적 멤버함수는 정적 멤버변수만 접근할 수 있음 ∙ 정적 멤버변수의 초기화는 멤버함수 내에서 할 수 없음

( 객체 생성 이전에 메모리가 할당되기 때문 )

정적멤버

Page 98: C ++  프로그래밍 시작

static 멤버변수 (클래스 변수 ) static 변수는 객체 별로 존재하는 변수가 아닌 , 프로그램 전체 영역에서 하나만존재하는 변수 프로그램 실행과 동시에 초기화되어 메모리에 할당

정적멤버

Page 99: C ++  프로그래밍 시작

정적멤버

Page 100: C ++  프로그래밍 시작

static 멤버함수 정적 멤버함수는 정적 멤버변수만 접근할 수 있음

정적멤버

Page 101: C ++  프로그래밍 시작

포인터 배열

Page 102: C ++  프로그래밍 시작

포인터 포인터란 메모리의 주소를 저장하기 위한 변수 포인터 또한 변수이기 때문에 포인터변수 라고 함

2 차원 포인터 싱글포인터 ( 포인터 ) 는 변수의 주소를 저장하기 위한 포인터라면 2 차원포인터 ( 더블포인터 ) 는 싱글포인터의 주소를 저장하는 포인터

포인터배열

Page 103: C ++  프로그래밍 시작

포인터 배열 포인터 배열이란 이름 그대로 포인터들의 배열을 말하는 것으로

같은 타입의 포인터가 여러 개 필요한 경우 포인터를 배열로 선언

포인터배열

Page 104: C ++  프로그래밍 시작

포인터배열

Page 105: C ++  프로그래밍 시작

배열이름과 포인터의 관계 배열의 이름은 배열의 시작 주소 값을 의미하는 ( 배열의 첫 번째 요소를 가리키는 )

포인터 단순히 주소 값이 아닌 포인터인 이유는 메모리 접근에 사용되는 * 연산이 가능하기

때문

포인터배열

Page 106: C ++  프로그래밍 시작

포인터 배열을 이용하여 다음 문제를 풀어보시오

실습문제

Page 107: C ++  프로그래밍 시작

상속

Page 108: C ++  프로그래밍 시작

상속 (Inheritance) 클래스의 상속은 클래스를 재사용 할 수 있게 함

※ 예를 들어 학생 , 교수 , 경찰을 구현한 세 개의 클래스가 있다고 하자 . 이 세 개의

클래스는 사람이라는 공통점으로 묶을 수 있다 . 이 경우 세 개의 클래스에 사람의

특징을 모두 구현하는 것이 아니라 사람 클래스를 만들어 세 개의 클래스가 사람클래스를 상속받게 할 수 있다는 것이다 . 공통점을 묶어 클래스로 구현하면 클래스

마다 중복되는 부분을 여러 번 정의하지 않아도 되기 때문에 추가 /삭제 / 수정 시

용이하며 , 새로운 클래스를 추가할 때 사람 클래스를 재사용할 수 있기 때문에효율적이다 .

상속

Page 109: C ++  프로그래밍 시작

HAS-A 포함관계

HAS-A 포함 A 는 B 를 포함한다 라는 뜻이다 . 포함 (Containment) 이란 재활용하고 싶은 클래스의 객체를 멤버 변수로 선언하는 방법이다 . 클래스에 포함되는 멤버의 타입에는 제한이 없으므로 다른 클래스의 객체도 당연히 멤버가 될 수 있다 C 에서 구조체가 다른 구조체를 포함할 수 있는 것과 개념적으로 동일하며 우리가 접근하기에 어려움 기법도 아니다 .

※ Entity 클래스와 Control 클래스가 있다 .

Page 110: C ++  프로그래밍 시작

실습예제

학생관리 프로그램을 만드는데 2 가지 클래스를

만들어 보자1. 학생클래스 (학생 정보 데이터베이스 ) - Entity 클래스2. 학생관리클래스 ( 출력 및 입력 ) – Control 클래스

Page 111: C ++  프로그래밍 시작

실습문제 1주제 : 포인트 관리 시스템

1. Has a 포함 관계로 만들것

2. Entity 와 컨트롤 클래스를 명확히 구분할것

entity 클래스 이름 : Silver Silver 멤버변수 : 이름 , 등급 , 포인트

Silver 멤버함수 : 컨스트럭터 , 디스트럭터 , 게터 , 세터 만들기 (이자포인트 게터 추가 )

---> 실버 등급은 2% 를 곱한값이 이자다 .

컨트롤 클래스 이름 : PntmgrPntmgr 멤버변수 : silver 등급을 10 명 관리할수 있는 포인터 배열 ,

인덱스 추가

Pntmgr 멤버함수 : 생성자 , 소멸자 , insertdata ,printdata

Page 112: C ++  프로그래밍 시작

출력결과 :

<< ======================information=======================>>이름 등급 포인트 이자포인트홍길동 silver 1000 20.0개똥이 silver 2000 40.0

실습문제 1 출력결과

Page 113: C ++  프로그래밍 시작

실습문제 2 실습문제 1 을 바탕으로 추가적으로 Gold 클래스를 만들어보자

-> Gold 클래스의 이자율은 3%(0.03) 이다 .

출력결과 :

<< ======================information=======================>>이름 등급 포인트 이자포인트홍길동 silver 1000 20.0개똥이 silver 2000 40.0오삼이 gold 1500 45.0칠용이 gold 2000 60.0

Page 114: C ++  프로그래밍 시작

IS A 상속 “A 는 B 다 “ 라는 뜻이다 . 역은 존재하지 않음 상속 이라는 뜻 을 생각해보면 유산을 상속받는다는 개념과 같다 .가령 아버지 ( 부모 ) 가 아들 ( 자식 ) 에게 유산을 상속 하게 되면

아들은유산을 상속 받게 되는것이고 재산을 보았을때 아들은자기 자신의 것과 아버지의 유산 까지 같이 존재 하게 되는 의미와

같다 .

IS A 상속

Page 115: C ++  프로그래밍 시작

실습예제 1 곰 과 호랑이로 상속관계를 살펴보자 .

특성

곰 : hp, att, woongdam호랑이 : hp, att ,longtail

이 둘은 Animal 이라는 공통된 주제로 묶을수 있다 .

Page 116: C ++  프로그래밍 시작

실습문제 1 is a 상속관계를 생각하여 스타크래프트를 만들어 보자 .

부모클래스 : Unit (멤버변수 int att, int def, int hp)게터 세터 이용하여 입력 받기

자식클래스 : 종족 Zerg: 저그만의 멤버변수Teran: 테란만의 멤버변수Pro: 프로만의 멤버변수

자식클래스 : 저글링 , 마린 , 질럿

Page 117: C ++  프로그래밍 시작

실습문제 2 HAS A 포함관계 실습문제 2 의 포인터 매니저를IS A 상속 관계를 이용하여 좀더 간결하게 만들어

보자

Page 118: C ++  프로그래밍 시작

가상함수

Page 119: C ++  프로그래밍 시작

C++ 의 함수는 정적 바인딩을 함 , 다시 말하면 컴파일 타임에 타입을 보고 호출할 함수를 결정 , 그러나 virtual 키워드를 붙여 정의된 함수는 런 타임 시 포인터가 가리키는 타입에 따라 호출할 함수를 결정 함

포인터가 어떤 객체를 가리키는가에 따라 호출될 함수가 결정되기 때문에 다형성이 구현됨

※ 다형성이란 ?모습은 같은데 형태는 다르거나 문장은 같은데 결과는 다른 것을 뜻함

가상함수

Page 120: C ++  프로그래밍 시작

곰과 호랑이의 대결으로 가상 함수를 이야기 해보자

실습예제

Page 121: C ++  프로그래밍 시작

순수 (pure) 가상 함수와 추상 (abstract) 클래스 함수의 정의 없이 선언만 되어 있는 가상 함수를 순수 가상 함수라 함 오버라이딩의 관계를 목적으로 정의된 함수들은 정의 내용이 필요 없기 때문에 순수 가상 함수로 선언 함수의 선언 뒤에 =0 을 붙이면 순수 가상 함수가 됨 ex) virtual int PureVirtualFuc()=0; 하나 이상의 멤버 함수가 순수 가상 함수인 클래스를 가리켜 추상 클래스라 함 추상 클래스는 객체화하지 못함 , 이유는 함수의 정의가 생략되었기 때문에 추상 클래스는

완전한 클래스가 아님

가상함수

Page 122: C ++  프로그래밍 시작

순수 가상 함수

가상함수를 포함한 클래스를 추상클래스 라고 부른다 .

가상함수

Page 123: C ++  프로그래밍 시작

연산자 오버로딩

Page 124: C ++  프로그래밍 시작

연산자 오버로딩 (operator overloading) 연산자 오버로딩은 함수 오버로딩과 유사한 개념 함수 오버로딩은 같은 이름의 함수를 여러 개 만들어 하나의 함수가 여러

일을 하는 것처럼 정의하는 것이라면 연산자 오버로딩은 연산자에 또 다른 기능을 추가하는 것을 말함 연산자 오버로딩은 클래스의 객체를 기본 자료형처럼 사용할 수 있게 함

연산자 오버로딩 함수 정의 방법 연산자 오버로딩 함수는 클래스의 멤버 함수를 정의하는 방법과 전역 함수로 정의하는방법으로 나뉨 연산자 오버로딩 된 함수이름은 “ operator[ 연산자 ]” 으로 사용

연산자 오버로딩

Page 125: C ++  프로그래밍 시작

리턴 this

this 는 자기참조 포인터 이다 .만약 this 를 리턴한다면 ??결국 자기자신의 주소를반환 한다는것과 같다 .그렇다면 그 주소를 바탕으로다시 자기 자신에게 접근이가능하지 않을까 ?

Page 126: C ++  프로그래밍 시작

Error 코드가 발생하지만 무조건 안된다는것이 아니라 미리 정의 하지 않았다 라는 식이다 .

연산자 함수