Programming/C++ 스터디

객체지향 프로그래밍 : 클래스와 객체

Greeneffect 2021. 8. 30. 02:39

정의 : Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data and code: data in the form of fields, and code, in the form of procedures. (wikipedia)

객체지향 프로그래밍이란 사람이 세상을 인지하는 방식과 유사한 관점으로 어떠한 객체를 바라볼 때 객체에 포함된 기능들을 함께 다루기 위한 방법이다. C++이외에도 JAVA, C# 등의 언어에서도 지원이 되지만 이번에는 C++에 대해서 정리하려고 한다.

C++과 JAVA에서 지원되는 OOP 요소 ( 빨간색은 C++에서 되는 요소)

  • 클래스
  • 개체
  • 생성자
  • 함수 오버로딩
  • 힙에 객체 생성
  • 스택에 객체 생성
  • 복사 생성자
  • 소멸자
  • 연산자 오버로딩

2. 클래스 & 객체

클래스 : C++에서 확장된 구조체의 개념, 변수뿐만 아니라 함수도 포함할 수 있음
객체 : 클래스를 변수화 한 것. 실제 메모리에 할당 됨

Vector Class 예시

class Vector 
{ 	
    int mX; 
    int mY; 
}


여기서 mX, mY는 클래스에서 정의된 멤버 변수이고 따로 선언하지 않으면 접근권한은 private이 된다.

접근제어자 (Access Modifier) : 접근 제어(Access Control)를 위해 멤버 변수나 함수에 외부에서 직접적인 접근을 막거나 허용하는 기능을 설정

  • public : 누구나 접근 가능
  • protected : 자식 클래스 접근 가능
  • private : 해당 클래스에서만 접근 가능



스택 (stack)

  • 예약된 로컬 메모리 공간 (작음)
  • 함수 호출과 변환이 이 메모리에서 일어남
  • 단순히 stack pointer를 옮김
  • stack overflow 발생할 수 있음
  • 성능이 느려질 수 있음



힙 (heap)

  • 전역 메모리 공간 (큼)
  • 비어 있고 연속된 메모리 블럭을 찾아야 함 (느림)
  • 프로그래머가 메모리를 직접 할당 및 해제



객체 생성 stack 예제

Vector AddVector(const Vector& a, const Vector& b) 
{	
    Vector result; 
    result.mX = a.mX + b.mX; 
    result.mY = a.mY + b.mY; 
    return result; 
} 

void foo( ) 
{ 	
    Vector c = AddVector(a, b) 
}



위와 같이 foo( ) 함수가 실행되고 AddVector가 실행될 때 내부에서 생성되는 객체는 모두 stack 메모리에서 동작하게 된다. 그리고 실행이 종료되면 아래 그림과 같이 점유된 메모리도 바로 stack에서 풀리게 된다.



객체 생성 heap 예제

void PrintVector(const Vector& a, const Vector& b) 
{ 	
    Vector* result = new Vector; 
    result->mX = a.mX + b.mX; 
    result->mY = a.mY + b.mY; 
    
    // 벡터 출력 
    
} 

void foo( ) 
{ 	
    PrintVector(a, b)
}

 

foo 함수가 실행되고 PrintVector가 실행 될 때는 stack 메모리에서 실행되게 된다. PrintVector 내부에 포인터 벡터를 정의하는 부분이 있기 때문에 이때 힙에 벡터 사이즈 메모리가 할당되고 stack에는 포인터만 저장된다.

PrintVector가 종료되면 stack에 점유하던 메모리가 해제되는데 heap에 할당된 메모리는 포인터를 잃은 채 계속 남아 있게 된다.
따라서 heap에 값을 저장하는 new를 수행했을 땐 반드시 아래 코드와 같이 delete로 메모리를 해제해줘야 한다. 더 좋은것은 PrintVector와 같이 local 함수 내부에서는 포인터로 메모리를 heap에 저장하지 않도록 관리하는게 더 중요하다.

void PrintVector(const Vector& a, const Vector& b) 
{ 	
    Vector* result = new Vector; 
    result->mX = a.mX + b.mX; 
    result->mY = a.mY + b.mY; 
    
    // 벡터 출력 
    
    delete result;
    
} 

void foo( ) 
{ 	
    PrintVector(a, b)
}

'Programming > C++ 스터디' 카테고리의 다른 글

포인터  (0) 2022.06.16
객체지향 프로그래밍 : 상속  (0) 2021.09.08
객체지향 프로그래밍 : 생성자  (0) 2021.09.01