본문 바로가기
프로그래밍/C++

[C++] c++의 기초. c에서 추가된 점 간단히. ( ::, new, delete 연산자)

by K_Coder 2012. 2. 17.


C 언어를 배워보고 C++을 본다는 가정하에, c에서 추가된 점 몇가지. 
cout 처럼 printf 와 다른 점을 설명하는게 아닌 추가된 기능이나 연산자 등의 내용.

 

 목차. 

구조체의 변화
 
추가된 연산자 ( ::, new, delete ) 




1. 구조체의 변화

기본적으로 구조체는 서로 다른 타입의 한 묶음을 의미 했습니다.
그런데 c++로 넘어오면서  함수를 추가 할 수 있게 되었죠.

데이터 + 함수. 즉 class 나 마찬가지가 되어 버렸죠.

그리고 접근 권한을 지정해 줄 수 있는데 (public, protected, private) 
기본적으로 public이 디폴트 값이 됩니다. (생략 시)

그러다 보니.. 실제적으로 c++에서 구조체는 c에서 쓰듯 데이터만 주로 사용하고
함수까지 추가하는 경우에는 그냥 class 를 사용합니다. (class 는 디폴트가 private 입니다.)

그냥 가능하다 정도를 기본 지식으로 가지고 계시면 되겠네요.

그리고 예약어인 struct를 생략하고 선언이 가능해졌습니다. (이건 좀 편하더군요)





2. 추가된 연산자. ( :: , new , delete)

:: 범위 연산자 (scope operator)
 


:: 범위 연산자 (scope operator)

요놈은 3가지 방식으로 사용이 됩니다. 

첫번째 ::전역변수명

일반적으로 전역 변수와 지역변수가 이름이 같은 경우 지역변수가 우선 시 됩니다.
전역 변수가 지역변수에 의해 가려진다고 하는데요, 이런 경우에도 전역변수 사용이 가능해졌습니다.

#include <stdio.h>
int ex = 1;			// 전역변수

int main()
{
	int ex = 2;		// 지역변수

	ex += 2;		// 동일 이름의 지역변수 존재 시 지역변수가 우선.

	::ex += 1;		// :: 연산자를 사용해 전역변수를 사용.

	return 0;
}
그냥 ex 만 쓰면 2 값이 들어있는 지역 변수가 선택되서 연산이 되지만
::ex 를 쓰면 1 값이 들어있는 전역 변수가 선택되게 됩니다.




두번째 class명::멤버

나중에 class나 이쪽 할 때 자주 보게 되시겠지만
클래스나 구조체에서 만든 함수를 정의 하거 할 때 사용 됩니다.

void Person::prn()
{

}




세번째 ::외부함수 (전역함수)

c에서는 함수가 main() 아니면 사용자 함수(내가 정의한 함수) 가 기본적이었는데.
클래스나 구조체에서 함수를 정의하는게 생겨서 함수의 "소속"에 의미가 생겼습니다.

일반적으로 main() 밖에 사용자가 정의하던 그냥 "함수"를 "전역함수" 라고 하더군요.
다른 사용자 함수 어디서든 사용이 가능하니까요. 전역변수처럼.

클래스 안에서 만든 함수를 "멤범함수" 라고 하는데,
이 "멤버함수" 와 "전역함수"는 함수명이 같아도 됩니다. 기존에 C에서는 함수명이 중복될 수 없었죠.

여기서는 오버로딩 이라는 개념이 있긴 한데. 그거랑은 이유로 가능합니다. (오버로딩 개념은 나중에)

바로, "소속" 이 다르기 때문이죠. "전역 함수" 는 어디에서 소속되지 않은 함수 입니다.
반면 "멤버함수" 는 클래스 안에 속해 있죠. 그렇다 보니 멤버 함수는 외부에서 단독으로 쓰이지 못합니다.

클래스명.멤버함수명 or 클래스명::멤버함수명 같은 식으로 쓰이죠.

