Develop/C, C++

[C++/1편 - 개념편] C++ Setting & Variable, Basic Concept

JuniTech 2023. 9. 12. 21:03
728x90

 

C++

이번 포스팅에서 우리가 배워볼 것은 다음과 같다.

  1. 들어가기 전 기초 개념 & 상식 정리
  2. C++의 언어의 역사와 특징
  3. 비주얼 스튜디오 설치
  4. 입출력 학습 / 간단한 예제 프로그램을 컴파일하고 실행하기
  5. 변수와 수식의 개념을 학습하기
  6. 정리

 

1. 들어가기 전 개념 & 상식 정리

* 기계어 : 0과 1로 구성되어 있는 "001101110001010..."과 같은 형태. 컴퓨터는 전기 신호인 on과 off로 전달하므로 0과 1로 이루어져 있는 것이다.

* 절차 지향 프로그래밍(procedural programming) : 기본적으로 프로시저를 사용하여 프로그램을 작성하는 프로그래밍 방식이다. 선형적으로 이루어져 있다. 참고로 객체 지향 프로그래밍에서는 데이터와 알고리즘이 묶여있다.(비선형적)

* 통합 개발 환경(IDE: integrated development environment) : 프로그램 개발에 필수적인 편집, 컴파일, 실행, 디버깅 기능을 하나로 통합한 도구이다.

 

2. C++의 언어의 역사와 특징

C++는 1980년대 초에 AT&T 벨연구소의 Bjarne Stroustrup에 의하여 개발되었습니다. C++는 C언어를 유지한 상태에서 좀 더 확장한 것이라고 볼 수 있습니다. 그 확장된 부분이 바로 Class 개념이니 C + Classes => C++인 셈입니다.

C++는 C언어에 클래스 개념을 추가하고 이어서 가상 함수, 연산자 중복 정의, 다중 상속, 템플릿, 예외 처리 등이 차례로 추가되었습니다.

[C++의 설계 철학]

  • 엄격한 타입 검사를 가진다.
  • 범용 언어이다.
  • 객체 지향적으로 작성하게 된다면 효율적이고 이식성이 뛰어나게 된다!
  • 여러 가지의 프로그래밍 스타일을 지원한다.(절차 지향 프로그래밍 / 데이터 추상화 / 객체 지향 프로그래밍 / 일반화 프로그래밍)
  • 프로그래머가 자유롭게 선택할 수 있도록 설계되어져 있다.
  • 최대한 C와 호환되어져 있다.
  • 플랫폼에 의존적이거나 일반적이지 않은 특징은 제거되어져 있다.

 

[C++의 특징]

  • [매우 중요]클래스(class) - 클래스를 이용하여 하나의 객체의 속성과 동작들을 한 곳으로 모아서 정의할 수 있습니다!
  • 상속(inheritance) - 클래스를 상속받아서 기존의 코드를 재사용할 수 있어요!
  • 연산자 중복(operator overloading) - 대상에 따라서 동일한 연산자로 새로운 연산을 정의할 수 있어요!
  • 함수 중복(function overloading) - 매개 변수만 다르면 동일한 이름의 함수를 여러개 만들 수 있어요!
  • new와 delete 연산자 - 동적 메모리의 할당과 해제를 담당하는 연산자
  • 제네릭(generics) - 클래스 정의를 자료형에 상관없이 재사용하는 기술

 

[모던 C++]

C++ 11과 C++ (14)는, 많은 새로운 기능을 도입했다. 그 기능들은 아래와 같다.

  • 범위(range) 기반의 반복 루프 기능
  • 타입 자동 추론 기능(auto)
  • 보편적인 초기화
  • 람다식

C++ 버전별 변화과정

[C++는 어디에 사용되는가?]

언어별 랭킹

C++는 실행속도가 C#, Java, Perl, Python에 비해 빠른편이라서 주로 하드웨어 접근할 때 많이 쓰는 편이다.

cf) 삼성전자는 여전히 절차지향 언어를 사용하는 편이다. (간단한 프로그램인데 C++로 객체지향 코드 작성하면 code over될 수 있다.)

 

