42 Seoul: CPP Module: Namespace, new/delete, 객체 지향 프로그래밍

Chaewon Kang·2021년 5월 14일
0

42 seoul

목록 보기
12/17

Namespace (이름 공간)

std::cout에서 std는 C++ 표준 라이브러리의 모든 함수, 객체 등이 정의된 이름 공간. 어떤 대상 (정의된 객체, 함수)가 어느 소속인지를 지정해 줌. 같은 이름이라도 소속된 이름 공간이 다르면 다른 대상으로 취급함.

자기 자신이 포함되어 있는 이름 공간 내에서는 굳이 이름 공간을 명시하지 않고 자유롭게 부를 수 있다.

#include <iostream>
using namespace std;

int main() {
	cout << "Hello, world!" << endl;
    return 0;
}

위와 같이 using namespace 를 사용하여 어떤 이름 공간을 사용하겠다고 선언할 수 있지만 이는 권장되지 않는다. 그냥 std::cout 형태로 쓰는 것을 권장. (혹시 모를 충돌로부터 보호하기 위해)

어떤 파일 내부에서만 사용하려는 대상을 만들려면, 굳이 namespace를 지정하지 않아도 됨.

C 언어와의 공통점, 차이점

C++에서는 변수를 사용하기 직전 어느 위치에서든지 변수를 선언할 수 있음.
C 와 C++ 은 기본적인 문법 구조(조건문; if, else, switch, 제어문; for, whlie, break, continue 등등)는 모두 같음.

iostream

CPP 에서 표준 입출력에 필요한 기능들을 포함하는 표준 라이브러리.
이를테면 std::cout, std::endl과 같은 것들을 포함.

참조자

C에서는 어떤 변수를 가리킬 때 반드시 포인터를 사용하지만, C++에서는 다른 변수 혹은 상수를 가리키는 방법으로 참조자(레퍼런스, reference)를 사용한다.

#include <iostream>

int main() {
	int a = 3;
    int& b = a;
    
    b = 5;
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;
    
    return 0;
}

실행 결과는 a, b 모두 5가 출력된다.

참조자를 정의하려면, 가리키고자 하는 타입 뒤에 &를 붙여 선언한다. 포인터 타입의 참조자를 만들기 위해서 int*&와 같이 사용할 수 있다. 위 코드에서 b가 a의 참조자라는 것은, b에 어떤 작업을 수행하든 a에 그 작업을 수행하는 것과 마찬가지다.

참조자와 포인터의 차이점

  1. 참조자는 반드시 처음에 누구의 참조자가 될 것인지 명시해야 함.
  2. 참조자가 한 번 생성되면, 다른 대상의 참조자가 될 수 없다.
  3. 참조자는 메모리에 존재하지 않을 수도 있다.

참조자를 리턴하는 경우의 장점

레퍼런스가 참조하는 타입의 크기와 상관없이 한 번의 주소값 복사로 전달이 끝나서 효율적

Dangling Reference

참조자는 있는데 원래 참조하던 대상이 사라진 레퍼런스를 일컫음
레퍼런스를 리턴할 때 지역 변수의 레퍼런스를 리턴하지 않도록 유의

문자열 리터럴

프로그래밍 언어에서 리터럴(literal)이란, 소스코드 상에서 고정된 값을 가지는 것을 의미한다. C언어의 경우, 큰따옴표(")로 묶인 것들을 문자열 리터럴(string literal)이라고 부른다.

char *pstr = "hello world";
printf("hello chaewon");
scanf("%c", str[0]);

위 코드에서 큰따옴표로 묶인 모든 것들이 문자열 리터럴이다.

프로그램이 실행되어 메모리에 로드될 때, 5가지 종류 영역이 존재하게 된다. text segment, data segment, bss segment, heap, stack. 이 때 텍스트 세그먼트에 프로그램 코드, 상수, 리터럴 등이 정의된다. text segment에 있는 내용들은 READONLY이다. (컴파일러 구현, 사용하는 운영체제 환경에 따라 달라질 수 있다.)

char str[] = "hello";

의 경우에는,

char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};

