일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 엑스퍼트생일축하해
- 중소규모택지
- meta table
- 엑스퍼트2주년
- file read
- 등록임대주택
- Lua
- C++ API
- QTcpServer
- 수도권주택공급
- lua install
- lua setup
- lua for windows
- 국토교통부
- 프리미어 영상저장
- QT TCP
- #신혼부부 #결혼준비 #신혼부부희망타운신혼부부특별공급
- #부동산전자거래 #부동산전자계약 #부동산계약 #부동산전자계약방법 #부동산전자계약하는법 #부동산계약방법 #부동산중개수수료 #부동산중개수수료아끼기 #부동산복비아끼기
- 찾다죽는줄
- file open
- 프리미어 영상변환
- C API
- 티몬삼겹살데이
- FILE TRANSFER
- TCP/IP
- 청량리역한양수자인192
- lua interpreter
- 월세
- file write
- object
- Today
- Total
Value Creator의 IT(프로그래밍 / 전자제품)
#4 [C++] 구조체, 객체 포인터, 객체 배열 본문
#구조체 선언
C++에서는 c언어의 호환성을 목표로 개발되었다. 그렇기 때문에 호환성을 위해 구조체(struct)를 지원한다. C++에서의 구조체는 표준 C 구조체에 기능을 확장하여 기존의 클래스와 동일한 구조와 기능을 가진다. 선언 방법은 struct 로 선언하면 되며, 클래스와 같이 멤버함수와 멤버변수를 가지며, 접근지정도 해야한다.
struct example
{
//디폴트 접근 지정은 클래스와 달리 public.
private:
//private속성의 멤버 변수나 함수 선언
public:
//public 속성의 멤버 변수나 함수 선언
protected:
//protected 속성의 멤버 변수나 함수 선언
};
C++에서의 구조체 객체 생성은 클래스 객체 선언과 같이 구조체 타입뒤에 객체 이름을 지정하면된다.
ex)
example Ex;
struct example Ex;//컴파일 에러
선언시 반드시 'struct'는 생략하자 C++에서는 'struct'키워드를 객체생성시에 사용하지 않는다.
이쯤에서 구조체와 클래스의 차이점을 알 수 있을 것이다.
고작 멤버 접근지정에서 디폴트(기본)설정이 private냐 public이냐 차이 뿐이다.
구지 만든이유는 기존 C언어와의 호환성을 위해서이다.
그렇다면 구조체가 나은가 클래스가 나은가를 묻지 않을 수없다.
하지만 둘다 기능은 똑같기에 성능차는 없다. 하지만 우리는 지금 객체지향언어인 C++을 배우고 있다. 따라서 C언어에서 쓰던 구조체를 사용을 조금은 자제하고 클래스로 계속 짜는것이 앞으로 배우는데에 혼란이 적어져서 유용하다.
#객체 포인터
C++는 C를 계승했기 때문에 객체를 다루기 위해 객체에 대한 포인터 변수를 선언하고 이 포인터 변수로 멤버 변수를 일고 값을 쓰거나 멤버 함수를 호출할 수있다.
여기서 포인터란 어떤 값을 가리키기 위한 형식을 뜻한다. 사실 필자도 가장어려워하고 아직도 어려워하는게 포인터 개념이다. 포인터는 C, C++을 배우는 학생들에게 가장 절망을 안겨주는 곳이고 대학생1학년 때 이것을 이해하느냐 못하느냐에 따라 전공이 바뀌기도 주 언어가 바뀌기도 한다.
쉽게 말하자면 os상의 '바로가기'라 보면된다. 즉, 무언가를 가리키는 것이라 생각하면된다.
(자세히 들어가면 끝도 없이 어렵다. 계속 공부해 나가고 몸으로 익힐 수밖에 없다.)
앞서 계속 써왔던 Circle 클래스를 예를 들어서 설명해보자.
객체에 대한 포인터 변수선언 방법은 아래와 같다.
Circle *p;
"클래스명 *변수"가 형식이다.
이때 선언된 포인터 변수 p는 사실 어떤 객체도 가리키고 있지 않다. 따라서 무엇을 가리킬지 설정해줄 필요가 있다. 이때 객체의 주소를 가리키게 하는데 주소를 표기하는 방법은 객체 이름앞에 "&"를 붙이는 것이다.
p = &donut;
그렇다면 포인터 p는 앞으로 donut이라는 객체를 가리키게된다.
하지만 이렇게 포인터를 선언해도 결과는 동일하다.
Circle *p;
p = &donut;
//위와 아래의 결과는 동일하다.
Circle *p = &donut;
앞서 객체 이름으로 멤버를 접글할때는 아래와 같이 '.'(점) 연산자를 사용했다.
donut.getArea();
하지만 객체 포인터로 멤버를 접글할 때는 "->"연산자를 사용한다.
p->getArea();
하지만 "->"을 안쓰고도 기존과 같이 '.'(점) 연산자를 사용할 수 있다.
(*p).getArea();
그렇다면 이번에는 예제를 통해 객체 포인터 선언과 활용을 해보자.
앞서 만들어 사용해왔던 CIrcle클래스를 그대로 사용한다.
메인문은 아래와 같다
#include"Circle.h"
int main()
{
Circle a;
Circle b(10);
//객체 이름으로 멤버 접근
cout << "테스트 Circle a의 값 : " <<a.getArea() << endl;//3.14출력
//객체 포인터 선언및 멤버 접근
Circle *p;
p = &a;
cout << p->getArea() << endl; //a의 getArea()출력
cout << (*p).getArea() << endl;//위와 동일한 출력
p = &b;
cout << p->getArea() << endl;//b의 getArea()출력
cout << (*p).getArea() << endl;//위와 동일한 출력
}
#객체 배열
당연하지만 객체로 만들어진 것은 배열로도 만들 수 있다. 단 객체배열은 각각의 원소가 객체라는 점이다. 선언 방법은 int나 char, string 과 같은 기존의 선언방식과 동일하다. 예는 아래와 같다.
다만 기존의 헤더파일에 소스를 추가한다.
#ifndef CIRCLE_H
#define CIRCLE_H
#include<iostream>
using namespace std;
class Circle
{
double pi = 3.14;
int radius;
public:
Circle() { radius = 1; }
Circle(int r) { radius = r;}
~Circle() { cout << "반지름이 " << radius << "인 원의 소멸" << endl; }
void setRadius(int r) { radius = r; }//추가
double getArea();
};
#endif
메인문과 결과는 아래와 같다.
#include"Circle.h"
int main()
{
Circle CircleArray[3];//객체 이름에 대한 배열 선언
CircleArray[0].setRadius(10);
CircleArray[1].setRadius(20);
CircleArray[2].setRadius(30);
for (int i = 0; i < 3; i++)
{
cout << CircleArray[i].getArea() << endl;
}
Circle *p = CircleArray;
//Circle의 포인터 p의 선언. p는 객체배열CircleArray를 가리킴!
for (int i = 0; i < 3; i++)
{
cout << p->getArea() << endl;
p++;//포인터p는 배열의 다음원소를 가리킴.
}
}
객체 배열에서는 알아야 하는 것이있다.
우선 객체 배열을 선언했을때 따로 멤버변수값을 지정하지 않으면 당연하게도 모든 배열의 원소는 기본 생성자로 호출이 된다. 그렇기 때문에 기본생성자가 없는 경우 값을 설정하지 않았을때는 컴파일에러가 발생한다.
당연히 다차원 배열 선언도 가능하다.
동작은 동일하고 기능 또한 같다.
'1. 프로그래밍 > 5) C++' 카테고리의 다른 글
#6 [C++] 예제 : RAM 구현해보기 (0) | 2019.07.26 |
---|---|
#5 [C++] 예제 : 랜덤 정수 10개 생성 클래스 만들기 (0) | 2019.07.26 |
#3 [C++] 생성자, 소멸자, 접근지정자 (0) | 2019.07.26 |
#2 클래스 생성 예제 (0) | 2019.07.24 |
#1 C++ 기초(객체지향, 캡슐화, 상속성, 다형성) (0) | 2019.07.24 |