다시 한번 말하자면
C++ 공부는 C언어에서 Java로 넘어가는 과정을 원활하게 하기 위해
배우는 것이지
C++ 언어 그 자체를 공부하고자 하는 것이 아니다.
오늘 배울 목차
1. Programming 방법론
2. 객체 지향 vs 절차 지향
3. C++ 시작
1. Programming 방법론
◎Programming 방법론
1. 순차 지향 프로그래밍
2. 절차 지향 프로그래밍
3. 객체 지향 프로그래밍
4. 함수형 프로그래밍
처음 컴퓨터 언어는 순차 지향 언어였다.
즉 맨 위부터 아래로 순서대로 모든 것을
다 작성하고 실행하는 방식이었다.
이후
이전까지 공부한
c언어와 같은 절차 지향 언어가 나타났다.
이때 함수(function)를 이용해서 코드를 더 간결하게
사용하는 방법이 생겼다.
그런데 graphic이라는 게 나오면서
명령줄 인터페이스가 아닌
그래픽 인터페이스가 나왔고
문제가 발생했다.
절차 지향 언어 역시 순서대로 실행하는 것이다.
그러나 그래픽 인터페이스에서는
순서대로 실행하지 않는다.
user가 클릭하는 프로그램 혹은 기능이 실행되는 형태이기 때문이다.
이를 해결하기 위해 객체 지향 프로그래밍이 나왔다.
변수처럼 데이터만 가지고 있는 것이 아닌
기능 또한 가지고 있는 객체라는 것이 생긴 것이다.
C언어에서 Java로 바로 넘어가면
초반에 힘든 점이 많아서
그 중간다리 역할로
C++을 공부하는 것이다.
C언어 | C++ | Java |
절차 지향 | 객체 지향 도입(절차, 객체 둘다 가능) | 객체 지향 |
CLI(명령줄 인터페이스) | GUI(그래픽 인터페이스) |
그리고 Kotlin이라는 언어가 Java를 보완하는 것도 있지만
C++의 문법과 더 비슷하다고 한다.
2. 객체 지향 vs 절차 지향
자 그런데 코딩을 처음 하는 사람은
절차 지향이 뭐야?
객체 지향이 뭐야?
라는 생각이 들 것이다.
이를 비교해서 설명해 보겠다.
계산기를 만들어야 하는 상황을 가정해 보자.
절차 지향 | 객체 지향 |
입력 기능 만들기(scanf_s..등) | '입력 기능을 가진 녀석' 가져다 쓰기 |
계산 기능 만들기( +, *, /, 형변환... 등) | '계산 기능을 가진 녀석' 가져다 쓰기 |
출력 기능 만들기(printf..등) | '출력 기능을 가진 녀석' 가져다 쓰기 |
What, How | Who, When |
절차 지향 언어라면
수를 입력받는 기능 먼저 생각을 할 것이다.
이를 scanf로 쓸 것인지 다른 것으로 쓸 건지,
%d를 써야 하는지 등을 생각할 것이다.
그러나
객체 지향 언어
역시 입력받는 기능 먼저 생각을 한다.
하지만 입력을 누가 할 수 있지?를
먼저 떠올린다.
그리고 그 녀석을 가져와 사용한다.
3. C++ 시작
C++ 언어로의 전환하기 위해선
C언어와 다른 점 10개를 알아야 한다.
1. printf() → cout << 10 ;
scanf() → cin >> 변수 ;
2. 변수 선언 위치 free
3. 함수 오버로딩(Overloading) - java에서 많이 씀
4. 함수 매개변수의 Default 값 - java엔 없고 kotlin엔 있음
5. inline 함수 - 다른 언어에선 없음
6. namespace
7. 새로운 자료형(true, false)
8. 참조자 Reference - c++에서만 사용
9. Heap 메모리 사용 Keyword
10. 헤더문서
그전에 솔루션 부터 만들어보자.

기존과 방식은 같다.
다만 소스파일에 새 항목을 추가할 때
이름에 .c가 아닌 .cpp를 해주면 된다.
(혹은 아예 확장자명을 안 적어도 된다.)
그리고 우리가 C언어 할 때 항상
<Stdio.h>를 했듯
<iostream>을 써줘야 한다.
input output stream이라는 뜻이다.
※<stdio.h> → <iostream>

1. printf() → cout << 10 ;
scanf() → cin >> 변수 ;

cout은 출력 기능을 가진 친구이다.


"\n"(줄 바꿈)은 문자열(문자열에서만 ""를 쓰기 때문에)에만 사용 가능하지만
C++ 에선 << 을 사용하면 계속 출력이 가능하다.
"\n" 대신 std::endl를 사용해도 된다.


입력 기능도 간단하다.
우리가 원래 아는 C언어처럼 변수를 만들고 입력해 주면 된다.

2. 변수 선언 위치 free
말 그대로 변수를 아무 데나 선언해도 된다.
3. 함수 오버로딩(Overloading) → 함수명은 같고 파라미터가 다른 함수 (자료형, 파라미터의 개수)

서로 같은 이름을 가진 aaa라는 함수가 있는데
하나는 파라미터를 가지고 하나는 가지고 있지 않다.
둘은 서로 다른 함수라고 구별이 되는 것이다.(C는 안된다.)

