C++ 공부

C++언어 기초 - 1. 프로그래밍 기초 (C언어와의 차이점)

Client Side 2025. 8. 18. 21:31

 

#include <iostream>
using namespace std;

int main() {
    cout << "Hello world!" << endl;
    return 0;
}

 

 

1. 네임스페이스(namespace)

  • 헤더파일과의 차이점
    • C언어에서는 헤더파일(.h 파일)만 포함하면 그 안에 선언된 모든 함수들을 바로 가져다 쓸 수 있지만, C++는 더 크고 복잡한 프로그램을 만들 수 있게 진화하면서 전 세계 개발자들의 모든 기능을 큰 방 하나에 다 넣으려니 서로 충돌하게 된다. 그래서 C++에는 네임스페이스라는 개념이 생겨났다.
    • 헤더파일은 어떤 기능들이 있다고 선언해주는 역할
    • 네임스페이스는 그 선언된 기능들을 어디에, 어떤 이름으로 묶어서 보관할지 분류하는 역할을 한다. 
  • std (standard library)
    • C++표준 라이브러리에서 제공하는 기능들, 예를 들면 cout, cin, endl 같은 것들이 모여 있는 곳을 뜻한다. 이걸 namespace라고 부른다.
  • using namespace std; (전역 네임스페이스 사용선언)std::(개별 네임스페이스 지정)의 차이점
    • 전역 선언의 장점 : 코드가 짧아지고 타이핑할게 줄어들어서 편하다.
    • 전역 선언의 단점 : 나중에 코드가 엄청 길어지거나, 다른 사람이 만든 라이브러리랑 같이 쓸 때, std 안에 있는 cout이랑 내가 만든 cout이랑 이름이 똑같아서 헷갈리거나 충돌이 날 수 있다. 그래서 아주 큰 프로젝트에서는 전역 선언을 잘 쓰지 않는다.
    • 개별지정의 장점 : 이름 충돌이 일어날 걱정이 없다. 어떤 기능이 어느 네임스페이스에서 왔는지 한 눈에 알 수 있어서 코드가 더 명확해진다. 큰 프로젝트에서 권장한다.
    • 개별지정의 단점 : 매번 std::를 붙여야 해서 좀 귀찮고, 코드가 길어진다.

2. cout과 cin

  • cout(Charater Output)
    • '콘솔 출력 객체'. C언어의 printf와 비슷한 역할을 한다.
  • cin(Character Input)
    • '콘솔 입력 객체'. C언어의 scanf와 비슷한 역할을 한다.
  • 가장 큰 장점은 printf처럼 %d, %f 같은 서식 지정자를 쓸 필요가 없다. cout이랑 cin은 들어오는 데이터타입을 알아서 인식해서 처리한다.

3. 스트림 연산자 (  <<  ,  >>   ) 

      : 물이 흐르는 것처럼 데이터가 흐른다.  

  • << (삽입 연산자 또는 출력 연산자)
    • 데이터를 '출력스트림(cout)'으로 흘려보낸다.
    • std::cout << "안녕" << 123; 라고 입력하면 "안녕"도 cout으로 흘려보내고, 123도 cout으로 흘려보낸다.
  • >> (추출 연산자 또는 입력 연산자)
    • 데이터를 '입력 스트림(cin)'에서 뽑아낸다.
    • std::cin >> num; 라고 입력하면 cin 으로 들어온 데이터를 num 변수로 추출해서 저장한다.

4. C언어에서 쓰던 함수들 (printf, scanf, \n)

  • C++은 C언어의 모든 기능을 거의 다 가져다 쓸 수 있도록 만들어졌다.
  • printf나 scanf도 <cstdio> 또는 <stdio.h> 를 include하면 여전히 사용할 수 있다.
  • 하지만 C++에서는 cout과 cin을 쓰는걸 더 권장한다. C++은 객체 지향 언어이고, cout/cin이 C++의 객체 지향적인 특성을 더 잘 살려서 유연하고 안전하게 입출력을 처리할 수 있기 때문이다.
  • \n(뉴라인 문자) : 줄바꿈을 의미하는 문자이며 C++에서도 사용가능하다.
  • endl(End Line) : cout 스트림에서만 사용할 수 있는 특별한 객체이다. 단순히 줄만 바꿔주는 게 아니라, 출력 버퍼를 비워주는 역할까지 한다.

