이것저것 공부기록
WEEK_1 과제3 C++ 기초 본문
1. C vs C++
C++은 기존의 C언어에 여러 가지 기능을 추가하여 만든 프로그래밍 언어이다. C언어를 기초로 삼아 만들었기 때문에 C언어의 표준 라이브러리를 그대로 가져와서 쓸 수 있다. C언어는 절차식으로 작성하기 적합한 프로그래밍 언어로, 절차지향성 특징을 가진다. 즉 어떤 일을 진행할 때 순차적으로 진행한다. 반면에 C++은 객체 지향 프로그래밍(OOP, Object Oriented Programming)에 적합한 언어이다. 객체지향 프로그래밍이란, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법을 말한다.
2. C++의 특징
1) C언어와의 호환성
2) 객체 지향 개념 (캡슐화, 상속, 다형성) → 세부적인 개념은 C++을 공부해나가면서 이해해가자.
3) 타입 체크를 엄격하게 해 실행 시간 오류의 가능성을 줄이고 디버깅을 도움
4) 실행 시간의 효율성 증대
3. C++ 프로그래밍의 기본
1) 주석문 : 한 줄 주석 //, 여러 줄 주석 /*~*/
2) main 함수 : C++ 프로그램의 실행을 시작하는 함수 (1, 2번은 C언어와 동일하다.)
3) namespace : 이름이 기억되는 영역을 뜻하며, 이름이 소속된 공간을 의미한다. C++프로그램을 작성할 때 발생하는 이름에 대한 충돌을 방지한다.
4)#include <iostream> : 전처리기 지시, iostream 헤더 파일 안에는 표준 입출력을 위한 클래스와 객체, 변수 등이 선언 되어 있다. C++의 모든 것은 객체로 표현되므로, 입출력을 담당하는 수단 또한 C언어의 함수와 달리 모두 객체이다.
전처리기 지시와 네임스페이스에 속한 std의 정의를 간단하게 사용하기 위해 보통 위와 같은 명령문을 추가한다.
(C언어와 같이 C++의 모든 명령문은 세미콜론(;)으로 끝나야 한다.)
5) cout & << : 출력을 위한 객체와 연산자
cout은 iostream 헤더 파일로 선언되고 std 공간에 선언되어 std::cout << 출력할 데이터; 로 사용한다.
<< 연산자를 사용한 후 다음에 오는 문자('A'), 문자열("text"), 숫자(123) 등을 출력할 수 있다.
<< 연산자를 사용한 후 std::endl 이 오면 줄이 끝났음을 말해주고 다음 행으로 넘어간다.
std:: 을 매번 타이핑하는 것이 불편하기 때문에 생략하기 위해서 using namespace std; 명령문을 프로그램 시작할 때 추가하는 것이다.
6) cin & >> : 입력을 위한 객체와 연산자
cin은 키보드와 연결된 C++ 입력 스트림 객체로써 std 공간에 선언되어 std::cin >> 입력할 데이터; 로 사용한다.
>> 연산자는 입력된 스트림에서 값을 읽어 변수에 저장한다.
엔터키가 입력되면입력 버퍼에 있는 키가 변수에 전달된다.
이때 cin 객체는 자동으로 사용자가 입력한 데이터를 오른쪽에 위치한 변수의 타입과 동일하게 변환시켜준다.
7) C언어와 C++ 비교
C언어 | C++ |
printf | cout |
scanf | cin |
\n | endl |
<stdio.h> | <iostream> |
8) 다양한 표현 방식 적용해보기
이 세 가지의 출력은 아래와 같이 동일하다.
4. 연산자
1) 산술 연산자
산술 연산자 | 설명 |
+ | 더하기 |
- | 빼기 |
* | 곱하기 |
/ | 나누기 |
% | 나머지 값 반환 |
2) 대입 연산자
대입 연산자 | 설명 |
= | 대입 / a=5 |
+= | a+=3은 a=a+3과 동일 |
-= | a-=3은 a=a-3과 동일 |
*= | a*=3은 a=a*3과 동일 |
/= | a/=3은 a=a/3과 동일 |
%= | a%=3은 a=a%3과 동일 |
3) 증감 연산자
증감 연산자 | 설명 |
++ | a++은 a=a+1과 동일 |
-- | a--은 a=a-1과 동일 |
전위 연산자: 다른 연산들에 앞서 증감 후 다른 연산 처리
후위 연산자: 다른 연산들을 미리 처리 후 증감 처리
4) 관계 연산자 (C++에서 거짓(false)은 0이며, 0이 아닌 모든 것은 참(true)로 인식된다.)
관계 연산자 | 설명 |
== | 두 값이 같으면 참 |
> | 왼쪽 값이 크면 참 |
< | 오른쪽 값이 크면 참 |
>= | 왼쪽 값이 크거나 같으면 참 |
<= | 오른쪽 값이 크거나 같으면 참 |
!= | 두 값이 다르면 참 |
5) 논리 연산자 (참이면 1 반환, 거짓이면 0 반환)
논리 연산자 | 의미 | 설명 |
&& | AND / 그리고 | 둘 다 참이면 참 |
|| | OR / 또는 | 둘 중 하나라도 참이면 참 |
! | NOT / 부정 | 참이면 거짓이고 거짓이면 참 |
5. 문자열
1) string 클래스 방식
cin & >> 은 아래와 같이 띄어쓰기를 인식하지 못한다.
따라서 cin.getline 을 사용하여 공백이 포함된 문자열을 입력한다.
char 문자열이름 [문자열 크기];
cin.getline(문자열이름, 크기, 입력 중단시킬 임의의 문자); 로 사용한다. 임의의 문자를 지정하지 않는다면 디폴트 값은 \n이다.
cin.getline은 문자열의 크기를 지정해줘야 했다면, 문자열의 크기를 모를 때 쓸 수 있는 명령어가 있다.
string 클래스 방식은 <string> 헤더 파일로 선언되며 문자열 크기에 제약이 없고, 띄어쓰기를 인식할 수 있기 때문에 C++에서 추천하는 입력 명령어이다. C++에서 string 객체를 사용한 문자열 선언 방식은 다음과 같다.
string 클래스를 사용하기 위해서 #include <string>으로 string 헤더 파일을 포함해야 한다. C언어에서 문자형 배열 사이의 대입 작업은 strcpy() 함수나 strncpy() 함수를 사용했다. 하지만 string 객체를 이용한 문자열에서는 위와 같이 대입 연산자(=)만을 사용하여 간단히 대입 작업을 할 수 있다.
위의 예제에서 문자열 str1은 선언 시 길이가 0인 string 객체를 생성하고. 그 후 문자열을 초기화하면 C++ 프로그램이 문자열 str1의 길이를 자동으로 조절해 준다. 따라서 string 객체를 사용하면 문자형 배열을 사용하는 것보다 훨씬 더 편리하고 안전하게 문자열을 처리할 수 있다.
string 객체를 이용한 문자열의 입력에는 cin 객체를, 출력에는 cout 객체를 사용할 수 있다. 하지만 cin 객체를 이용한 문자열의 입력은 한 단어 단위로 수행되기 때문에, 문자열을 한 행(line)씩 읽고 싶을 때는 getline() 함수를 사용해야 한다.
getline(cin 객체, 저장할 string 객체 변수); 로 사용한다.
6. string 클래스 멤버 함수(메소드)
1) length() 함수 : 문자열의 길이를 나타내는 함수 / 문자열.length()
2) size() 함수 : 해당 string 객체가 메모리에서 실제 사용하고 있는 크기를 나타내는 함수 / 문자열.size()
length() 함수와 size()함수는 의미는 약간 다르지만 언제나 같은 값을 반환한다.
3) append() 함수 : 하나의 문자열이 끝에 다른 문자열을 추가하는 함수
문자열.append(추가할 문자열); → 추가할 문자열을 맨 끝에 추가
문자열.append(추가할 문자열, 시작 위치, 개수); → 추가할 문자열의 시작 위치부터 개수만큼만 맨 끝에 추가
문자열.append(개수, 추가할 문자); → 추가할 문자를 개수만큼 맨 끝에 추가
4) find() 함수 : 특정 문자열을 찾아 그 시작 위치를 반환하는 함수
문자열.find(찾을문자열); → 인덱스 0부터 찾을 문자열을 찾아, 그 시작 위치를 반환
문자열.find(찾을문자); → 인덱스 0부터 찾을 문자를 찾아. 그 시작 위치를 반환
문자열.find(찾을문자열, 시작위치); → 시작 위치부터 찾을 문자열을 찾아. 그 시작 위치를 반환
마지막 줄 출력을 보면, 해당 문자열에서 찾을 문자열을 찾지 못해 이상한 값이 출력된 것을 볼 수 있다.
5) compare() 함수 : 두 문자열 간의 내용을 비교하는 함수
str1.compare(str2) == 0 → str1과 str2이 같을 경우
str1.compare(str2) < 0 → str1이 str2보다 사전 편찬순으로 앞에 있을 경우
str1.compare(str2) > 0 → str1이 str2보다 사전 편찬순으로 뒤에 있을 경우
이 함수는 조건문을 활용하여 확인해보았다.
6) replace() 함수 : 특정 문자열을 찾아 그 문자열을 다른 문자열로 대체하는 함수
문자열.replace(대체할 문자열의 시작 위치, 대체할 문자열의 길이, 새로운 문자열);
→전달된 시작 위치부터 문자열의 길이만큼을 제거한 후, 새로운 문자열 삽입
replace() 함수를 사용하기 전에 우선 find() 함수를 사용하여 해당 문자열이 존재하는지 확인하는 것이 좋다.
+) 5행에 있는 문법인 index에 관해서는 아직 잘 모르기 때문에 관련 개념을 공부한 이후에 다시 복습해야겠다. 아마도 해당 문자열이 어디있는지 찾고, 그 위치를 저장해두는 문법인 것 같다.
7) capacity() 함수 : 해당 문자열이 재대입을 받지 않고 저장할 수 있는 최대 문자열의 길이를 반환한다.
문자열.capacity()
8) max_xize() 함수 : 해당 문자열이 최대한 대입받으면 가질 수 있는 최대 문자열의 길이를 반환한다.
문자열.max_xize()
이외에도 많은 string 함수가 있으니 그때그때 찾아서 활용하자.
7. 문자열 처리 함수
1) strlen() 함수 : 문자열의 길이를 반환하는 함수 / strlen(문자열 이름);
2) strcpy() 함수 : 문자열을 복사하는 함수 / strcpy(받을 문자열, 복사할 문자열); , strcpy(배열명, "문자열");
3) strncpy() 함수 : str(=string), n(=number), cpy(=copy)를 뜻하는데 number 가 추가되었으므로 n 만큼만 복사하는 함수이다. / strncpy(받을 문자열, 복사할 문자열, 복사할 문자의 수);
strncpy 함수를 사용하려고 하니 보안 상의 문제 때문에 strncpy_s를 대신 쓰라는 오류가 떠서 일단 그렇게 사용했다.
4) strcat() 함수 : 문자열을 이어 붙이는 함수 / strcat(받을 문자열, 복사할 문자열);
*받을 문자열 끝에 있는 '\0'이 사라지고 그 위치에 바로 복사할 문자열이 붙는 것이 특징이다.
*copy 문자열의 배열의 길이를 지정하지 않고 실행했더니(origin처럼) 빌드는 성공했지만 실행에서 에러가 발생했다. 이로써 이어붙일 문자열에 배열의 크기가 넉넉하게 있어야 한다는 것을 알 수 있었다.
5) strncat() 함수 : 문자열을 n개를 이어 붙이는 함수 / strncat(받을 문자열, 복사할 문자열, 문자 개수);
*받을 문자열 끝을 가리키는 '\0' 기호의 위치에 '\0'을 없애고 복사하려는 문자열의 문자 n번째까지 붙이는 것이 특징이다.
'언어 > C++ 스터디' 카테고리의 다른 글
WEEK_7 과제 1 참조 (0) | 2020.07.27 |
---|---|
알고리즘 기수스터디 - 하노이 탑 (0) | 2020.07.22 |
WEEK_3 과제 1 포인터 (0) | 2020.05.22 |
WEEK_2 과제2 별 찍기 시스템 (0) | 2020.05.17 |