따라서 전역함수 prn()과 Person::prn() 은 서로 구분이 가능해 지게 되었습니다.

그런데 이건 클래스 밖의 기준이구요.


포커스를 클래스 안으로 맞춰볼까요?
클래스 안에서는 즉, 우리집에서는 Person:: 따위를 쓸 필요가 없습니다.
집 안에서는 밖에 보이지 않기 때문이죠. pnr() 나와라 ~ 하면 당연히 집 안에서 먼저 찾게 되겠죠?

그러다 보니, 전역변수 때와 마찬가지로 밖에 있는 prn() 가려지게 되는거죠.
마찬가지로 ::prn()  이라고 적어주면 됩니다. 전역함수는 소속이 없기 때문에 :: 앞에 아무것도 적을게 없는거구요.

#include <stdio.h>

class Person			// Person 이라는 클래스
{

private :				// 접근 지정자 private
	int age;

public :				// 접근 지정자 public
	void test();		// test 라는 멤버 함수
	void prn();			// prn 이라는 멤버 함수
}

void Person::test()		// test 멤버함수 정의부
{
	prn();				// 멤버함수 prn 호출
	::prn();			// 전역함수 prn 호출
}

void Person::prn()		// prn 멤버함수 정의부
{
	cout << "난 멤버 함수야 " << endl ;
}

int main()
{
	Person p1;			// class 없이 하죠? struct 도 마찬가지 입니다.
	p1.test();			// p1에 test() 함수 호출
return 0; } void prn() // 전역함수 prn { cout << " 난 전역 함수야 " << endl; }
이렇게 "소속" 에 의해서 함수명이 구분 된다는거.
struct 나 class 없이서 생성이 가능 하다는거.



한가지 팁으로. 

strcpy 같은 시스템 라이브러리. 혹은 이름이 겹치지 않는 전역 함수의 경우

그냥 그 함수명으로 사용해도 되지만   앞에 :: 를 붙여주면 좋습니다.

그 이유는, 위에서 설명했듯, 클래스 내에서 함수를 호출 하면 자기 집 안을 먼저 찾게 됩니다.

그리고 없으면 밖으로 나가서 찾게 되겠죠? strcpy나 이름이 겹치지 않는 전역 함수라 할지라도

어차피 안에 없는게 확실 하다면. 바로 밖을 찾는게 빠르게죠. 


사실상 :: 표시는 안에 없으니까 헛짓할고 밖에서 찾으라는 의미 입니다.

지금처럼 클래스의 함수들이 적고 별 볼일 없는 경우 큰 차이가 없지만


큰 소스의 경우에는 차이가 나겠죠? ^^;;



new 와 delete

c에서의 malloc 과 free 에 해당하는 기능입니다.

간단하게 소스로 아실 수 있을것 같네요

#include <stdio.h>
int main()
{
	char *p;

	p = new char[5];	// char 5개의 연속된 기억공간 할당. (p에 첫 주소 저장)

	delete[] p;			// p가 가지고 있는 주소의 기억 공간을 해제.

        return 0;
}
보시다 싶이 사용이 조금 더 간편해졌습니다.
new 를 사용하고 타입과 크기를 지정하면 되구요,

delete p   처럼 [] 없이 사용하면 지정한 곳 한 크기만 해제가 됩니다
즉, [5] 가 아닌 [1] 을 선언했을 때 겠죠? 위처럼 여러 공간을 할당한 경우

delete[] p 로 p에 해당하는 여러 기억 공간을 해제해 주어야 합니다.
p 자체가 사라지는게 아니라. p가 가지고 있는 기억공간이 사라지는 겁니다.

p는 여전히 사용 가능하구요. 다른 주소를 넣을 수 있죠.
지역 변수이니까 main() 가 끝날 때 자동으로 소멸 됩니다.

자세한 문법과 설명은 다음에 설명하겠습니다. 

'프로그래밍 > C++' 카테고리의 다른 글

[C++] cout 의 모든 것. [setf(), 조정자, 형식변환]  (3) 2012.02.17