[C++의 장점]

  • C++로 작성된 프로그램은 속도가 빠르다.
  • C++은 멀티패러다임 프로그래밍을 지원한다. 즉 절차지향, 객체 지향, 제네릭 방법을 동시에 지원한다.
  • 하드웨어에 접근할 수 있다.
  • 메모리를 효율적으로 사용한다.
  • C언어 프로그램을 그냥 가져다가 사용할 수 있다.
  • 고성능의 게임이나 인공지능, 장치 드라이버에 적합하다.

 

3. 비주얼 스튜디오 설치

 

Visual Studio: 소프트웨어 개발자 및 Teams용 IDE 및 코드 편집기

Visual Studio 개발 도구 및 서비스를 사용하면 모든 개발자가 모든 플랫폼 및 언어로 앱을 쉽게 개발할 수 있습니다. 무료로 어디서나 코드 편집기 또는 IDE를 사용하여 개발하세요.

visualstudio.microsoft.com

Visual Studio 공식 사이트 들어가서 커뮤니티 버전으로 Download 하면 된다.

쭉 설치한 다음에, 워크로드 단계에서 'C++를 사용한 데스크톱 개발'을 체크해주고 설치해주면 C++를 사용할 준비가 완료되었다.

그 다음에 새 프로젝트를 만든 후, 솔루션 탐색기에서 소스파일에 우클릭 -> 추가 -> 새 항목을 선택하여 새 소스 파일을 만들면 이제 코딩할 준비까지도 완료했다.

 

4. 입출력 학습 / 간단한 예제 프로그램을 컴파일하고 실행하기

 

#include <iostream>						// 헤더파일(input output stream : 내보내고 가져오는 stream을 담당하는 라이브러리)

using namespace std;					// 이름 공간 설정

int main() {							// 함수 선언
	cout << "hello world" << endl;		// cout : 모니터로 내보내라 | cin : 컴퓨터로 들여보내라
}

// return 0; 메인함수로 0이 반환되었다(코드가 잘 마무리되었다는 뜻)

여기서 using namespace std;를 안쓰면 아래의 cout와 endl를 사용할 수 없기 때문 오류가 발생된다. 그냥 cout와 endl를 부른다는건 글로벌하게 부른다는 것이다. 즉 '철수야'라고 그냥 부른다면 누구 집에 사는 철수를 부르는지 부르는 셈. 따라서 std를 사용해서 std 공간 안에 있는 철수를 부를 수 있게 using namespace std;를 만들어주는 것이다. std(클래스)에는 cout, endl, cin를 포함하여 자주 사용되는 함수들로 정의되어져 있다.
아, 물론 아래 cout << "hello world" << endl; 대신 std::cout << "hello world" << std::endl; 로도 할 수 있지만 귀찮으니 이렇게 using namespace std;로 사용하는 편이다.

또한 여기서 cout는 Consle Output(콘솔 출력)을 의미하고 endl는 End of Line을 의미한다. endl까지 입력하면 콘솔창에는 다음 라인으로 넘어가진다.

마지막에서 'return 0;' 문장이 실행되면 main() 함수는 작업을 끝내고 외부로 0값을 반환한다. 0을 반환하면 "잘 무리없이 동작한다"는 의미로 받아들이면 된다.

 

int i;
cin >> i;	// 정수를 읽어서 i에 저장한다.

double f;
cin >> f;	// 실수를 읽어서 f에 저장한다.

다음 코드는 입력과 관련해서 코드를 정리한 것이다. cin은 Consle Input(콘솔 입력) 이라는 의미이다.

5. 변수와 수식의 개념을 학습하기

변수(variable)는 데이터(값)를 저장하는 상자라고 보면 된다.

// 변수 선언 정리

int i;				// 변수 i를 선언한다.(RAM에 i라는 그릇이 하나 생성)
i = 100;			// 변수 i에 100을 저장한다.

int i = 100;		// 변수 i를 선언하고 100을 초기화한다.(3~4줄 코드를 한 줄로 압축한 것)

int i {100};		// int i = 100; 과 동일
string s {"hello"};	// string s = "hello";과 동일

여기서서 '=' 과 '==' 은 다르니 주의하자.('=='는 비교연산이다.)  참고로 int는 integer(정수)이고 string은 문자열 이다.

자료형 크기

