C++ 002 | C++ 확장
3-1. 포인터(Pointer)와 C++
3-1-1. 포인터
포인터는 값 자체를 의미하는 변수가 아니라 주소값을 저장하고 있는 변수를 의미 &
메모리를 관리하는데 있어서 필수적인 자료형
3-1-2. 포인터와 C++의 관계
- C++에서는 컴파일 시간(Compile Time)이 아닌 실행 시간(Run Time)에 결정 내림
=> 프로그램 중에 메모리를 할당하는 방법이 필요하며 포인터를 이용
하며 메모리 연산을 수행 - 이것은 프로그램 실행 시 사용될 메모리양의 결정이
상황에 적절히 대처할 수 있는 융통성을 제공 - 예를 들어 배열 선언 시 반드시 그 크기가 명시되어야 하나 크기의 결정을 실행 시간이 될 때까지 미룸으로서 프로그램이 실행
되는 시점에 사용자가 프로그램에게 그 크기를 알려줄 수 있다. C++에서는 좀 더 편리한
동적 메모리 할당과 해제를 위해 새로운 키워드(Keyword)로 new, delete를 제공한다.
3-2. 동적 메모리의 할당 및 해제
- 메모리 할당을 위해 사용되는 new는 할당하고자 하는 데이터의 크기만큼 힙(Heap)으로부터 할당하여, 첫 번째 번지를 리턴
- 만약 할당이 불가능할 경우 NULL을 반환
- 메모리 해제를 위한 delete는 사용한 메모리 해제하는 기능, new로 할당된 메모리는 delete를 이용하여 해제해야 함
=> 그렇지 않으면 프로그램이 수행되는 동안 메모리를 사용. 따라서 할당
받은 메모리를 사용할 수 있도록 해당 주소를 포인터로 관리해야 한다.
- 할당받은 메모리의 첫 번째 주소를 포인터에 저장하여 사용
- 단지 자료형 앞에 new를 붙여 주는 것으로 명시적 형변환과 데이터형의 크기를 지정할 필요 없이 메모리를 할당가능
- 이렇게 new를 사용하여 할당한 메모리는 delete를 사용하여 해제
주의할 점
☞ new로 할당하지 않은 메모리는 delete로 해제하지 않는다.
☞ delete를 사용하여 같은 메모리 블록을 연달아 두 번 해제하지 않는다.
☞ new[]를 사용하여 메모리를 할당한 경우 delete[]를 사용한다(delete를 사용해도 컴파
일 에러는 발생하지 않지만, 메모리 누수(Memory Leak)가 발생한다).
☞ new를 대괄호 없이 사용했으면 delete도 대괄호 없이 사용한다.
☞ NULL 포인터에는 delete를 사용하지 않는 것이 안전하다(아무 일도 일어나지 않
음).
#include <iostream>
#include <string>
using namespace std;
struct student{
int id;
char name[10];
};
int main() {
student *s = new student;
int *t = new int[10];
s->id = 1;
strcpy(s->name, "홍길동");
cout<<"id : "<<s->id<<", name : "<<s->name<<endl;
for(int i=0;i<10;i++)
t[i] = i;
for(int j=0;j<10;j++)
cout<<t[j]<<endl;
delete s;
delete[] t;
return 0;
}
3-3. 참조 호출(Call by Reference)
- 참조 호출이란 이름이 다른 변수가 같은 메모리 번지를 가리키도록 하는 것
- C언어의 포인터와 유사하나 실제로는 다른 개념
=> 포인터는 변수를 메모리 공간에 유지
=> 참조 호출은 별도 메모리를 할당하지 않는다.
(ex 1 : 참조변수의 값에 위치를 저장)
#include <iostream>
using namespace std;
int main() {
int i=3;
int *p = &i;
cout<<"i is "<<i<<endl;
cout<<"*p is "<<*p<<endl;
cout<<"p is "<<p<<endl; // p의 주소
return 0;
}
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
(ex2 : 변수의 위치를 목표값의 위치랑 same하게 두어 동일시 해줌)
#include <iostream>
using namespace std;
int main()
{
int i=3;
int &p = i;
cout<<"i is "<<i<<endl;
cout<<"p is "<<p<<endl;
cout<<"&i is "<<&i<<endl; // i의 주소값 출력
cout<<"&p is "<<&p<<endl; // p의 주소값 출력
return 0;
}
void swap(int &a, int &b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
3-4. 구조체(Structure)와 클래스(Class)
3-4-1. 구조체(Structure)
구조체란 서로 연관성 있는 변수들을 하나로 묶어 만들어지는 새로운 사용자 정의 데이터 형으로 구조체의 사용은 두 단계로 구분한다.
-
데이터형 특성을 정의, 즉 구조체 묘사를 정의하는 단계: 구조 정의
-
구조체 변수를 생성: 구조체 데이터 객체를 생성
-
C언어와 다르게 좀 더 간편한 방식으로 구조체를 정의
=> typedef문의 사용 없이도 변수를 선언하는 방식과 동일하게 사용 가능 -
c에서의 구조체 사용
1)
/* 정의 */ struct Ttag{
int id;
double grade;
}T;
/* 사용 */ struct T t;
2)
/* 정의 */ struct Ttag{
int id;
double grade;
};
typedef struct Ttag T;
/*사용*/ T t;
3)
/* 정의 */
typedef struct Ttag{
int id;
double grade;
}T;
/*사용*/ T t;
-
1)의 경우 T의 사용시에 매번 struct 구문을 적어주어야 사용 가능함
-
2)의 경우 typedef 문으로 정의하여 사용
-
3)의 경우 2)에서 구조 정의와 typedef의 형태를 하나로 합쳐서 표현
-
c++에서의 구조체 사용
// 정의
struct Ttag{
int id;
double grade;
}T;
// 사용
T t;
3-4-2. 클래스(Class)
- 클래스는 서로 관련이 있는 데이터(멤버 변수)와 이를 조작하기 위한 함수(멤버함수)로 구성
#include <iostream>
#include <string>
using namespace std;
// student class의 정의
class student {
private:
int id;
char name[10];
char grade;
public:
void setStudent(int stId, char *stName, char stGrade);
int getId(void);
char* getName(void);
char getGrade(void);
void show(void) {
cout<<"ID : "<<id<<", Name : "<<name<<", Grade : "<<grade<<endl;
};
};
// student 멤버 함수의 정의
void student::setStudent(int stId, char *stName, char stGrade){
id = stId;
strcpy(name, stName);
grade = stGrade;
}
int student::getId(void){
return id;
}
char* student::getName(void){
return name; }
char student::getGrade(void){
return grade;
}
// main 함수의 정의
int main()
{
student s;
s.setStudent(123,"홍길동", 'A');
s.show();
return 0;
}
Author And Source
이 문제에 관하여(C++ 002 | C++ 확장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/C-002-C-확장저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)