5. C언어와 C++의 핵심적인 차이

  • 객체 지향 프로그래밍 : C++은 객체 지향 언어라서 클래스와 객체를 사용할 수 있다. 반면 C는 절차적 언어이다.
  • 네임스페이스 : C++에는 std와 같은 네임스페이스가 있어서 이름 충돌 문제를 해결해준다. 네임스페이는 변수나 함수의 소속을 알려주는 기능을 한다.
  • 입출력 방식 : C는 print,scanf 같은 함수를 사용하고, C++은 cout, cin 같은 객체와 연산자를 사용한다.
  • 메모리 관리 : C++은 new와 delete 연산자로 동적 메모리를 관리하고, C는 malloc, free 함수를 사용한다.
  • 기능 확장 : C++은 함수 오버로딩, 템플릿, 예외 처리 등 C에 없는 많은 기능들을 제공한다.

 

6. 객체 지향 프로그래밍 (Objected-Oriented Programming, OOP)

  • 서로 연관된 데이터(속성)와 그 데이터를 처리하는 함수(기능/행동)들을 하나로 묶어서 '객체'라는 개념으로 표현한다.

*객체지향의 4가지 기둥

 

1) 추상화 (Abstraction)

  • 복잡한 내부를 숨기고, 핵심적인 부분만 보여준다.
  • 자동차 예시 : 브레이크를 밟으면 차가 멈춘다는 것만 알면 되지, 브레이크 페달이 유압 시스템을 통해 바퀴 디스크를 어떻게 조여서 차를 세우는지 구체적인 엔진 작동 원리까지 알 필요는 없다.
  • 코딩 : 프로그래머가 복잡한 코드 내부를 다 보여주는게 아니라, 필요한 기능(메소드)만 외부에서 사용할 수 있도록 노출시킨다. 이렇게하면 사용자는 어떻게 동작하는지 몰라도 잘 쓸 수 있고, 개발자는 내부 구현을 자유롭게 바꿀 수 있어러 유지보수가 편해진다.

2) 캡슐화 (Encapsulation)

  • 데이터(정보)와 그 데이터를 다루는 기능(메소드)을 하나의 캡슐처럼 꽁꽁 묶어서 보호하고, 외부에서는 정해진 방법으로만 접근하게 하는 것.
  • 자동차 예시 : 자동차의 엔진룸 안에 엔진, 배터리 같은 핵심 부품들이 다 모여있고 외부에서는 함부로 건드릴 수 없게 캡슐처럼 덮여있다. 그리고 시동을 걸려면 키를 돌리는(정해진 메소드를 호출하는)것처럼, 정해진 인터페이스로만 접근 할 수 있게 하는 것.
  • 코딩 : 클래스 안에서 변수(데이터)들을 private 같은 키워드로 외부에서 직접 접근하지 못하게 하고, 그 데이터에 접근하거나 수정하는 기능(메소드)들만 public으로 열어둔다. 이렇게 하면 데이터가 엉뚱하게 바뀌는 걸 막고, 코드의 안정성을 높일 수 있다.

 

3) 상속 (Inheritance)

  • 이미 만들어진 클래스(틀)의 기능을 물려받아서 새로운 클래스를 만드는 것.
  • 자동차예시 : 차의 기본설계도를 만들면, 승용차의 설계도와 트럭의 설계도는 엔진과 바퀴와 같은 기본적인 특징은 다시 그릴 필요 없이 차의 기본설계도에서 상속받아 쓸 수 있다. 그리고 승용차에는 '트렁크열기'와 같은 승용차만의 기능을 추가하는 것이다.
  • 코딩 : 기존 클래스(부모 클래스)의 속성과 기능을 물려받아 새로운 클래스(자식 클래스)를 만들 수 있다. 이미 있는 코드를 재사용할 수 있어서 코드를 효율적으로 만들고 중복을 줄일 수 있다.

4) 다형성 (Polymorphism)

  • 여러가지 형태를 가질 수 있다. 똑같은 메시지를 보냈는데 객체의 종류에 따라 다르게 동작한다.
  • 자동차 예시 : '빵빵' 소리를 내는 '경적'기능이 있을 때, 오토바이와 트럭의 경적 소리는 다르지만 둘 다 경적을 울린다는 동일한 행동을 한다.
  • 코딩 : 하나의 함수 이름이나 연산자가 상황에 따라 다르게 동작할 수 있도록 하는 기능이다. 예를 들어, 부모 클래스와 자식 클래스에 동일한 이름의 메소드가 있을 때, 어떤 객체냐에 따라 그 메소드가 다르게 동작하게 할 수 있다. cout에서 <<연산자를 숫자 뒤에 쓰면 숫자를 출력하고, 문자열 뒤에 쓰면 문자열을 출력하는 것도 다형성의 한 예시다.