검색결과 리스트
…™업무일지。/…™C++。에 해당되는 글 15건
- 2014.10.20 가상 함수와 추상 클래스
- 2014.10.17 가상시리얼포트
- 2014.10.16 ※생성자(Constructor) 및 오버로딩(Overloading)
- 2014.10.15 상속(Inheritance)의 이해
- 2014.10.15 ※const static 멤버
- 2014.10.15 ※인라인(inline) 함수 -작업중-
- 2014.10.15 ※함수인자 디폴트
- 2014.10.15 ※ 함수 오버로딩
- 2014.10.13 5강 클래스(class)
- 2014.10.12 4강 메모리 할당과 해제
글
가상 함수 (virtual function)
- 기본 클래스에 선언된 함수를 파생 클래스에서 재정의한 상속(:) 관계함수(상속 관계)
-> 상위에 있는 것을 무시하고 하위 것을 하위 클래스에 있는 함수을 실행하고자 할때
- 오버라이딩(overriding)이라고 함
- 상위 클래스의 멤버 함수를 무시
- 상위 클래스와 멤버 함수의 매개변수는 같아야 한다.
- 리턴값은 상관없음.
형식
함수 앞에 virtual 이라는 이름을 붙여준다.
virtual void Print(){ cout<<"A"<<endl }
접근방법은 *포인터와 &참조자 형태로 접근하는 방법이 있다.
아래 예제를 참고 한다.
예제
#include <iostream>
using namespace std;
class A
{
public:
virtual void Print() {cout <<"A"<<endl;}
};
class B : public A // A 상속
{
public:
void Print() { cout <<"B"<<endl; }
};
int main()
{
B ClassB; //obj 생성
//포인터형
A * pClassA= &ClassB; //포인터형 obj 생성
pClassA->Print(); //B 을 출력
//참조자형
A & ClassRefA=ClassB; //참조자형 obj생성(선언과 동시에 초기화, A 클래스의 별명 B 클래스)
ClassRefA.Print(); //B 을 출력
return 0;
}
다형성( polymorphism )
- 상위 클래스의 가상 함수가 하위 클래스의 종류와 상관없이 재정의 되어 실행되는 특성
예제
#include <iostream>
using namespace std;
class A
{
public:
virtual void Print(){ cout <<"A"<<endl; }
};
class B : public A
{
public:
void Print() { cout <<"B"<<endl; }
};
class C : public A
{
public:
void Print() { cout <<"C"<<endl; }
};
int main()
{
B ClassB;
C ClassC;
//포인터형
A * pClassA= &ClassB;
pClassA->Print();
pClassA=&ClassC;
pClassA->Print();
//참조자형
A & ClassRefA=ClassB;
ClassRefA.Print();
return 0;
}
가상 기본 클래스(virtual base class)
- 다중 상속에서 기본 클래스가 한번만 생성되게 하기 위한 상속
- 기본 클래스는 공유가 목적
- 상속 접근 지정자 앞에 virtual을 붙임
형식
class A {};
class B: virtual public A
{ };
class C: virtual public A
{ };
class D: public B, public C
{ };
'…™업무일지。 > …™C++。' 카테고리의 다른 글
가상시리얼포트 (0) | 2014.10.17 |
---|---|
※생성자(Constructor) 및 오버로딩(Overloading) (0) | 2014.10.16 |
상속(Inheritance)의 이해 (0) | 2014.10.15 |
※const static 멤버 (0) | 2014.10.15 |
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
설정
트랙백
댓글
글
'…™업무일지。 > …™C++。' 카테고리의 다른 글
가상 함수와 추상 클래스 (0) | 2014.10.20 |
---|---|
※생성자(Constructor) 및 오버로딩(Overloading) (0) | 2014.10.16 |
상속(Inheritance)의 이해 (0) | 2014.10.15 |
※const static 멤버 (0) | 2014.10.15 |
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
설정
트랙백
댓글
글
▶생성자(Constructor)
클래스를 선언하게 되면 그 클래스는 메모리에 객체로써 자리를 잡게 된다.
그러나, 이 객체는 해당 메모리에 자리만 잡고 있을 뿐이지, 초기화는 되지 않으므로,
생성자를를 통해서 초기화를 해줄 필요가 있다.
기본적으로 객체를 선언하였다면, 객체를 이루는 변수들에 값을 대입함으로써 객체를 초기화 할 수 있지만,
객체가 생성될때 마다 값을 대입하는 행동은 귀찮고 비효율적이다.
이런 비효율 적인 활동을 간단하게 해결 할 수 있게 하는 것이 바로 생성자이다.
생성자는 스스로 자기 자신의 객체를 초기화 하는 방법을 정의하는 것으로써,
생성자의 이름은 항상 클래스명과 동일해야 한다.
또한 오버로딩을 통해서 인자값을 받을 수 있음
리턴값을 가질 수 없다는 것이 특징이다.
▶생성자 호출 방법
생성자명 객체명 = 생성자명(인자값);
ex)
People peo(나이, "이름",키) ;
people peo = People(나이, "이름", 키);
private:
int age;
char * name;
double height;
public:
void set_People(int _age, char* _name, double _height);
void show_People();
//기본 생성자
People(){
char *t = "naddru";
cout<<"=== 생성자 호출 : 인자값 없음 ==="<<endl;
age=30;
name="naddru";
height=182;
}
//생성자 오버로딩(인자값을 지정해 줄 수 있다)
People(int _age, char* _name, double _height){
cout<<"=== 생성자 호출 : 인자값 3개 ==="<<endl;
age= _age;
name= _name;
height= _height;
}
};
▶생성자 오버로딩
오버로딩과 오버라이딩 개념은 항상 헷갈리지만, 이 두 개념에 정리는 다음으로 미룬다.
일단 생성자에선 생성자 오버로딩이 가능하며, 이것을 통해서 인자값을 전달 할 수 잇다.
함수를 재정의하는 것을 오버라이딩(Overriding)이라하며, 이것은 기존의 함수가 행해왔던 활동을 다른 활동으로 변경하는 것을 의미한다.
오버로딩(Overloading)은 기존의 함수에 인자값이 다른 함수를 중복 정의 하는 것
▶소스코드
#include <iostream>
using namespace std;
class People{
private:
int age;
char* name;
double height;
public:
void set_People(int _age , char* _name , double _height);
void show_People();
//default 생성자
People(){
char* t = "naddru";
cout << "=== 생성자 호출 : 인자값 없음 ===" << endl;
age = 30;
name = "naddru";
height = 182;
}
//생성자 오버로딩
People(int _age , char* _name , double _height){
cout << "=== 생성자 호출 : 인자값 3개 ===" << endl;
age = _age;
name = _name;
height = _height;
}
};
void People::set_People(int _age, char* _name , double _height){
age = _age;
name = _name;
height = _height;
}
void People::show_People(){
cout << "나이 : " << age << endl;
cout << "이름 : " << name << endl;
cout << "키 : " << height << " 이었으면 좋겠다. ㅎ "<<endl << endl;
}
int main(){
// 기본 생성자 사용
People p = People();
p.show_People();
// 오버로딩 된 생성자 사용
People p2(31,"lina",168);
p2.show_People();
//p 객체의 값을 변경
p.set_People(18,"child",178);
p.show_People();
return 0;
}
'…™업무일지。 > …™C++。' 카테고리의 다른 글
가상 함수와 추상 클래스 (0) | 2014.10.20 |
---|---|
가상시리얼포트 (0) | 2014.10.17 |
상속(Inheritance)의 이해 (0) | 2014.10.15 |
※const static 멤버 (0) | 2014.10.15 |
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
설정
트랙백
댓글
글
상속과 클래스 관계
- 기본(base) 클래스의 속성을 물려 받는 것
base class <-> derived class
base class: 기본 클래스
멤버
-private
-protected
-publie
derived class: 드라이브드 클래서 =파생 클래스
-기능적인 면
기본 클래스<파생 클래스
- 파생 클래스는 기본 클래스의 protected, public멤버 사용 가능
참고 사항
-기본 클래스에 대한 관례적인 명칭
super class:최상위 클래스 , parent class:부모 클래스
-파생 클래스에 대한 관례적인 몇칭
sub class:하위 및 최하위 클래스, chaild class:자식 클래스
[형식1] 단일 상속 [접근지정자]:private,protected,public
class Derived:[접근지정자]Base {
//member list
};
class A {..};
class B : public A {};
[형식2] 다중 상속 [접근지정자]:private,protected,public
class Derived:[접근지정자] Base1,[접근지정자] Base2 { };
{
//member list
};
class A { };
class B { };
class C : public A ,protected B { };
상속: 기존의 과념 -> 기존에 정의해 놓은 클래스의 재활용을 목적으로 만들어진 문법적 요소
새로운 관점으로 상속을 보자!
파생 클래스에서 기본 클래스에 대한 접근 권한
- private 상속
* private 멤버 : 사용 불가
* protected : private로 사용
* public : private로 사용
부모 클래스 상위 클래스 기본 클래스 |
자식 클래스 하위 클래스 파생 클래스 |
|
* private 멤버 * protected *public |
사용 불가 private로 사용 private로 사용 |
|
|
|
|
예제
private:
void ShowPrivateA(){cout<<"A private"<<endl;}
protected:
void ShowProtectedA(){cout<<"A protected"<<endl;}
public:
void ShowPublicA(){cout<<"A public"<<endl;}
};
class B:private A
{
public:
void Show(){
// ShowPrivateA(); 사용 불가
ShowProtectedA(); 사용 가능
ShowPublic(); 사용 가능
}
};
int main(){
B Test;
Test.Show();
return 0;
}
- protected 상속
* private 멤버 : 사용 불가
* protected : protected로 사용
* public : protected로 사용
- public 상속
* private 멤버 : private로 사용
* protected : protected로 사용
* public : protected로 사용
예제
'…™업무일지。 > …™C++。' 카테고리의 다른 글
가상시리얼포트 (0) | 2014.10.17 |
---|---|
※생성자(Constructor) 및 오버로딩(Overloading) (0) | 2014.10.16 |
※const static 멤버 (0) | 2014.10.15 |
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
※함수인자 디폴트 (0) | 2014.10.15 |
설정
트랙백
댓글
글
※const static 멤버
클래스 내에 선언되 const 멤버변수(상수)의 초기화는 이니셜라이저를 통해야만 한다.
그러나 const static으로 선언되는 멘버변수(상수)는 직접 선언과 동시에 초기화가 가능하다.
※mutable
const 함수 내에서의 값의 변경을 예외적으로 허용
가급적 사용을 자제
'…™업무일지。 > …™C++。' 카테고리의 다른 글
※생성자(Constructor) 및 오버로딩(Overloading) (0) | 2014.10.16 |
---|---|
상속(Inheritance)의 이해 (0) | 2014.10.15 |
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
※함수인자 디폴트 (0) | 2014.10.15 |
※ 함수 오버로딩 (0) | 2014.10.15 |
설정
트랙백
댓글
글
※인라인(inline) 함수
in은 "내부" line은 "프그램 코드 라인" 의미
/*프로그램 코드라인 안으로 들어가 버린 함수*/
매크로 함수의 장단점
장점: 일반적인 함수에 비해서 실행속도 빠름
단점: 정의하기가 어렵다. 복잡한 함수를 매크로의 형태로 정의 하는데 한계가 있다.
매크로 함수의 예
#include <iostream>
using namespace std;
#define SQUARE(x) ((x) * (x))
int main()
{
cout<<SQUARE(5)<<endl;
return 0;
}
'…™업무일지。 > …™C++。' 카테고리의 다른 글
상속(Inheritance)의 이해 (0) | 2014.10.15 |
---|---|
※const static 멤버 (0) | 2014.10.15 |
※함수인자 디폴트 (0) | 2014.10.15 |
※ 함수 오버로딩 (0) | 2014.10.15 |
5강 클래스(class) (0) | 2014.10.13 |
설정
트랙백
댓글
글
int MyFunc(int A, int B)라는 함수가 있을때 인자값을 디폴트 값을 줄 수가 있다.
int MyFunc(int A=1, int B=2) { return A+B; } |
함수 호출시 인자를 하나만 호출 할 수도 있고, 두개를 호출 할 수도 있음.
int main()
{
MyFunc(); //함수인자 디폴트
MyFunc(1); //인자 하나 호출
MyFunc(1,2); //인자 두개 호출
cout<<MyFunc()<<endl;
cout<<MyFunc(1)<<endl;
cout<<MyFunc(1,2)<<endl;
return 0;
}
함수의 원형을 별도로 선언하는 경우 -> 매개변수의 디폴트 값은 함수의 원형 선언에만 위치 시켜야 한다.
#include <iostream>
using namespace std;
int MyFunc(int iA=1, int iB=2); //원형 선언에만 위치
int main(void)
{
cout<<
}
int MyFunc(int iA, int iB)
{
return iA+iB;
}
'…™업무일지。 > …™C++。' 카테고리의 다른 글
※const static 멤버 (0) | 2014.10.15 |
---|---|
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
※ 함수 오버로딩 (0) | 2014.10.15 |
5강 클래스(class) (0) | 2014.10.13 |
4강 메모리 할당과 해제 (0) | 2014.10.12 |
설정
트랙백
댓글
글
연산자 오버로딩
- 기본 연산자의 기능을 객체에도 적용
- 연산자를 중복해서 정의하는 것
- 고유 연산자 기능 외에 사용자가 정의한 기능을 연산자로 실행하게 하는 것
[장점]
연산자 고유의 의미를 유지할 수 있다.
간략한 표기가 가능하다.
형식
리턴형 operator 연산자(매개변수들..)
오버로딩이 가능한 연산자
사칙연사자외 비교연산자 등등.. 거의 모든 연산자
오버로딩이 불가능한 연산자
::(범위 지정 연산자)
.(멤버 접근 연산자 dot), (.*), (?:), (sizeof)
오버로딩 예
1)이항 연산자인 사칙 연산자(+,-,*,/)
2)단항 연산자인 증가 연산자 ++를 오버로딩한 예
전치형 operator++() {}
후치형 operator++(int m) {} // 여기서 int m은 아무 의미 없음 그냥 임시변수 생성이름
함수 오버로딩
함수호출 시 전달된는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문
'…™업무일지。 > …™C++。' 카테고리의 다른 글
※인라인(inline) 함수 -작업중- (0) | 2014.10.15 |
---|---|
※함수인자 디폴트 (0) | 2014.10.15 |
5강 클래스(class) (0) | 2014.10.13 |
4강 메모리 할당과 해제 (0) | 2014.10.12 |
입출력 namespace :: 스코프 연산자 (0) | 2014.10.12 |
설정
트랙백
댓글
글
클래스(Class)
- 사용자 정의 타임(Type)이다
- 변수와 함수로 이뤄져 있다.
- 멤버(member)
- class 키워드
- class를 선언하면 객체(object)가 된다.
- struct는 C++에서는 class이다.
class 형식
class 클래서명 { 멤버 리스트(변수와 함수) }; |
♣ class 사용 예
1. 멤버 변수
#include <iostream>
class smart { int X; int Y; }; |
2. 멤버 함수
#include <iostream> class smart void Print() |
3. 멤버 함수 를 분리하는 예 -> 클래스 내용이 방대 해 질때 :: 스코프 연산사를 사용 함수를 분리 하는 방법
#include <iostream> class smart }; void smart::Print() // 스코프 연산자를 사용해서 함수의 소속을 구분하여 선언 |
♣ class 선언(객체 생성)
- class가 선언되었을 때 객체라고 한다.
- class는 사용자 정의 타입이므로 일반 변수
또는 포인터 선언과 같은 형식을 사용한다.
#include <iostream> class smart }; void smart::Print() // 스코프 연산자를 사용해서 함수의 소속을 구분하여 선언
int main() {
} |
'…™업무일지。 > …™C++。' 카테고리의 다른 글
※함수인자 디폴트 (0) | 2014.10.15 |
---|---|
※ 함수 오버로딩 (0) | 2014.10.15 |
4강 메모리 할당과 해제 (0) | 2014.10.12 |
입출력 namespace :: 스코프 연산자 (0) | 2014.10.12 |
C++ 언어의 데이터형과 변수 (0) | 2014.10.11 |
설정
트랙백
댓글
글
메모리 할당 및 해제 비교
구분 |
메모리 할당 |
메모리 해제 |
C언어 |
malloc() |
free() |
C++언어 |
new |
delete |
고정 메모리 : 변수, 배열,
동적 메모리(heap 메모리) :heap 영역을 사용
변수 : 상수 / 메모리 주소 : 일반변수 / 포인터 변수 *
이중 포인터: 메모리 주소를 저장 하는 포인터
new와 delete의 대상
1. 포인터, 객체 2. new로 생성한 것은 반드시 delete로 해제 3. new로 메모리 할당이 실패하면 0 리턴 4. 널 포인터를 delete해도 상관없다. |
new의 형식
1. new type |
int *ptr; ptr = new int; |
2. new type(초기화 |
int *ptr; ptr = new int(12); |
3. new type[개수] |
int *ptr; ptr = new int[7]; |
delete 형식
1. delete 포인터 변수 |
int *ptr; ptr=new int; delete ptr; |
2. delete [] 포인터 변수 |
int *ptr; ptr=new int[12]; delete [] ptr; |
예제들
1. 포인터
2. 이중 포인터 : 배열의 행열 갯수가 가변적일 때 쓰임
3. 포인터 배열 :
행이 일정하고 열만 가변
4. 배열 포인터 :
행은 가변 열은 고정
5. 구조체 포인터
|
'…™업무일지。 > …™C++。' 카테고리의 다른 글
※ 함수 오버로딩 (0) | 2014.10.15 |
---|---|
5강 클래스(class) (0) | 2014.10.13 |
입출력 namespace :: 스코프 연산자 (0) | 2014.10.12 |
C++ 언어의 데이터형과 변수 (0) | 2014.10.11 |
정보 은닉, 구성과 상속 개념 (0) | 2014.10.07 |
RECENT COMMENT