C ++ 프로그래밍 시작

Preview:

DESCRIPTION

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

Citation preview

C ++ 프로그래밍 시작

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

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

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

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

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

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

제정

Introduce C++ Language

간단한 소스코드 작성

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

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

C++ 간단한 소스코드

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

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

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

소스 코드 분석

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++ 에서는 변수의 선언위치에 제한을 두지 않는다 .

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

소스코드 분석

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

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

소스코드 분석

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

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

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

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

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

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

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

cin 과 cout 의 특징

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 문 지역변수

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

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

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

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

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

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

Function Overloading

Function Overloading 함수 오버로딩이란 ?

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

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

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

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

함수 오버로딩의 이해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;}

함수 오버로딩

Function Overloading

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;

}

실습 문제 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;

}

실행의 예

실습 문제 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;

}

실행의 예

Default Parameter

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

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

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

Default Parameter

#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

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

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

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

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

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

다음 함수의 문제점 찾기

실습문제 1

inline 함수

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

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

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

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

inline 함수

매크로 함수#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;

}

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

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

inline 함수의 선언

inline 함수

namespace

Namespace Namespace 란 ?

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

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

Example1 ( 함수의 이름의 충돌 )

Namespace

Example2 ( 이름 충돌의 해결 )

Namespace

Example2 분석

Namespace

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

범위 지정 연산자

Namespace

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

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

동일한 이름 공간

Namespace

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

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

Namespace

이름 공간의 중첩

Namespace

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

namespace std{

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

}

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

Namespace

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 를 찾아라 라는 일종의 선언이다 .

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

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

Namespace

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

Namespace

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

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

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

Namespace

Example

Namespace

Reference (참조자 )

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

Reference

Reference Reference 의 특징

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

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

Reference Reference 예제

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

Reference

Reference Reference 를 이용한 Call by Refer-

ence

Reference 실습문제 1

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

새로운 자료형 bool

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

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

거짓을 판별

bool 자료형

bool 자료형

bool 자료형

const

const Const keyword 란 ?

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

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

const 포인터 상수화

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

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

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

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

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

포인터 상수화 예제

const

참조자 상수화 예제

실습예제

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

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

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

const

New & Delete ( 동적할당 )

new / delete 연산자

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

배우도록 함 )

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

new / delete 연산자

New / delete 연산자 사용 방법

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

new / delete 연산자

실습문제

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

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

C++ 표준함수 호출하기

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

C++ 의 표준헤더 사용

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

객체 지향 프로그래밍

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

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

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

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

객체 지향 프로그래밍

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

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

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

객체 지향 프로그래밍

구조체 와 클래스

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

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

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

클래스 와 객체

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

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

클래스 용어

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

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

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

구조체 와 클래스

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

정보은닉 과 캡슐화

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

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

정보은닉

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

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

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

캡슐화

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

실습예제

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

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

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

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

객체의 장점

실습문제

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

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

생성자 / 소멸자

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

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

생성자 / 소멸자

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

생성자 / 소멸자

생성자 Overloading

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

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

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

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

∙ 멤버변수의 변경 불가능

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

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

생성자 / 소멸자

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

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

this

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

this

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

this

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

this 포인터 사용

this

static( 정적멤버 )

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

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

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

정적멤버

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

정적멤버

정적멤버

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

정적멤버

포인터 배열

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

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

포인터배열

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

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

포인터배열

포인터배열

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

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

때문

포인터배열

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

실습문제

상속

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

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

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

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

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

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

상속

HAS-A 포함관계

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

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

실습예제

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

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

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

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

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

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

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

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

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

인덱스 추가

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

출력결과 :

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

실습문제 1 출력결과

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

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

출력결과 :

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

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

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

같다 .

IS A 상속

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

특성

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

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

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

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

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

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

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

보자

가상함수

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

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

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

가상함수

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

실습예제

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

완전한 클래스가 아님

가상함수

순수 가상 함수

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

가상함수

연산자 오버로딩

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

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

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

연산자 오버로딩

리턴 this

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

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

연산자 함수

Recommended