C++ 002 | C++ 확장

20327 단어 CC

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;
}

좋은 웹페이지 즐겨찾기