예시로 여기서 bool형을 뽑자면 bool형은 1byte, 즉 8bit 이므로 2의 8승(0~255)까지의 표현력이 생긴다. (∵한 자리에 0 또는 1이 들어가므로)

한편, long long과 long double의 경우, 얘네는 특별하게 엄청난 긴 숫자를 쓸 때만 사용한다. 그 외 나머지는 자주 쓰는 자료형들이다.

연산자 의미
x + y x와 y를 더한다
x - y x에서 y를 뺀다
x * y x와 y를 곱한다
x / y x를 y로 나눈다
x % y x를 y로 나눈 나머지

 

 

6. 정리

앞으로 우리가 많이 칠 코드에 대해서 한 번에 모아 정리했으니 주석 설명 참고하여 이해해보자.

#include <iostream>	// 헤더파일(input output stream : 내보내거나 가져오는 stream을 담당하는 라이브러리)
#include <string>

using namespace std;		
/* 이름 공간 설정(std 안쓰면 오류 발생 why? 아래의 cout와 endl를 사용할 수 없기 때문
그냥 cout와 endl를 부른다는건 글로벌하게 부른다는 것이다. 
즉 '철수야'라고 하면 누구 집에 사는 철수를 부르는지 부르는 셈
따라서 std를 사용해서 std 공간 안에 있는 철수를 부를 수 있는 것.
아래에 std::cout << "hello world" << std::endl; 로도 할 수 있지만 귀찮으니 
이렇게 using namespace std;로 사용해도 된다.
*/

auto add(int x, int y) {
	return x + y;
}


int main() {			// 함수 선언
	cout << "hello world" << endl;	
    // cout : 모니터로 내보내라(출력) | cin : 컴퓨터로 들여보내라(입력) | endl : end of line
	
	// 변수의 선언
	int i;				// 변수 i를 선언한다.
	i = 100;			// 변수 i에 100을 저장한다.
	// int i = 100;		// 변수 i를 선언하고 100으로 초기화한다.
	// int i { 100 };	// int i = 100;과 동일하다.
	string s{ "hello" };// string s = "hello";과 동일하다.

	// 논리형
	bool b1;
	b1 = true;
	cout << b1 << endl;

	// 문자형
	char ch;
	ch = 'a';
	cout << ch << endl;

	// 문자열
	string s1 = "Good";
	string s2 = "Morning";
	string s3 = s1 + " " + s2 + "!";
	cout << s3 << endl;

	// 문자열 연습1
	string s4 = "Good";
	string s5 = "Bad";
	bool b2 = (s4 == s5);
	cout << b2 << endl;

	// 문자열 연습2
	string s6 = "사과";
	string s7;
	s7 = s6 + " " + to_string(10) + "개";	
    // string + int는 올바르지 않은 문법이므로 to_string을 사용한다.
	cout << s7 << endl;
	
	// 기호 상수(절대 바뀌지 않는 것. ex: PI)
	const double TAX_RATE = 0.25;	
    // 기호 상수 선언(보통 변하지 않는 변수는 대문자로 쓰는 것으로 사람들끼리 약속한다.)
	int income = 1000;
	income = income - TAX_RATE * income;

	// auto 키워드(자동 타입 추론 automatic type deduction)
	/* 비유 : 밖에서 누군가 배식을 해줄 때 그 사람이 뭘 줄지 모르니 
    내가 그것에 맞는 그릇을 가지고 가는 것
	즉, 자료를 던져주면 알아서 그릇을 준비하라는 키워드. 
	되게 단순해보이지만 나중에 객체(class)를 받을 때 자료형이 다양해져서
	이것을 해결할 때 auto를 사용하면 편리하다. 
	우선은 원래 있던 자료형들을 써보는 것을 추천하고 나중에 복잡해질 때
	auto 키워드를 사용하는 것을 추천.(공부 순서에 적절) */
	auto d = 1.0; // 그럼 d는 double 형이 된다.ㅁ
	auto sum = add(5, 6);	// sum은 int 형이 된다.

	// 이름 입력받아서 출력하기
	string name;
	cout << "이름을 입력하시오: ";
	cin >> name;
	cout << name << "님 환영합니다." << endl;
	return 0;	// return 0; 메인함수로 0이 반환되었다(코드가 잘 마무리되었다는 뜻)
}

정리 코드 결과값