programming/C++

#1 C++ Basic

KoTiv 2022. 11. 22. 22:20
반응형
SMALL

시작하기에 앞서 C++ 언어에 대하여 기존의 C언어에서 조금더 학습해야할 필요성을 느끼게 되어 스터디를 진행하게 됐다.

대체적인 C++의 특성으로는 C++은 절차지향 프로그램인 C언어( 매우 효율적이고, 사이즈가 작고, 실행속도가 빠르고 상대적으로 머신내에서 이식성이 뛰어난 성격을 가지는)와 객체 지향 프로그래밍(복잡한 프로그래밍 작업의 어려움을 극복하기 위한)과 템플릿이라는 기능을 이용하여 새로운 프로그래밍 방법론으로 OOP(Object-Oriented Programming), Gereric Programming등의 방법  추가되기도 했다.

하지만 언어자체의 기술적인 부분은 매우 강력해졌지만 반대로 배우고 알아야하는 내용들이 많아졌다는 단점이 존재한다.

앞으로 진행할 이야기의 절차는 우선 Basic C++, Object, Class , Encapsulation, Data Hiding, Polymorphism, inheritance의 개념과 OOP, Gereric Programming에 대해 알아볼 예정이다.

** 추후에는 Cpp과 도커, 쿠버네티스 기반의 MSA와 간단한 CICD환경까지 다루어볼 예정이다.


 우선 C++의 프로그래밍 방식을 알아보면 1.Procedural Language, 2.Object-Oriented Language, 3.Generic-Programming Method 세가지의 프로그래밍 방식이 존재한다.

1 Procedural Language는 의미그대로 C의 절차지향 방식이다.

2.Object-Orient Language는 Procedural Language에 Class를 추가하여 실현되는 방식이며

3. Generic-Programming은 Templet을 지원하여 개발하는 방식을 의미한다. 

여기서 c++의 특성을 잘 활용하기 위해서는 C의 내용을 잘알아야 하는 이유가 1번 특성과 연관있다. 왜냐하면 절차지향 성을 가진 C언어가 제공하는 자료형, 연산자, 제어 구조, 구문 규칙들을 C++에서 채용하고 있기 때문이고 제어 구조 및 구문 규칙의 상세 Asemble까지 확인하고 싶다면 c++ complier의 -S옵션을 이용하여 컴파일 진행하면 세부 register레벨에서의 동작과정과 CPU의 Memory자원이 어떻게 할당되고 사용되는지 확인해 볼 수 있을 것이다. 

두번째 2,3의 특성을 살리기 위하여 1의 방식과 프로그래밍 습관을 과감하게 버려야 제대로 C++을 활용할 수 있다.


 

Histroy.

C언어의 탄생배경 OS는 컴퓨터 리소스관리 및 유저와 컴퓨터간 연결해주는 일련의 프로그램들의 집합체이지만 과거 low-level언어인 어셈블레벨에서의 프로그램은 새로운 하드웨어에 새롭게 새로운 성을 쌓는 작업이기 떄문에 여러 어려움이 존재했고. High Level언어의 필요가 요구되는 상황이었기 떄문에 시스템체제의 언어로 하드웨어와 가장 근접한 C언어가 탄생하게 됨.

여기서 컴퓨터 언어는 데이터와 알고리즘 두가지 개념을 다루는 학문으로 데이터는 프로그램이 사용하고 처리하는 정보이고 알고리즘은 프로그램이 데이터를 처리하는 방식이다. 

C언어의 절차라는 의미는 데이터보단 알고리즘에 더 집중하는 개념으로, 컴퓨터가 수행하는 일련의 알고리즘에 더 집중하겠다는 의미이다. 즉 컴퓨터가 수행할 동작을 명확하게 구분하고, 구분된 동작을 프로그래밍 언어로 구현하는 행위라고 보면된다.

여기서 구분된 동작을 기준으로 한 쪼개어진 작업이 크다면 계속해서 작은단위로 쪼갠다. 그렇기 때문에 C언어에서는 작은 동작단위를 기준으로한 Function기반의 여러 프로그램 Structured Programming 방식을 통하여 개발하게 된다.

그러나 Structure Basic Programming 방식이 간결, 신뢰, 유지보수 측면에서 매우 효율적이지만 규모가 큰 프로그램의 경우 여전히 어렵다 ( 함수 , Object file, path, 분리된 Src file , 여러 Header file등의 원인으로... ) 이러한 문제를 해결하기 위해서 객체지향이 등장한다.

- 절차지향언어는 알고리즘을 강조한다. 하지만 객체지향언어는 데이터에 집중하게 된다. -

데이터 타입을 강조하는 객체지향 c++언어에서 Class 개념이 등장하는 배경이기도 하다. 해결해야하는 문제의 특성에 맞는 Data Type을 결정하여 설계하기 위한 방식으로 보면 된다.

*Class는 해결해야할 문제의 특성에 맞게 데이터형 자체를 설게하기 위한 목적으로 설계되는 새로운 데이터타입이다.

*Object는 Class에의하여 만들어지는 특정 데이터 구조로 보면된다.

예를들어 보자면 Person Property ( Name, Age, Address, Degree, Score , etc... ) 여기서 Person은 객체로 나타낼 수 있으며 . 클래스는 객체를 나타내는 데이터와 해당 데이터를 대상으로 수행할 수 있는 동작 부분으로 정의할 수있다고 보면 된다. 

위의 예를 개발자의 입장에서 보면 Person Properties에 해당하는 클래스를 먼저 정의하고 필요할때 클래스를 활용하여 객체를 생성하면된다. 

즉 . OOP Program을 설계하기 위해서는 프로그램이 다루어야 하는 객체를 정확하게 서술해주는 클래스를 먼저 설계해야한다. 

데이터와 메서드를 클래스 정의 안에 함께 넣을 수 있다는 것 외에도 OOP는 몇 가지 장점을 더 가지고 있으며 C절차지향에서는 Top-Down형식의 설계라고한다면 OOP는 bottom-up방식의 프로그래밍이라는 특징역시 가지고 있다. (하향식 클래스를 구성하며 고수준의 프로그램을 설계하는 방식으로의 진행이 그런것들이다. ).

OOP 특징 1. 소스코드를 재활용이 가능하기 때문에 효율성이 올라간다, 2. 정보 은닉이 가능하기 때문에 데이터가 안전하다. 3. polymorphism을 이용하여 이름이 같은 연산자와 함수를 여러 벌 정의할 수 있기 때문에 상황에 따라 적당한 연산자나 함수를 프로그램이 스스로 선택하게 할 수 있다. 4. inheritance (은닉)을 이용하여 하나의 클래스로부터 새로운 클래스를 유도 하는 등 절차적 프로그래밍과는 완전히 다른 접근 방식을 취할 수 있다. 

-> 해결 하는 작업보단 개념 자체를 표현하는것에 주안점을 두고 상향식 프로그래밍 방식을 취한다. 


c++과 일반화 프로그래밍 방식.

목적 : 기존의 소스코드를 쉽게 재활용하여 작업 효율성을 높이기 위함 / 추상화 기술을 공유하기 위함./ 

OOP는 데이터를 강조하지만 일반화 프로그래밍은 알고리즘 측면을 강조한다. 

일반화는 데이터형과 무관한 코드를 작성하는것을 의미하며 데이터 sorting , list merge에 편리한 장점이 있으며ㅑ 대형 프로젝트에서는 OOP언어가 좋다고 본다. 

 

 

 

반응형
LIST