C ++ 프로그래밍 시작
Introduce C++ Language C++ 언어는 c언어를 확장시킨 언어 C언어의 함수, 배열 , 포인터, 구조체를 포함하여 모든 문법적인 부분을 그대로 사 용할 뿐 아니라 일부 문법은 훨씬 사용하기 편하게 개선이 되었음 C언어는 절차지향언어이지만 C++언어는 객체지향 언어 C++ 언어의 특징 확장자는 *.cpp 함수 중간에 변수 선언이 가능 cin, cout 등 객체를 이용한 입・출력을 제공한다. 메모리 구조는 c언어와 동일함 구성환경은 c언어와 동일
Introduce C++ Language C++ 언어는 1980년 벨 연구소의 Bjarne Stroustrup에 의해 탄생 1980년 당시에 C with class 라는 이름으로 발표되었으나 1983년 C++로 변경되어 현재까지 사용되고 있음 1998년 ANSI 산하 공인 표준 연구회에서 C++언어에 대한 국제 표준안 제 정
C++ 간단한 소스코드 간단한 소스코드 작성 헤더 파일의 선언 -> #include <iostream> ∙ 출력의 기본구성 -> std::cout << [출력대상1] << [출력대상2] << [출력대상3] ∙ 개행의 진행 -> std::endl
소스 코드 분석 iostream.h VS iostream cout 객체 iostream.h 헤더파일은 cin과 cout 객체를 사용하기 위해 추가하는 헤더파일 iostream.h는 과거의 표준방식을 따르겠다는 의미고, iostream은 현재의 표준방 식을 따르겠다는 의미임 cout 객체 cout은 좌측 쉬프트 연산자(<<) 뒤에 있는 데이터를 출력 출력하고자 하는 데이터의 타입을 지정하지 않아도 자체적으로 출력 출력 데이터가 여러 개인 경우 좌측 쉬프트 연산자(<<)로 구분
Cin 이라는 객체 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; } C++ 에서는 변수의 선언위치에 제한을 두지 않는다.
소스코드 분석 cin 객체 ∙ 입력의 기본구성 -> std::cin >> [변수] 입력하는 데이터의 타입을 지정하지 않아도 변수의 타입에 맞게 자체적으로 입력 입력 데이터가 여러 개인 경우 우측 쉬프트 연산자(>>)로 구분 ∙ 입력의 기본구성 -> std::cin >> [변수] ∙ 변수의 선언위치 -> 함수의 중간 부분에서도 변수의 선언이 가능
소스코드 분석 std::endl 줄 바꿈을 수행하는 명령 '\n'과 동일한 명령으로 출력버퍼를 비우는 기능이 포함 됨
cin 과 cout 의 특징 cin과 cout은 타입에 관계없이 자체적으로 입・출력이 가능 C언어의 printf나 scanf처럼 서식문자를 사용하지 않음 cin과 cout을 이용한 입・출력의 특징 실수는 유효 자릿수까지 출력, 경우에 따라 지수 형태로도 출력 char형 포인터 입력 : 주소부터 차례대로 문자열을 저장한 후 맨 뒤에 널 문자('\0')를 자동으로 추가 char형 포인터 출력 : 주소부터 널 문자('\0') 이전의 문자열 출력 포인터에 저장 된 주소를 출력할 경우는 포인터 형이나 int형으로 형 변 환 우측 쉬트프(>>)로 문자열 입력 시 공백 문자 포함 문자열을 받을 수 없 음 우측 쉬프트 연산자(>>)는 연속적인 데이터를 입력 받기 위해 공백을 입 력의 끝으로 처리하기 때문
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; } 연이은 데이터의 입력을 명령 할 수 있다. for문 안에서도 변수의 선언이 가능하다. for문 지역변수
실습문제 1 C++ 언어를 사용 하여 구구단 프로그램 만들기 1. cout 과 cin 객체 사용 2. 단수를 입력 받아 3. 2~9 단 사이에 구구단을 출력 해주는 프로그램
실습문제 2 C++ 언어를 사용 하여 문자열 개수 맞추기 문자열과 문자를 입력받는다. 문자열에서 입력받은 문자의 개수가 몇 개인 지 카운트 하는 프로그램을 작성해보자.
Function Overloading
Function Overloading 함수 오버로딩이란? 함수 이름은 같지만 매개변수의 타입이나 개수가 다른 것을 함수 오버로 딩이라 함 함수 오버로딩은 하나의 함수가 마치 여러 일을 하는 것처럼 정의할 수 있기 때문에 다형성 (polymorphism)이 구현 됨
Function Overloading 함수 오버로딩의 이해 int MyFunc(int num) #include <iostream> int main(void) { MyFunc(20); //MyFunc(int num)함수의 호출 MyFunc(30,40); //MyFunc(int a,int b)함수의 호출 return 0; } int MyFunc(int num) { num++; return num; } 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 실행의 예 #include <iostream> int main(void) { 함수 오버로딩을 사용하여 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 #include <iostream> 실행의 예 int main(void) { 함수 오버로딩을 사용하여 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 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 디폴트 매개변수의 규칙 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 란? 이름 공간이라는 개념은 대형 프로젝트 내에서 이름 충돌을 막기 위 한 도구로 일반적으로 규모가 작은 프로젝트 내에서는 거의 사용 되지 않 음
Namespace Example1 (함수의 이름의 충돌)
Namespace Example2 (이름 충돌의 해결)
Namespace Example2 분석 범위 지정 연산자 존재하는 이름공간이 다르면 동일 한 이름의 함수 및 변수를 선언하는 것이 가능하다. 범위 지정 연산자
Namespace 이름 공간 기반의 함수 선언과 정의의 분리
Namespace 동일한 이름 공간 선언된 이름공간의 이름이 동일하다면, 이둘은 동일한 이름공간으로 간주한다. 즉, SimpleFunc 와 PrettyFunc는 동일한 이름 공간안에 존재하는 상황이다.
Namespace 동일한 이름 공간 내에서의 함수호출 이름공간을 명시하지않고 함수를 호출하면, 함수의 호출문이 존재하는 함수와 동일한 이름공간 안에서 호출할 함수를 찾게된다. 따라서 SimpleFunc 함수 내에서는 이름공간을 명시하지 않은 상태에서 PrettyFunc 함수를 직접 호출 할수 있다.
Namespace 이름 공간의 중첩
Namespace std::cout // 이름공간 std에 선언된 cout std::cin // 이름공간 std에 선언된 cin std::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; 이름공간 Hybrid에서 HybFunc를 찾아라 라는 일종의 선언이다.
Namespace using을 이용한 cin,cout,endl을 전역에 명시 std 안에서 cin,cout,endl을 찾으라고 전역에 명시하는것과 같음
Namespace using을 이용한 namespace std를 전역 선언 선언은 이름의 충돌을 막기위한 이름공간의 선언을 의미 없게 만든다. 따라서 제한적으로 사용할 필요가 있다.
Namespace 이름공간에 별칭 부여와 전역변수 접근
Namespace Example
Reference (참조자)
Reference Reference 란? 기존에 선언된 변수에 붙이는 별칭
Reference Reference의 특징 Reference 는 선언 시 & 연산자를 사용 상수는 초기화 할 수 없다. Reference 의 데이터 형은 참조하는 변수의 데이터 형과 같아야 한다. 참조 대상을 변경 할 수 없다. 변수 하나에 여러 개의 Reference 를 적용할 수 있다.
Reference Reference 예제
Reference 다시보는 call-by-value 와 call-by-reference
Reference Reference 를 이용한 Call by Reference
Reference 실습문제1
Reference 실습문제2 – 오버로딩을 사용하여 만들 것
새로운 자료형 bool
bool 자료형 자료형 bool C++에서는 bool형이라는 새로운 데이터 형을 제공, 하지만 컴파일러의 지원여부에 따라 C언어에서도 사용 할 수 있음 bool형은 true와 false의 값을 갖는 1byte 데이터 형으로 참과 거짓을 판 별
bool 자료형
bool 자료형
const
const Const keyword란? 변수 상수화 변수를 상수처럼 사용하고자 할 때 사용함 변수 상수화와 포인터 상수화, 레퍼런스 상수화로 구분 됨 변수 상수화 변수 앞에 const keyword 를 붙이면 상수화 됨 상수는 선언과 동시에 초기화 되어야 함
const 포인터 상수화 Reference 상수화 Reference 선언 시 데이터 형 앞에 const가 선언된 경우, Reference 로 공유하는 변수의 값을 변경할 수 없음
const 포인터 상수화 예제
실습예제 참조자 상수화 예제
const 멤버변수 상수화 멤버함수 상수화 클래스에서 멤버변수 선언 시 상수화 시킬 수 있음 클래스 내에 정의된 멤버함수를 상수화 시킬 수 있음 ※아직 클래스의 개념을 모르고 있으므로 추후에 배우도록 함
New & Delete (동적할당)
new / delete 연산자 new 연산자 delete 연산자 malloc함수에 비해 사용하기 간편함 형 변환을 하지 않아도 됨 생성자를 호출할 수 있음(생성자는 뒤에서 다시 자세히 배우도록 함) delete 연산자 동적으로 할당된 메모리의 해제는 한 번만 가능
new / delete 연산자 New / delete 연산자 사용 방법
new / delete 연산자 포인터를 사용하지 않고 힙메모리에 접근하기
실습문제 학생의 인원을 입력 받고 입력 받은 인원만큼의 메모리 를 할당하여 학생의 이름,국어,영어,수학을 입력 받아 그대로 출력하는 프로그램을 만들어보자.
C++ 표준함수 호출하기
C++의 표준헤더 사용 C++의 표준헤더 : c를 더하고 .h를 빼라.
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++에서는 class라는 키워드를 사용하여 클래스를 사용 클래스란 쉽게 구조체의 확장 버전이라 생각하기로 함
구조체 와 클래스 클래스 예제
정보은닉 과 캡슐화
정보은닉 접근제어 지시자 구조체와 클래스의 차이점 중 하나 접근 제어 키워드는 public, protected, private 세 가지가 있음 protected는 뒤의 상속부분에서 다시 배우도록 함
정보은닉 정보은닉의 필요성 캡슐화의 정의 클래스 멤버 변수는 일반적으로 PRIVATE 영역에 저장한다. 의도치 않은 외부 접근에 대한 오류를 방지하기 위함 캡슐화의 정의 하나의 객체는 독립적으로 완벽한 역할을 수행할 수 있어야 한다. 내부에서 발생하는 경계 검사 등의 동작은 외부에서 알 필요가 없다.
캡슐화 ※ 객체지향 프로그램은 데이터와 함수를 묶어 하나의 “블랙박스 (black box)”를 생성할 수 있는데 이를 캡슐화라 한다. 즉, 캡슐화란 객체에 데이터와 함수를 숨겨두고 인터페이스 통로를 입력하고 결 과 값을 받는 것을 말한다. 즉, 객체를 사용하는 개발자 는 인터페이 스만 알면 될 뿐 내부적인 동작은 알 필요가 없음을 말하는데 이 개 념은 정보 은닉(information hiding)과도 연결된다. 예를 들어 우리 는 핸드폰 문자 전송 시 어떠한 원리로 문자가 전송 되는 지 알 필요 가 없다. 우리는 문자를 보내는 방법(인터 페이스)만 알면 내부적인 동작 방법은 알 필요가 없는 것이다. 객체지향에서 캡슐화는 접근제 어(public, protected, private)를 이용해 구현 할 수 있다.
실습예제 모니터 클래스를 만들어 보자
객체의 장점 1. 만든 Class 를 헤더파일로 복사해서 붙여 넣는다.(ex. monitor.h) 2. main 소스에서 “monitor.h” 를 include 한다. 하나의 대상을 클래스화 시켜 만들어 주면 그 클래스를 바탕으로 객체화 할수 있다. 이것은 언제든지 재사용이 가능하며 공유 또한 가능하다.
실습문제 오디오를 만들어서 오디오의 기능들을 만들어 보자 getter , setter 함수로 만든다 track 볼륨값 브랜드값
생성자 / 소멸자
생성자 / 소멸자 생성자 소멸자(파괴자) 객체가 생성될 때 자동으로 호출되는 함수 객체가 소멸할 때 자동으로 호출되는 함수 일반적으로 객체가 제대로 동작할 수 있게 준비하는 역할 함수 이름은 클래스의 이름과 같아야 하며 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% 를 곱한값이 이자다. 컨트롤 클래스 이름 : Pntmgr Pntmgr 멤버변수 : silver 등급을 10명 관리할수 있는 포인터 배열 , 인덱스 추가 Pntmgr 멤버함수 : 생성자 , 소멸자 , insertdata ,printdata
실습문제 1 출력결과 출력결과 : << ======================information=======================>> 이름 등급 포인트 이자포인트 홍길동 silver 1000 20.0 개똥이 silver 2000 40.0
실습문제 2 실습문제 1 을 바탕으로 추가적으로 Gold 클래스를 만들어보자 출력결과 : << ======================information=======================>> 이름 등급 포인트 이자포인트 홍길동 silver 1000 20.0 개똥이 silver 2000 40.0 오삼이 gold 1500 45.0 칠용이 gold 2000 60.0
IS A 상속 IS A 상속 “A는 B다 “ 라는 뜻이다. 역은 존재하지 않음 상속 이라는 뜻 을 생각해보면 유산을 상속받는다는 개념과 같다. 가령 아버지(부모)가 아들(자식)에게 유산을 상속 하게 되면 아들은 유산을 상속 받게 되는것이고 재산을 보았을때 아들은 자기 자신의 것과 아버지의 유산 까지 같이 존재 하게 되는 의미와 같 다.
실습예제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 코드가 발생하지만 무조건 안된다는것이 아니라 미리 정의 하지 않았다 라는 식이다.