728x90
- C++을 배우면 어떤 언어를 배울 때 도움이 될까?
- Java: 객체 지향 프로그래밍 개념이 유사하며, 문법도 비슷합니다.
- C#: Microsoft의 .NET 프레임워크용 언어로, C++와 문법이 매우 유사합니다.
- Objective-C: iOS 개발에 사용되며, C++와 비슷한 문법 구조를 가집니다.
- Rust: 시스템 프로그래밍 언어로, C++와 유사한 성능 특성을 가집니다.
- Go: 구글이 개발한 언어로, C++의 일부 개념을 단순화했습니다.
- Python: 문법은 다르지만, C++의 객체 지향 개념을 이해하면 학습에 도움이 됩니다.
- JavaScript: 웹 개발에 주로 사용되며, 객체 지향 개념이 유사합니다.
- Swift: Apple의 iOS 개발 언어로, 현대적인 문법을 가지고 있지만 C++의 개념들이 도움됩니다.
- Scala: 함수형 프로그래밍 언어이지만, 객체 지향 특성도 가지고 있어 C++ 지식이 유용합니다.
- Kotlin: Android 개발에 사용되며, 객체 지향 프로그래밍 개념이 C++와 유사합니다.
1. 기본 용어
- 원시 프로그램(source program)
- 소스 코드(source code)라고도 하며 프로그래머가 작성한 프로그램
- C 언어로 작성된 프로그램은 .c 확장자
- C++은 .cpp, C#은 .cs, JAVA는 .java, Objective-C는 .m, swift는 .swift, Go는 .go, Kotlin은 .kts, Python은 .py
- 링킹(linking)
- 컴파일하여 만들어진 각 오브젝트 모듈을 연결
- 사용한 라이브러리와 연결하는 작업
- 디버깅
- 컴파일과 링킹 과정에서 소스 코드에 오류가 있을 수 있는데 이를 오류(erro) 또는 버그(bug)라고 함
- 버그를 수정하여 프로그램이 실행 가능하도록 하는 작업
2. C++ 언어의 발전 과정
3. 언어별 소스 비교
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
} //c
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello World";
return 0;
} //cpp
public class Main
{
public static void main(String[] args) {
System.out.println("Hello World");
}
} //java
fun main() {
println!("Hello World");
} //rust
fun main() {
println("Hello World")
} //kt
언어 | 장점 | 단점 |
C | - 성능이 뛰어나고, 하드웨어에 가까움 - 시스템 프로그래밍에 적합 - 간결한 문법 |
- 메모리 관리가 수동 - 객체 지향 프로그래밍 지원 부족<br>- 에러 처리가 어렵 |
C++ | - 객체 지향 프로그래밍 지원 - STL(Standard Template Library) 제공 - 성능 우수 |
- 복잡한 문법 - 메모리 관리가 수동 - 컴파일 시간이 길어질 수 있음 |
Java | - 플랫폼 독립성 (JVM 사용) - 강력한 메모리 관리 (가비지 컬렉션) - 풍부한 라이브러리 |
- 성능이 C/C++에 비해 낮음 - JVM 필요 - 복잡한 문법 |
Rust | - 메모리 안전성 (소유권 시스템) - 높은 성능 - 병행성 지원 |
- 학습 곡선이 가파름 - 컴파일 시간이 길어질 수 있음 - 생태계가 상대적으로 작음 |
Kotlin | - Java와의 상호 운용성 - 간결하고 현대적인 문법 - 안전한 타입 시스템 |
- JVM에 의존 (성능 저하 가능성) - 상대적으로 새로운 언어로 생태계가 작음 |
- C++ 는 멀티 페러다임 프로그래밍 언어이다
- 절차적 프로그래밍(Procedural Programming)
- C언어의 절차적 프로그래밍 방식을 지원하여 함수와 절차를 통해 프로그램을 구성할 수 있음
- 객체지향 프로그래밍(Object-Oriented Programming)
- 클래스와 객체를 사용하여 데이터와 기능을 묶어 모듈화하고 재사용성을 높이는 객체지향 프로그래밍을 지원
- 제네릭 프로그래밍(Generic Programming)
- 템플릿 기능을 통해 다양한 데이터 타입에 대해 일반화된 코드를 작성할 수 있음.
- 함수형 프로그래밍(Functional Programming)
- C++11 이후로 람다 표현식과 같은 기능들이 추가되어 함수형 프로그래밍 스타일도 지원
- 절차적 프로그래밍(Procedural Programming)
C++ 과 Java의 차이점
구분 | C++ | Java |
기본 철학 | 절차적 및 객체지향 프로그래밍 지원 | 완전한 객체지향 프로그래밍 언어 |
메모리 관리 | 개발자가 직접 메모리를 관리.new로 할당하고delete로 해제함. | 가비지 컬렉션(Garbage Collection)으로 자동 메모리 관리 |
플랫폼 독립성 | 플랫폼에 종속적. 컴파일된 코드는 특정 시스템에서만 실행 가능. | "Write once, run anywhere" 원칙에 따라 모든 플랫폼에서 실행 가능(JVM 필요) |
멀티스레딩 지원 |
STL 라이브러리와 같은 외부 라이브러리를 이용해 멀티스레딩 구현 가능. 하지만 기본 언어 수준에서는 지원하지 않음.
|
내장된 멀티스레딩 지원으로 쉽게 멀티스레드 프로그래밍 가능 |
오류 처리 | 예외 처리가 선택사항임. 주로 오류 코드 반환을 사용함. | 예외 처리가 필수적임. try-catch 문법을 사용하여 예외를 명시적으로 처리해야 함. |
실행 방식 | 컴파일 후 바이너리 형태의 실행 파일 생성, OS에서 직접 실행됨. | 소스코드가 바이트코드로 변환되고 JVM에서 해석되어 실행됨. |
4. 토큰과 구두점
- 토큰 - C프로그램을 구성하는 기본 단위
- 예약어 (reserved word, keyword) : int, if
- 연산자 (operator) : +, /
- 구두점 (punctuator) : [], (), {}, *, 콤마(,), ;, =, :,..., “”
- 식별자 (identifier) : 변수, 함수, 배열, 구조체 등의 이름
- 상수 (constant) 또는 literal : 실행 중 그 값이 변하지 않는 상수. 문자형은 작은따옴표 10, 3.5
- 문자열 (string) : "Hello" *큰 따옴표*
식별자/상수/자료형/변수
- 식별자와 이름 만드는 규칙
- 식별자(identifier)란변수, 함수 등에 부여하는 이름이다. 식별자는 영문자(A∼Z, a∼z), 숫자(0∼9), 밑줄(_)만 가능하다. 한글이나 밑줄(_)을 제외한 특수 문자, int, char 등 컴파일러에 의해 미리 의미가 정해져 있는 단어인 예약어(keyword)는 불가능하다. 또한, 첫 글자는 반드시 영문자 또는 밑줄로 시작해야 한다.
- 상수 또는 리터럴
- 상수(constant)는항상 그 값이 변하지 않는 요소로 숫자 상수는 그냥 쓰면 되지만, 문자 상수는 양쪽에 작은 따옴표(예를 들어 'a'), 문자열 상수는 양쪽에 큰 따옴표(예를 들어 "soft")로 감싸야 한다.
- 자료형
- 자료형(data type)은 처리, 저장하고자 하는 자료의 형태를 나타낸다. 가장 많이 사용하는 대표적인 기본 자료형은 문자형(char, 1바이트), 정수형(int, 4바이트), 실수형(double, 8바이트)이다.
- 변수
- 변수는 프로그램이 실행되는 동안 가변적인 자료를 저장하기 위한 기억장소의 이름으로 모든 변수는 사용하기 전에 반드시 선언을 해야 한다.
#include <stdio.h> // printf() 함수 원형이 선언되어 있음, 전처리기
int main(void) { // 콘솔 기반 C 프로그램의 시작점
// main() 함수의 시작
int num1, num2; // 변수 선언문, 보통 실행문보다 먼저 씀
/* 변수명: 영문자(A-Z, a-z), 숫자(0-9), 밑줄(_)로 구성
변수(variable): 프로그램이 실행되는 동안 자료를
기억시키기 위한 기억장소의 이름 */
num1 = 100; // num1: 식별자, 정수형 변수에 100이라는 상수를 대입
num2 = -300; // num2: 식별자, 정수형 변수에 -300이라는 상수를 대입
printf("두 수의 합은 %d입니다.\n", num1 + num2); // 표준 라이브러리 함수
return 0; // 프로그램 종료
} // main() 함수의 끝
5. 연산자의 우선순위, 결합성
결합성(associativity) : 연산자의 결합 방향
6. 전형적인 C프로그램
- 실습과제 p.26
#include <stdio.h> // 전처리기, 5장
#define SIZE 3 // 전처리기, 5장
typedef struct { // 구조체, 12장
char name[10];
double w;
}WEIGHT;
void swap(WEIGHT*, WEIGHT*); // 함수 선언, 8장
int main(void)
{
WEIGHT man[SIZE] = { {"한개발",57.5}, // 배열, 10장
{"엄청군",125.6},
{"갈비양",35.7} };
int i, j; // 변수, 3장, 기억 클래스,9장
for (i =0; i <2; i++) { // 제어문, 7장
for (j = i +1; j <3; j++) { // 연산자, 6장
if (man[i].w < man[j].w) {
swap(&man[i], &man[j]);
} // call by reference, 11장
}
}
printf(" 이름 \t체중\n");// 표준 라이브러리 함수, 4장
for (i =0; i <3; i++) {
printf(" %s %5.1f\n", man[i].name, man[i].w);
}
return 0;
} //main()함수 끝
void swap(WEIGHT* mani, WEIGHT* manj)// 포인터, 11장
{ //함수 정의
WEIGHT temp;
temp =*mani;
*mani =*manj;
*manj = temp;
}
- 오름차순으로 변경, 한명 추가
#include <stdio.h> // 전처리기, 5장
#define SIZE 4 // 전처리기, 5장 (크기를 4로 변경)
typedef struct { // 구조체, 12장
char name[10];
double w;
} WEIGHT;
void swap(WEIGHT*, WEIGHT*); // 함수 선언, 8장
int main(void)
{
WEIGHT man[SIZE] = { {"한개발", 57.5}, // 배열, 10장
{"엄청군", 125.6},
{"갈비양", 35.7},
{"강윤서", 55.2} }; // 새로운 데이터 추가
int i, j; // 변수, 3장, 기억 클래스, 9장
for (i = 0; i < SIZE - 1; i++) { // 제어문, 7장
for (j = i + 1; j < SIZE; j++) { // 연산자, 6장
if (man[i].w > man[j].w) { // 오름차순으로 변경
swap(&man[i], &man[j]);
} // call by reference, 11장
}
}
printf(" 이름 \t체중\n"); // 표준 라이브러리 함수, 4장
for (i = 0; i < SIZE; i++) {
printf(" %s %5.1f\n", man[i].name, man[i].w);
}
return 0;
} // main() 함수 끝
void swap(WEIGHT* mani, WEIGHT* manj) // 포인터, 11장
{ //함수 정의
WEIGHT temp;
temp = *mani;
*mani = *manj;
*manj = temp;
}
728x90
'C++' 카테고리의 다른 글
4. C언어 문법 (2) | 2024.09.24 |
---|---|
2. C문법 (자료형, 전처리기, 식별자, 리터럴, 변수, 연산자) (0) | 2024.09.13 |
10-1 상속 (0) | 2023.11.22 |
9-2 디폴트 인자(매개변수) (0) | 2023.11.15 |
9-1 함수중첩 (0) | 2023.11.15 |