일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- set
- 자료구조
- 아두이노 소스
- priority_queue
- map
- Array
- LineTracer
- 수광 소자
- list
- queue
- Stack
- Visual Micro
- C언어
- Arduino
- Algorithm
- directx
- 시스템프로그래밍
- 컴퓨터 그래픽스
- vector
- Deque
- 아두이노
- 라인트레이서
- WinAPI
- arduino compiler
- 통계학
- c++
- stl
- 아두이노 컴파일러
- html
- 운영체제
- Today
- Total
Kim's Programming
C++ - 구조체의 확장 본문
구조체의 확장
멤버함수
1 2 3 4 5 6 | struct Position { int x; int y; char ch; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include<stdio.h> struct Position { int x; int y; char ch; }; void OutPosition(Position Pos) { printf("x좌표는 %d, y좌표는 %d입니다.\n", Pos.x, Pos.y); printf("입력된 문자는 %c\n", Pos.ch); } void main() { Position Posit; Posit.x = 30; Posit.y = 60; Posit.ch = 'A'; OutPosition(Posit); } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include<stdio.h> struct Position { int x; int y; char ch; void OutPosition() { printf("x좌표는 %d, y좌표는 %d입니다.\n", x, y); printf("입력된 문자는 %c\n", ch); } }; void main() { Position Posit; Posit.x = 30; Posit.y = 60; Posit.ch = 'A'; Posit.OutPosition(); } | cs |
- OutPosition 함수가 인수를 받아들일 필요가 없습니다. 일반 함수일 때는 어떤 구조체의 정보를 사용할 것인지 인수로 전달받아야 했지만 구조체에 소속되었기 때문에 소속된 구조체의 정보를 사용하면 됩니다.
- OutPosition함수 내부에서 x,y 멤버 변수를 참조할 때 소속 구조체를 밝힐 필요가 없어졌습니다. 구조체 박에 있을 떄 어떤 구조체에 속한 멤버 변수인지를 밝혀야 하지만 멤버 함수는 별도의 지정없이 자신이 속해있는 구조체의 멤버 변수를 이름만으로 액세스할 수 있습니다.
- main이 OutPosition 함수를 호출할 떄 함수가 소속된 구조체 변수 Posit을 앞에 적어주었습니다. OutPosition 함수는 독립된 함수가 아니라 구조체에 속한 멤버이므로 어떤 구조체의 정보를 대상으로 동작할 것인지를 밝여야 합니다. 멤버 함수를 호출하는 방법은 멤버 변수를 참조하는 것과 동일합니다. 점 연산자를 사용하여 구조체.함수()식으로 호출하며 포인터라면 구조체->함수() 식으로 호출합니다.
위의 소스에서는 구조체 안에 함수의 전문을 넣었는데 만약에 함수의 코드가 길기도 하며 멤버 함수가 많으면 코드 관리가 어려워 집니다. 그래서 C++은 구조체 선언문에 원형만 선언하고 구조체 바깥에 따로 작성하는 방법을 지원합니다. 다음은 함수 본체를 외부에 외부에 따로 작성한 경우입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> struct Position { int x; int y; char ch; void OutPosition(); }; void Position::OutPosition() { printf("x좌표는 %d, y좌표는 %d입니다.\n", x, y); printf("입력된 문자는 %c\n", ch); } void main() { Position Posit; Posit.x = 30; Posit.y = 60; Posit.ch = 'A'; Posit.OutPosition(); } | cs |
구조체 선언문 안에는 함수의 원형만 밝혀 이 함수가 Position 구조체 소속임을 밝힙니다. 함수의 본체는 구조체 선언문 다음에 별도로 작성하되 함수 정의문에 이 함수가 어떤 구조체의 멤버 함수인지를 밝혀야 합니다. 함수 이름 앞에 소속 구조체를 쓰고 그 사이에 범위 연산자 ::를 넣어 구분합니다. 멤버 함수를 정의하는 기본 문법은 다음과 같습니다.
리턴타입 소속 구조체::멤버함수(인수)
{
본체
}
일반 함수 선언문과 비슷하되 함수명 앞에 "소속구조체::"이 추가된다는 점만 다릅니다. Void Position::OutPosition()은 Position 구조체에 속한 OutPosition 구조체에 속한 OutPosition 멤버 함수라는 뜻입니다. 함수의 본체가 구조체 선언 내부에 있건 외부에 있건 이 함수가 구조체의 포함된다는 사실에는 변함이 없습니다. 다만 본체 정의 위치에 따라 멤버 함수가 호출되는 방법상의 차이가
- 내부 정의 : 인라인 속성을 가집니다. 실제로 함수가 호출되는 것이 아니라 멤버 함수를 호출하는 코드가 함수의 본체코드로 대체됩니다.
- 외부 정의 : 일반적인 함수 호출과 마찬가지 방법으로 멤버 함수를 호출합니다. 스택을 경유하고 인수를 넘기고 제어의 분기가 발생합니다.
구제체의 멤버는 외부에서 언제든지 참조할 수 있습니다. 앞 소스에서처럼 main에서 posit.x를 읽을 수 있고 새로운 값 대입도 되고 Posit의 멤버함수 OutPosition을 호출하여 출력 동작도 할 수 있었습니다. 구조체에의 멤버 뿐만 아니라 선언되어있는 변수를 참조하거나 작성되어 있는 함수를 호출 할 수 있는것은 C 수준에서는 당연한 이야기힙니다. 하지만 구조체 내부의 멤버를 외부에서 마음대로 건드리도록 내버려 두면 부주의한 사용으로 버그가 발생할 수 있어 위험할 뿐만아니라 객체의 독립성도 떨어집니다. 그래서 C++에서는 구조체(또는 클래스)의 멤버에 대한 외부 참조를 허가할것인지 금지할 것인지를 지정할 수 있으며 이것도 액세스 지정이라고 하고 세가지 종류가 있습니다.
- private : 이 속성을 가지는 멤버는 외부에서 액세스할 수 없으며 구조체의 멤버 함수만 액세스할 수 있습니다. 외부에서는 프라이빗 멤버를 읽을 수 없음은 물론이고 존재도 알려지지 않습니다.
- public : 이 속성을 가지는 멤버는 외부로 공개되어 어디서나 쓸 수 있고 함수의 경우는 호출할 수 있습니다. 구조체가 자신의 속성이나 동작을 외부로 공개하는 수단이 되며 퍼블릭 멤버를 인터페이스라고 합니다.
- protected : private와 마찬가지로 외부에서는 액세스할 수 없으나 단, 상속된 파생 클래스는 이 멤버를 액세스할 수 있습니다. 프라이빗 멤버는 파생 클래스에서조차도 참조할 수 없으며 오로지 자신만이 이 멤버를 참조할 수 있다는 점이 다릅니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include<iostream> struct str { private: int a; double b; char ch; void Initialize(); public: int x; int y; void function(int x); protected: float k; }; void main() { str S; S.a = 1;//에러 S.x = 10;//대입 가능 S.function(3);//호출 가능 S.Initialize();//에러 } | cs |
'Programming > Cplusplus' 카테고리의 다른 글
C++ - 클래스(Class)(2/2) (0) | 2015.08.28 |
---|---|
C++ - 클래스(Class)(1/2) (0) | 2015.08.28 |
C++ 에서의 동적 할당 new/delete (0) | 2015.08.27 |
C++ 입력함수 cin을 사용해보자 (0) | 2015.07.24 |
C++에서의 Hello World!를 구현해보자! (0) | 2015.07.24 |