Intro
C++은 C언어를 기반으로 한 언어이다. 그리고 C언어 중 가장 큰 논점(이었던) 중 하나가 바로 goto문법이다.
jump statement
- 특정 지점으로 이동시키는 구문
goto는 대표적인 예시로 어셈블리어의 핵심 기능contonue,break,return과는 달리 정해진 규칙이 아닌 지정된 label로 이동- C와 C++에서도 비슷한 기능을 지원
#include <iostream>
#include <cmath> // for sqrt() function
int main()
{
double x;
tryAgain: // this is a statement label <----------------
std::cout << "Enter a non-negative number"; |
std::cin >> x; |
|
if (x < 0.0) |
goto tryAgain; // this is the goto statement------
std::cout << "The sqrt of " << x << " is " << sqrt(x) << std::endl;
return 0;
}
출처: https://boycoding.tistory.com/187 [소년코딩:티스토리]
- 단순히 보면 매우 편리해 보이지만
- 이동 지점을 직접 찾아야 하므로, 직관적으로 알기 어렵고
- 스파게티 코드가 될 가능성이 매우 높으며
- 논리적으로 매우 어려운 코드가 될 가능성이 높다(block 설정이 애매한 경우 등)
- 여러가지 예시가 있지만, 어셈블리할꺼 아니면 알 필요 없다
알아도 어셈블리어 이해하는데 도움 안된다 - 결론 : 이런 기능은 있으나, 쓰지마라
- 참고로 모든 알고리즘은 (two-way) selection과 pretest logical loops로 작성 가능한 것이 증명되었다고 한다.
OOP?
C언어의 절차지향형 언어에 답답함을 느낀 엘리트들이 객체지향 언어 특성을 추가해 만든게 C++이다 - 라고 알고 있었는데, 책을 피자마자 “C++은 OOP가 아니다”라는 문구부터 보고 충격먹은 기억이 있다.
그렇다면 C++은 OOP가 아닌가? C++은 어떤 언어인가?
Partial OOP
결론적으로 말하자면 C++은 OOP 기능을 지원하는 언어이다. 즉, OOP의 특징을 지원하나 반드시 지킬 필요는 없으며 C언어 스타일의 개발도 가능하다는 뜻이다.
- 일반적으로 Inheritance, Polymorphism 그리고 Encapsulation 특징을 가진 언어를 OOP라고 말함
- Inheritance : 코드 재사용성
- Polymorphism : run-time binding
- Encapsulation : 데이터 추상화(데이터 보안 또는 보호)
- 하지만 C++의 경우 OOP의 특성은 선택사항이며, 반드시 지킬 필요는 없음
- 다음과 같은 반례들이 있다.
Class
- class구조를 반드시 생성할 필요는 없으며
- 특히 main 함수의 경우 class 외부에서 별도로 동작
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout << "Hello World";
return 0;
}
Global variable
- 전역 변수 설정 및 변경 가능
- 즉 데이터의 보호, encapsulation이 필수가 아님
#include <iostream>
using namespace std;
// Global variable declaration:
int g = 50;
int main ()
{
// global variable g
cout << g;
// Local variable g
g = 20;
cout << g;
return 0;
}
>>> 50 20
Friend function
- Friend로 선언된 다른 클래스의 private 및 protected 멤버에 접근 가능
- 즉 특정 클래스가 다른 클래스의 private 멤버에 접근을 허용
- 이건 처음 안 사실이라 좀 더 공부해봐야 알겠지만
- 단순한 scope의 확장인지, alias의 class 버전인지 아니면 다른 메커니즘인지 모르겠다.
정리
다중 패러다임 지원
C++은 절차적, 객체지향, 제네릭, 함수형 프로그래밍까지 모두 지원합니다.
| 패러다임 | 예시 문법 |
|---|---|
| 절차지향 | int main() 내에서 흐름제어 |
| 객체지향 | class, virtual, override, this |
| 제네릭 | template<typename T> |
| 함수형 | std::function, lambda, constexpr, ranges (C++20~) |
참고
C
Contents