void aaa()와 void aaa(int n), void aaa(int x, int y)는 오버로딩이 가능하다.
그러나 int aaa(int a)는 되지 않는다.
자료형만 다르다고 해서 오버로딩이 되는 것이 아니며
파라미터에 적는 변수명이 다르다고 해서 오버로딩이 되는 것이 아니다.
기억하자! 자료형과 파라미터의 개수가 달라야 한다.
이게 왜 필요할까?
이 기능은 사용자를 배려한 기능이다.
덧셈을 하는 add라는 함수를 만든다 생각해 보자.
근데 파라미터에 정수 + 정수가 들어갈 수도 있고
실수(double) + 실수 형도 들어갈 수도 있다.
이렇게 다른 자료형과 파라미터 개수에 대응하기 위해
생긴 기능이다.
4. 함수 매개변수의 Default 값

이런 경우 aaa()에 파라미터 값을 안 줘서
에러가 난다.
이런 경우 에러를 없애기 위해 default 값을 줄 수 있다.

void aaa(int n=3)에서 볼 수 있듯
n=3이라는 default 값을 넣을 수 있다.
aaa(10)을 했다고 해서 13이 되는 것이 아니라
입력하지 않았을 때 n=3으로 설정하는 것이다.
default 값을 설정할 때 중요하게 알아야 하는 사항이 있는데
함수 오버로딩이 불가능하다.

이 경우 aaa()를 입력하면
어디로 가야 하는가?
위에서 말했듯 default 값을 설정하면
입력하지 않았으면 default 값으로 계산하게 되어있는데
aaa() 함수가 생겨버리면 컴퓨터가 어디로 넣어야 하는지
모르게 돼서 에러가 나는 것이다.
5. inline 함수
inline 함수는
함수 앞에 쓰는 것으로
예를 들어 inline void aaa() 이렇게 쓸 수 있다.
이 함수를 쓰면 그 함수 안에 있는 코드들이
main 함수에서 호출한 곳에 직접 있는 가서 순서대로 있게 하는 방식이다.
(원래 함수를 쓰면 그 함수가 호출되었을 때, 함수가 있는 위치로 가서 계산하고 다시 호출된 곳으로 돌아가는 방식)
다른 언어에선 사용하지 않는다고 한다.
6. namespace
만약 여러 명이 작업을 할 때
2명 이상의 개발자가
같은 이름의 전역변수를 선언할 때는
당연히 에러가 생긴다.

이럴 때 사용하는 게 namespace이다.

메인 함수보다 전에 선언을 하여 구별을 해주는 것이다.

우리가 어떤 것을 출력할 때
std:: 를 쓰고 cout을 사용하는 것처럼
LEE 영역에 HP라는 변수를 사용할 땐
lee:: 를 사용해 준다.

이런 방식으로 구별이 가능하다.

그러나 사용할 때마다 계속 namespace를 선언해 주니 귀찮은 상황이 분명 발생한다.

이럴 땐 using park::HP;
이런 방식으로
사용이 가능하다
여기서 더 나아가서
std를 안 써도 cout 등을 사용할 수 있는 방법이 생긴다.

전역변수로 using namespace std;
를 사용해 주면 기존에 std::를 붙이던 것이 필요 없어진다.
7. 새로운 자료형(true, false)
기존에 c언어에선
true 값을 적용하기 위해선 1을
false 값을 적용하기 위해선 0을 넣었다.
그러나 C++ 에선 true와 false라는 새로운 자료형을 추가하였다.

여기서 C++의 특징이 또 하나 나오는데
c언어와 java 그 사이에 중간다리인 C++이라서
절차지향과 객체지향 둘 다 가능하다고 했다.
그래서 1,0을 true, false라고도 인식을 한다.
즉 1,0, true, false
다 사용이 가능하다.
또한 true와 false라는 것을 저장하는
bool이라는 새로운 자료형도 생겼다.(bool은 1byte)
변수에 true나 false 값을 저장할 수 있는 것이다.
이를 사용해서
무한반복문의 조건을 false로 바꿔서
끝낼 수도 있다.
break; 와 조건을 fasle로 바꾸는 것은 무슨 차이가 있을까?
break;는 해당 조건이 충족되었을 때
그 줄에서 바로 반복문을 종료한다.
그러나 조건을 false로 바꾸는 것은
해당 회차의 명령을 다 수행하고 종료한다.

bool은 이렇게도 값 저장이 가능하다.
8. 참조자 Reference - c++에서만 사용

이번엔 참조자 변수다.
참조자 변수는 자료형 다음에 &를 쓴다.
int& r = d;처럼 사용하며
쉽게 이야기하자면 별명이라고 생각한다.
국민 mc 유재석 님의 별명이 '메뚜기'이며
우리가 메뚜기라고 불러도 유재석 님이라는 것을
아는 것처럼
d라는 변수에 r이라는 별명을 부여한 것이다.
9. Heap 메모리 사용 Keyword()
c언어땐 Heap 메모리를 사용하려면
함수인 malloc()을 이용해서
Heap 메모리를 사용해야 했다.
그러나 C++ 에선 keyword가 생겼다.
malloc() → new
free() → delete

10. 헤더문서
iostream.h → iostream
stdlib.h → cstdlib
.h를 옛날 방식이고
원래 있던 헤더문서들을 사용하는 방법이 달라졌다.
.h를 날리고 맨 앞에 c를 붙여주면 된다.
'# 개발 > C언어' 카테고리의 다른 글
c언어 수행 능력 확인 문제 (1) | 2023.01.13 |
---|---|
c언어 #9 - 구조체 (국비11일차) (0) | 2023.01.13 |
c언어 #8 - 포인터 (국비10일차) (0) | 2023.01.12 |
c언어 연습문제 #8 (국비9일차) (0) | 2023.01.11 |
c언어 #7 - 배열, 문자열 (국비9일차) (0) | 2023.01.11 |