C++ 복습(2) - 입출력,문자열,클래스와 객체

입출력

std::cout 객체는 스크린 출력 장치에 연결된 표준 C++ 출력 스트림 객체이다. 이는 <iostream> 헤더파일 내에 선언이 되어있으며, namespace std에 선언되어있다.

« 연산자는 스트림 삽입 연산자로서, 오른쪽 피연산자를 왼쪽 스트림 객체에 삽입한다. 이 연산자는 <ostream> 클래스에 구현되어 있다.

std::cin표준 입력 장치인 키보드를 연결하는 C++ 입력 스트림 객체이다. cout과 마찬가지로 <iostream> 헤더파일 내에 선언되어있다.

» 연산자는 스트림 추출 연산자로, 입력 스트림에서 값을 읽어 오른쪽 변수에 저장한다.

문자열

C++의 문자열 표현 방식에는 2가지가 있다.

  • C-string 방식(‘\0’으로 끝나는 문자 배열, include <cstring> or <string.h>)
    • char name1[6] = {‘G’, ‘r’, ‘a’, ‘c’, ‘e’, ‘\0’}; -> name1은 문자열 “Grace”
    • char name2[5] = {‘G’, ‘r’, ‘a’, ‘c’, ‘e’}; -> name2는 문자열이 아니라 단순 문자 배열
    • 보다는 이 C++ 표준 방식
  • string 클래스 이용(include <string>)
    • C++에서 강력 추천, 표준 클래스
    • 문자열의 크기에 따른 제약 없음
    • C-string보다 다루기 쉬움

istream의 cin.getline()

cin.getline(char str, streamsize n);
cin.getline(char str, streamsize n, char dlim);

공백이 낀 문자열을 입력 받는 방법, delimitChar의 디폴트 값은 ‘\n’

string의 getline

getline(istream& is, string str);
getline(istream& is, string str, char dlim);

<iostream>, <fstream>, <string>에 정의

클래스와 객체

클래스 생성자

class Circle {
  ...
  Circle();
  Circle(int r);
  ...
}

위와 같이 한 클래스에서 여러개의 생성자를 중복해서 선언할 수 있다. 생성자를 선언하지 않는다면 기본 생성자가 자동으로 생성된다.(이는 소멸자도 마찬가지이다)

위임 생성자

  • 타겟 생성자: 객체 초기화를 전담하는 생성장
  • 위임 생성자: 타겟 생성자를 호출하는 생성자, 객체 초기화를 타겟 생성자에 위임
// 위임 생성자
Circle::Circle() : Circle(1) { }

// 타겟 생성자
Circle::Circle(int r){
  radius = r;
  cout << "반지름 " << radius << " 원 생성" << endl;
}

또한 클래스의 멤버 변수는

  • 생성자 코드에서 초기화
  • 생성자 서두에서 초기값으로 초기화
  • 클래스 선언부에서 직접 초기화 가 가능하다.

초기값으로 초기화 하는 예시는 아래와 같다.

// 생성자 매개변수가 없을 경우
Point::Point() : x(0), y(0){ }

// 생성자 매개변수가 있을 경우
Point::Point(int a, int b) : x(a), y(b){ }

접근 지정자

  • private
    • 동일한 클래스의 멤버 함수에만 제한됨
    • 접근 지정자 미 정의시 디폴트값
  • public
    • 모든 다른 클래스에 허용
  • protected
    • 클래스 자신과 상속받은 자식 클래스에만 허용

인라인 함수

  • inline 키워드로 선언된 함수
  • 짧은 함수의 경우, 함수를 호출 및 실행하는 오버헤드가 함수를 직접 실행하는 것보다 길기 때문에, 프로그램의 실행 속도 개선을 위해 사용
  • 자동 인라인 함수
    • 클래스 선언부에 구현된 멤버 함수는 컴파일러에 의해 자동으로 inline처리가 된다.
    • 클래스 내부의 생성자를 포함한 모든 멤버함수가 자동 인라인 함수로 쓸 수 있다.

인라인 함수 사용 예시는 아래와 같다.

#include <iostream>

inline int adder(int a, int b){
  return a + b;
}

int main(void){
  int num;
  num = adder(3, 4);
  return 0;
}

위의 경우, 앞에 inline 해준 함수를 호출하는 것이 아니라, main문의 코드로 직접 들어가는 것과 같다. 이는 컴파일 과정에서 처리되며, 따라서 짧은 길이의 함수를 반복적으로 실행해야 하는 경우 매우 효율적이다.