상세 컨텐츠

본문 제목

[TIL] 1 - 1. 객체지향 기본 문법 - C++의 객체를 이용한 입출력

언어/C++

by 민:하 2022. 2. 6. 03:22

본문

 

▶ C++ 프로그래밍

C++ 프로그래밍은 C문법 + OOP 개념(문법) 으로 구성되어 있다.

C문법은 보통 소단위 작업을 할 때 쓰이고, C++은 대단위 작업을 할 때 쓰인다.

  • C문법 : Structure 구조 (함수 단위로 나누어 작성)
  • C++ : OOP(Object - Oriented Programming, 객체지향 프로그래밍) (객체를 활용한 프로그래밍)

1. C++의 객체를 이용한 입출력

  • 입출력 객체(cout, cin)와 연산자 오버로드된 연산자(<<, >>)를 이용한 입출력
  • cout과 cin 객체는 iostream 헤더파일에 선언 (cout은 ostream / cin은 istream)
  • 데이터형 자동 인식 - C언어에서 사용했던 형식변환문자(%d, %c, %lf, ...) 불필요

 

< 객체 >

  • 객체 : 사용자정의 데이터타입인 클래스가 구체화된 것이다. 즉, 클래스의 실제 메모리 블록이다.
    • 클래스 : data member + function member가 캡슐화 되어있는 데이터 타입
    • 클래스(class) == 객체형(object type)
    • 객체(object) == 객체 인스턴스(object instance) == 인스턴스 변수(instance variable)

 

< 연산자 오버로딩(overloading) >

  • 연산자 overloading : 동일한 연산자가 서로 다른 연산에 사용되는 기능
  • 연산자 overloading 함수를 만들어서 구현한다.
  • ex) <<, >> : 기존에는 shift 연산자. 연산자 overloading을 통해 cout, cin과 같이 쓰이면 입출력 연산자.
  • <<, >> : 입출력 연산자로 사용될 때 출력 대상의 type을 인식한다.

 

< cout 객체를 이용한 출력 >

  • ostream 클래스로 생성된 객체
  • 문자열, 숫자, 개별적인 문자들을 포함한 여러가지 정보를 출력하는 방법이 정의되어 있는 객체
  • 묵시적 호출 방법으로 사용한다. (편리하기 때문에)

cout : 객체

<< : inserter(연산자 오버로딩) - cout 클래스의 멤버 함수 중 하나

"C++ 프로그래밍" : 전달인자 (출력대상)

 

 

 

cout : 객체

operator<< : 연산자 overloading 함수명

 

 

< C언어의 출력 방식  VS  C++의 출력 방식 >

 

< cin 객체를 이용한 입력 >

  • istream 클래스로 생성된 객체

cin : 객체

>> : extractor(연산자 오버로딩) - cin 클래스의 멤버 함수 중 하나

num : 전달인자

 

 

cin : 객체

operator>> : 연산자 overloading 함수명

 

  • cin의 멤버 함수
    • getline( ) : 여백이 포함된 문장을 지정 길이 또는 지정 문자까지 입력   ex) cin.getline(buffer, size, '\n');
    • get( ) : 모든 종류(구분자(' '. '\t', '\n') 포함)의 문자 하나 입력     ex) cin.get(ch);  또는  ch = cin.get();
    • clear( ) : cin 입력 시 실패에 의해 set된 flag 멤버 clear (clear : flag에 저장된 1(실패)의 값을 0(성공)으로 변경)
    • fail( ) : cin 입력 실해 시 set되는 flag 멤버 값 검사 (입력 실패 시 true 리턴)
    • ignore( ) : 버퍼 지우기   ex) cin.ignore(); // 1byte 삭제   cin.ignore(size, '\n'); // size범위내 '\n'까지 모두 삭제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>    // cin, cout, endl 객체 사용을 위해
