ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체 지향 개론
    개발/C·C++ 2021. 4. 21. 12:39

    C는 절차지향, C++은 객체 지향이라고 하는데 완전히 맞는 말은 아닌 것 같습니다. C++/Java/JavaScript 등을 객체 지향 언어로 칭하면서 객체 지향적이지 않은 C언어를 표현하기 위한 반대급부로 절차 지향이라는 말이 나오지 않았나 생각해봅니다. 개발 언어는 대개 코드의 위부터 실행됩니다. 당연히 순서가 있으므로 절차가 있습니다. C++로 절차대로 작동합니다. 객체 지향적이지 않을 뿐이지요.

     

    객체 지향 언어와 객체 지향적이지 않은 언어 사이에 우위를 논하기는 어렵습니다. 분야마다 특화된 언어가 있을 뿐입니다. 객체 지향 언어가 필요한 때에는 대규모 프로젝트일 경우입니다. 그래서 C++의 경우 게임 산업에서 많이 애용됩니다. 웹 개발에 사용되는 언어는 전부 객체 지향 언어입니다. 웹 서비스라도 서버는 C/C++로 개발되기도 합니다. 다음은 위키백과에서 캡처한 표입니다.

    출처: 위키백과

    객체 지향의 특성으로 추상화, 은닉화, 캡슐화, 상속, 다형성 등 다섯 가지를 주로 꼽습니다. 추상화, 은닉화, 캡슐화가 특히 더 중요하다고 생각되는데요. 추상화는 세부적인 것을 숨기고 큰 흐름에서 개발을 진행할 수 있게 해줍니다. 컴퓨터 과학에서 말하는 추상화란 복잡한 자료 등에서 핵심적인 개념 또는 기능을 간추려내는 것을 말합니다. 지하철을 타러 간다고 했을 때, 추상적으로 표현하면 다음과 같을 것입니다. 세부적인 행동들은 추상화 뒤에 숨어 있습니다. 정보 은닉입니다.

     

    1. 집을 나온다.

    2. 지하철역까지 걸어간다.

    3. 개찰구에서 카드를 찍는다.

    4. 승강장으로 내려간다.

    5. 지하철에 오른다.

     

    이 정도만 돼도 충분합니다. 다음과 같이 표현하면 추상적이지 않고 큰 흐름보다는 세부 항목에 집중된 것입니다.

     

    1. 문을 열고 집 밖으로 나온다.

    2. 문이 잘 닫혔는지 확인한다.

    3. 엘레베이터를 탄다.

    4. 주차장 쪽으로 나와 아파트를 빠져 나온다.

    5. 정문을 통과해 지하철 출구 신호등 앞에 대기한다.

    6. 1번 출구를 통해 계단을 내려간다.

    7. 카드를 미리 꺼낸다.

    8. 개찰구에 카드를 찍고 에스컬레이터를 탄다.

    9. 승강장에 도착한다.

    10. 지하철에 오른다.

     

    C++은 객체 간에 의사소통을 할 수 있습니다. 큰 흐름에 따라 코드를 작성할 수 있어서 비즈니스 로직에 집중할 수 있습니다. 다음 코드에서 C 언어와의 차이를 느낄 수 있습니다.

    #pragma warning(disable:4996)
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	// C++ 스타일
    	string s0 = "hello";
    	string s1 = "world";
    	//s0.append(s1);
    	s0 += s1;
    	cout << s0 << endl;
    
    	// C 스타일
    	char s2[50] = "hello";
    	char s3[] = "world";
    	strcat(s2, s3);
    	cout << s2 << endl;
    }

    C++ 스타일에서는 문자열 객체인 s0에 s1를 붙입니다. 이를 위해 s0객체에서 append() 함수를 호출해 s1를 인자로 넣어주었습니다. append는 '붙인다'라는 뜻을 가진 동사입니다. 복합 할당 연산자인 +=를 이용해서도 문자열을 이을 수 있습니다. string 객체를 초기화할 때 개발자는 문자열을 저장하기 위한 char[]의 크기를 생각할 필요가 없습니다. 최적화 문제는 차치하고, string 객체가 알아서 크기를 늘려줍니다. 개발자는 추상화된 기능(함수 등)을 사용하기만 하고 구현 방법을 굳이 알 필요 없습니다. 대규모 프로젝트의 개발에 어울리는 이유입니다. 객체를 통해 정보를 은닉하고 연관된 기능을 가진 함수를 묶어둘 수 있습니다. 캡슐화입니다.

     

    C 스타일의 경우 구현 로직이 raw하게 드러나 있고 문자열을 객체에 저장하지 않기 때문에 객체 간에 의사소통이 이뤄지는 느낌은 아닙니다. "hello" 문자열 뒤에 "world"를 붙이기 위해 s2의 공간을 충분히 만들어줘야 합니다. 여유 있지 않으면 overflow 오류가 발생합니다. s2, s3 변수를 붙이기 위해 strcat() 함수를 사용합니다. C는 이런 raw한 로직을 통해 어셈블리어로 작성된 코드 수준으로 극한의 성능을 낼 수 있는 장점이 있습니다. 그래서 금융 쪽 솔루션의 서버는 C로 작성되어 있는 경우가 많습니다(ex.기업은행). 동적으로 메모리 할당을 한 경우에는 메모리 해제를 직접 해줘야 하는데 개발자가 실수해 이를 누락할 수 있습니다. C++보다는 조금 더 섬세한 작업을 요구합니다.

    댓글

Designed by Tistory.