컴파일러에 의해 위와 같이 해석되며, 텍스트 세그먼트가 아닌 스택(stack)영역에 로드되기 때문에 메모리 수정이 가능하다.

프로그램이 정확하게 실행되기 위해서는 컴파일 시 모든 변수 주소값이 확정되어야 함. 이를 위해 프로그래밍에 많은 제약이 따르기 때문에, 프로그램 실행 시 자유롭게 메모리를 할당/해제할 수 있는 힙(heap)이라는 공간이 따로 있음.

C에서는 malloc(memory allocation) 함수와 free 함수를 지원하여 힙 상에서의 메모리 할당을 지원. C++ 에서도 new와 delete로 이를 사용 가능. 힙 영역에 할당된 메모리는 꼭 해제해 주어야 함.

new, delete

Type* pointer = new Type;

type 만큼의 공간을 할당하고, 그 시작 주소값을 pointer에 넘김.

delete pointer;

할당된 공간을 해제. (new 키워드로 할당한 공간만 해제 가능)

만약 아래와 같이 특정한 데이터 타입의 배열을 생성했다면,

Type* pointer = new Type[size];

해제할 때도 아래와 같이 한다.

deletep[] pointer;

객체 지향 프로그래밍

C++는 멀티 패러다임 언어 (지만 일반적으로 객체 지향 프로그래밍으로 일컫음).

객체란 변수와 참고 자료들로 이루어진 소프트웨어 덩어리들.한 객체는 자기만의 정보를 나타내는 변수들(도구)과, 이 변수들을 가지고 어떠한 작업을 하는 함수들(행위)로 이루어져 있다.

이러한 객체의 변수나 함수들을 보통 인스턴스 변수(instance variable), 인스턴스 메소드(instance method)로 부른다. 보통 외부에서 어떤 객체의 인스턴스 변수 값은 바꾸지 못하고, 객체의 인스턴스 함수를 통해서만 변수들의 값에 접근할 수 있게 한다. 이를 캡슐화(encapsulation)이라고 한다.

간단하게 캡슐화의 장점을 말하자면, 객체 내부의 상황을 잘 알지 못하더라도, 어떻게 사용하는지 알게 된다는 점이다. 행위를 기반으로, 각각 적절한 행위에 대응되는 함수들을 이용하면 객체 내부의 상황을 잘 몰라도 행위가 가능하다.

클래스

C++에서 클래스를 이용해 만들어진 객체를 인스턴스(instance)라고 부른다.

아직 인스턴스가 생성되지 않은, 그러니까 '설계도' 혹은 많은 사람들이 '붕어빵 틀'로 일컫는 클래스 내에서는, 아직 생성되지 않고 구조만 선언된 상태인 대상들에 대해, 멤버 변수(member variable)과 멤버 함수(memmber function)라고 한다.

class Person {
	private:
    	char name[10];
        int height;
        int weight;
        char nickname[10];
    
    public:
    	void set_person(int _height, int _weight) {
        	height = _height;
            weight = _weight;
        }
    	void increase_height(int inc) {
        	height += inc;
        }
        void increase_weight(int inc) {
        	weight += inc;
        }
        void view_start() {
        	std::cout << "이 사람의 키는 : " << height << std::endl;
            std::cout << "이 사람의 몸무게는 : " << weight << std::endl;
        }
};

클래스 내 멤버 접근 지시자

private 키워드 영역 내의 멤버들은 외부에서 접근 불가. 객체 내에서 보호되고 있음을 의미. 자기 객체 안에서만 접근 가능하다.
public 키워드 영역 내의 멤버들은 외부에서 마음껏 이용 가능!

키워드 명시를 하지 않는 경우 기본적으로 private으로 설정 됨.

profile
문학적 상상력과 기술적 가능성

0개의 댓글