using namespace std;
void my_flush();    // cin buffer(내부에서 stdin 사용)를 모두 비우는 함수
int main(void) {
    int intNumber;
    double doubleNumber;
    char ch;
    char str[100];
 
    cout << "정수값 : ";
    cin >> intNumber;
 
    cout << "실수값 : ";
    cin >> doubleNumber;
 
    cout << "문자 : ";        // 구분자는 불가
    cin >> ch;
 
    cout << "문자열 : ";    // 여백없는 문자열만 가능
    cin >> str;
 
    cout << "intNumber = " << intNumber << endl;
    cout << "doubleNumber = " << doubleNumber << endl;
    cout << "ch = " << ch << endl;
    cout << "str = " << str << endl;
 
    my_flush();
 
    cout << "여백있는 문자열 : ";
    
    cin.getline(str, sizeof(str));    // 지정문자 생략 시 지정문자는 '\n'. 지정문자는 저장X
    cout << "입력 받은 문자열 : " << str << endl;
 
    cout << "여백문자을 입력(space, tab, enter) : ";
    ch = cin.get();
    cout << "입력한 여백문자의 아스키코드 값 : " << (int)ch << endl;
    return 0;        // 생략 가능
}
void my_flush() {
    while (cin.get() != '\n');
}
cs
  • C언어의 scanf   VS  C++의 cin>>     => 동일기능 (여백이 없어야 제대로 입력)
  • C언어의 fgets( ) VS  C++의 cin.getline( )    => 유사기능
    • fgets(저장할 곳, 상한선, stdin); : 여백 있는 문자열 입력 가능(구분자까지 가져와서 저장)
    • cin.getline(저장할 곳, 상한선, 지정문자); : 여백 있는 문자열 입력 가능 (구분자를 가져오지만 저장하지는 않음)

 

< C++에서 입력 실패를 알 수 있는 방법 >

  • C언어에서는 scanf( ... )에서 입력에 성공한 개수를 리턴받아 실패를 알 수 있었으나, C++에서는 불가능
    • C++에서 불가능한 이유 : C++의 cin>>은 return 값이 cin이기 때문
  • C++은 flag 멤버를 이용해서 입력 성공 여부를 판단
    • cin 객체에는 flag 멤버와 buffer 멤버 존재
    • flag 멤버에는 입력 성공 시 0이 저장 / 입력 실패 시 1이 저장
    • flag 멤버는 private이기 때문에 접근 불가 → cin.fail( ) 함수 멤버를 사용
    • cin.fail( )은 true 또는 false 값을 가져옴 → true는 입력 실패 / false는 입력 성공
    • flag 멤버 값이 실패(1)이면 cin의 모든 입력이 계속 실패 → flag 멤버를 정상(0)으로 변경 → cin.clear( ) 함수
    • cin.clear( ) 후에는 buffer 비우기 (my_flush 함수 사용하기)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void my_flush();
int main(void) {
    int num;
    cin >> num;
    while (cin.fail()) {
       my_flush();
        cin >> num;
    }
    cout << "num = " << num << endl;
    return 0;
}
void my_flush() {
    cin.clear();
    while (cin.get() != '\n');
}
cs

 

 

