본문 바로가기
자료구조와 알고리즘

자료구조의 기초

by 뇌 속의 통 2024. 11. 12.

Struct와 Class의 차이점

 

둘 다 새롭게 개발자가 정의할 수 있는 자료형이란 것은 같으나 기본 접근 제한자가 서로 다르다.

구조체는 Public, Class는 Private.

struct sPeople
{
    int Age;
    char Name[100];
}

class cPeople
{
    int Age;
    char Name[100];
}

int main()
{

    sPeople Won;
    cPeople Seong;
    
    Won.Age = 10; // 가능
    Seong.Age = 10; // 불가능

}

 

위와 같이 각각의 객체를 생성하고 Age 변수에 값을 할당하려고 하면 Class는 기본 Private라서 .을 찍어도 Age 변수가 나오지 않는다.

 

단, Public으로 접근 제한자를 바꾸면 Class의 객체에도 멤버 변수를 접근 가능해진다.

접근 제한자를 Private로 설정하는 이유는 중요한 변수를 외부에서 쉽게 접근하지 않도록 하기 위함이다.

객체 지향의 5대 원리 중 하나(OCP)이다.

 

* 객체 지향의 5대 원리

2024.11.12 - [Computer Science] - 객체 지향 개발의 5대 원리 SOLID

 

객체 지향 개발의 5대 원리 SOLID

좋은 객체 지향 설계를 위한 5가지 원리 1. Single Responsibility Principle : SRP, 단일 책임 원칙하나의 Class는 하나의 책임만 가져야한다. 쉽게 생각하면 하나의 클래스는 하나의 기능을 가져야 한다.여

happygmdevelop.tistory.com

 

그리고 C언어 한정으로 함수 포함여부가 다르다.

Class는 함수를 포함할 수 있으나, 구조체는 함수를 포함시킬 수 없다.

다만, C++부터는 구조체에도 함수를 포함할 수 있어 기본 접근 제한자 말고는 다른 점이 없다. 

 

객체 지향 언어와 멀티패러다임 언어

C#, Java : 객체 지향 언어

C++ : 멀티패러다임 언어(객체 지향 언어 + 절차 지향 언어)

 

* 절차 지향 언어는 C언어로 전역 변수, 전역 함수를 사용할 수 있다.

객체 지향 언어는 불가함. C#에서 사용되는 Static은 전역 변수 전역 함수가 아니라 정적 변수 또는 정적 함수다.

 

정적 변수 : 함수 내부에서 선언되고, 모든 함수 내부에서 접근이 가능한 변수 또는 함수

전역 변수 : 프로그램 전체에서 접근 가능한 변수 또는 함수로 일반적인 Main 함수 외부에 선언된 것을 일컫는다.

공통점 : 프로그램 시작시 할당되며 종료 시 수명을 다한다, 둘 다 메모리의 데이터 영역에 할당된다.

 

클래스의 생성자와 소멸자

생성자 : 메모리를 할당할때(객체 생성) 자동으로 호출 되는 함수

소멸자 : 메모리가 해제될때(객체 소멸) 자동으로 호출 되는 함수

 

class cPeople
{
public:
    cPeople()
    {
      Age = 10;
    };
    ~cPeople();
    
    
    int Age;
    char Name[100];
}

int main()
{
    cPeople One;
    cPeople two;
    
    return 0;
}

 

 

main 함수가 실행되면 Stack영역(함수내 변수 또는 다른 함수가 저장되는 영역)에 One, 그다음 two 객체가 할당되고,

이에 따라 One의 생성자 호출 -> two 생성자 호출이 된다.

 

그러면 return 0;으로 main 함수가 종료될때는 어떻게 될까?

스택 구조는 후입선출 구조이기 때문에 two의 소멸자가 먼저 호출되어 사라지고 그다음 One의 소멸자가 호출되어 사라진다.

 

스택 구조는 접시를 쌓아 올리는 것과 같다고 생각하면 된다.

 

    cPeople()
      :Age(10)
      ,
    {
    };

 

단, 위와 같이 생성자를 정의하면 생성과 동시에 값을 대입 하는 것이고 기존의 생성자 문법은 생성 후 값을 할당하는 것이다.

 

생성자도 함수이므로 오버로딩이 가능하다.

 

연산자 오버로딩

클래스에서 다른 자료형 또는 동일한 클래스와의 연산을 하려는 경우 컴퓨터는 모르기 때문에 개발자가 직접 해당 내용을 구현해야 한다.

 

struct Vector2
{
    int X;
    int Y;
    
    Vector2(int NewX, int NewY)
    {
      X = NewX;
      Y = NewY;
    }
    
    Vector2 operator+(Vector2 other)
    {
      return Vector2(X + other.X, Y + other.Y);
    }
}

int main()
{
    Vector2 LocationOne(2, 2);
    Vector2 LocationTwo(3, 3);
    
    Vector2 Location = LocationOne + LocationTwo;
}

 

연산자 오버로딩 시 operator(연산자)에 오버로딩할 연산자 기호를 작성함으로써 오버로딩이 가능하다.

 

기타 기초 코테 해결

1. 비트 배열을 이용한 마스킹

 

두 개의 배열을 선언하여 Key가 되는 배열(비트 배열)의 숫자가 1인 인덱스를 받아와 데이터 배열에서 해당 인덱스의 값만 가져오는 것

 

int data[6] = {5, 1, 2, 6, 7, 4};
int Keys[6] = {1, 0, 1, 1, 0, 1};
int result[6] = {0, };


for(size_t i = 0; i < 6; i++)
{
    if(Key[i] == 1)
    {
      result[i] = data[i];
    }
}

 

 

2. 다중 flag 및 다중 count

 

하나의 배열안에 원하는 값이 얼마나 들어가 있는지 찾는 것

 

int count = 0;
int arr[5] = {1, 5, 1, 3, 6};
int find[3] = {1, 2, 3};

for(size_t i = 0; i < 3; i++)
{
    for(size_t j = 0; j < 5; j++)
    {
      if(arr[j] == find[i])
      {
        count++;
      }
    }
}

 

 

3. Base Index, Offset Index

BaseIndex가 3이고 OffsetIndex가 4라면 해당 Index는 7를 의미한다.

 

4. 특정 인덱스부터 배열의 끝까지 모든 데이터의 합을 반환하는 GetSum()함수 구현

int GetSum(int* arr, int Index)
{
    int sum = 0;
    
    for(size_t i = 0; i < 5; i++)
    {
      sum += arr[Index];
    }
    
    return sum;
}

int Arr[10] = {4, 1, 3, 5, 9, 7, 8, 5, 4, 6};

int result = Getsum(&Arr, 4);

 

5. 두 문자열이 서로 동일한지 반환해주는 IsSame()함수 구현

bool IsSame(char* strA, char* strB)
{
    for(size_t i = 0; i < 256; ++i)
    {
      if(strA[i] != strB[i])
      retrun false;
    }
    
    return true;
}


char StrOne[5] = "ABB";
char StrTwo[5] = "ABB";

if(IsSame(StrOne, StrTwo))
{
    std::cout << "Is Same" << std::endl;
}

 

혹시라도 StrOne == StrTwo 이렇게 비교하는 것은 사실상 해당 char형 배열의 메모리 주소를 의미하는 것이므로 동일한 메모리 주소를 쓰는 다른 변수는 없으니 항상 false가 나올 것이다.

'자료구조와 알고리즘' 카테고리의 다른 글

알고리즘의 기초 - 정렬  (2) 2025.07.07
재귀함수  (3) 2024.11.13
자료구조의 기초2  (2) 2024.11.12