< C++에서 주소 출력 >

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main(void) {
    int intArray[5= { 13579 }
    char charArray[10= "banana";
    cout << intArray << endl;            // 주소출력
    cout << charArray << endl;            // 문자열출력
    cout << (void*)charArray << endl;    // 주소출력
    return 0;
}
cs
  • C언어에서는 배열이름이 배열의 시작주소를 의미한다.
  • intArray에서 <<은 int형 배열을 주소를 출력하고자 하는 type을 %p(16진수로 주소 출력)로 인식한다.
  • charArray에서 <<은 char형 배열을 문자열을 출력하는 type으로 인식한다.
  • charArray의 주소를 출력하려면 void*로 형변환을 해서 출력한다.

2. 조정자를 이용한 입출력

  • 조정자는 C언어의 flag, 변경자와 같다.
  • setprecision(n)과 setw(n)를 사용하려면 iomanip 헤더파일이 필요하다.
  • cout.unsetf(ios_base::scientific); : 실수값 출력 형태를 기본 형태로 되돌림
  • cout.unsetf(ios_base::showbase); : 진법접두어 출력 취소
  • cout << setprecision(-1); : 유효숫자 및 소수점 이하 자리수 지정 취소
조정자 default 값 의 미
dec, hex, oct dec(10진수) 정수값을 10진수, 8진수, 16진수로 출력한다.
showbase, noshowbase noshowbase 16진수, 8진수 진법접두어(0x, 0) 출력 설정, 취소
fixed   소수점 형태로 출력
scientific   지수 형태로 출력
setprecision(n)   일반 출력모드에서는 유효숫자 n자리 출력
fixed와 scientific 모드에서는 소수점 이하 n자리 출력
setw(n)   field 폭 지정 ( 1회성 )
left, right right 왼쪽, 오른쪽 정렬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <iomanip> // setprecision과 setw를 사용하기 위함
using namespace std;
int main(void) {
    int number = 12;
    cout << showbase;            // 지금부터 진법접두어 출력 설정
    cout << "10진수로 출력 : " << number << endl;
    cout << "16진수로 출력 : " << hex << number << endl;
    cout << "8진수로 출력 : " << oct << number << endl;
 
    double dnumber = 71.2345;
    cout << setprecision(3);    // 3자리 출력
    cout << dnumber << endl;    // (일반모드) 유효숫자 3자리 출력
    cout << fixed;              // fixed 모드로 변경
    cout << dnumber << endl;    // (fixed 모드) 소수점 형태로 출력
    cout << scientific;         // scientific 모드로 변경
    cout << dnumber << endl;    // (scientific 모드) 지수 형태로 출력
 
    cout << "|" << setw(10<< number << "|" << setw(15<< dnumber << "|" << endl;
 
    cout << left;
    cout << "|" << setw(10<< number << "|" << setw(15<< dnumber << "|" << endl;
    
    cout << right;
    cout << "|" << setw(10<< number << "|" << setw(15<< dnumber << "|" << endl;
    return 0;
}
cs

 

 

< C++에서 실수형 출력 모드>

  • 기본(일반) mode (default) : 유효숫자까지 출력    ex) 123.5
  • fixed mode : 소수점 형태로 출력 (소수점 이하 6자리까지)    ex) 123.500000
  • scientific mode : 지수 형태로 출력 (소수점 이하 6자리까지)    ex)1.235000e+002

3. cout의 setf(long) 멤버함수를 이용한 출력양식 조정

상수명 의 미
ios::showbase 출력에서 C++의 기준 접두어(0, 0x)를 붙인다. (showbase 기능과 같음)
ios::showpoint 소수점과 소수점 이하의 0을 생략하지 않는다.
일반 출력 모드에서는 유효숫자 6자리로 출력
fixed나 scientific 모두에서는 소수점 이하 6자리까지 출력
ios::uppercase 16진수 출력을 위해 대문자를 사용
ios::showpos 양수 앞에 +부호 붙임
setf( ) 멤버함수를 통해 지정된 각각의 기능들은 unsetf( )함수에 의해 기능 해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main(void) {
    int a = 10, b = 365;
    float f = 3.14, g = 5.0;
    cout.setf(ios::showpos);
    cout << a << endl;
    cout << f << endl;
 
    cout << hex << a << endl; // 앞으로의 정수는 16진수로 출력
    cout.setf(ios::showbase);
    cout << a << endl;
    cout << b << endl;
 
    cout.setf(ios::uppercase);
    cout << a << endl;
    cout << b << endl;
 
    cout.setf(ios::showpoint);
    cout << f << endl;
    cout << g << endl;
    return 0;
}
cs


3. cout의 setf(long, long) 멤버함수를 이용한 출력양식 조정

  • ios::right, ios::left, ios::internal은 setw( )와 함께 사용한다.
첫 번째 전달인자 두 번째 전달인자 의 미
ios::fixed ios::floatfield 고정 소수점 표기 사용
ios::scientifc 과학적 표기(지수표기) 사용
ios::right ios::adjustfield 우측정렬 사용
ios::left 좌측정렬 사용
ios::internal 부호는 좌측정렬, 값은 우측정렬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main(void) {
    float f = 3.14, g = 150.0;
 
    cout.setf(ios::showpos);
    cout.setf(ios::showpoint);
    cout.precision(3);
    cout << f << "\n";
    cout << g << "\n\n";
 
    cout.setf(ios::scientific, ios::floatfield);
 
    cout << f << "\n";
    cout << g << "\n\n";
    return 0;
}
cs


< C언어 - 구조체의 변수 VS C++ - class의 객체 >

  • 변수 : data member
  • 객체 : data member + function member

 

▶ C언어의 구조체

 

public : 모든 함수에서 접근 가능한 member

 

구조체 형틀을 선언할 당시에는 메모리가 할당되지 않으나,

구조체 변수를 선언하면 메모리가 할당된다.

 

 

 

▶ C++의 객체

 

접근지정자

  ▷ private : 사적 member (비공개된 정보)

  ▷ public : 공적 member (공개된 정보)

data member를 private로 선언하는 이유는 데이터의 무결성을 보장하기 위함.

 

 

ob는 Person class의 객체로 data member만 메모리가 할당된다.

관련글 더보기

댓글 영역