★ cin.ignore();
- 개행 문자가 남아있기에 버퍼를 비워주도록 하자.
- 특정 객체를 읽으려고 했지만 못 읽을 때, 건너뛰고 싶을 때 사용한다.
- 파일 끝에 도달하거나 지정한 수만큼 문자를 버리면 멈춘다.
- cin.ignore(); : 문자 1개를 버린다.
- cin.ignore(10); : 문자 10개를 버린다.
- cin.ignore(10, '\n'); : 문자 10개를 버린다. 단, 그 전에 뉴라인(new line) 문자를 버리면 곧바로 멈춘다.
- cin.ignore(LLONG_MAX, '\n'); : 최대 문자 수를 버린다. 단, 그전에 뉴라인 문자를 버리면 곧바로 멈춘다.
cin 과 getline 을 같이 사용할 때 cin.ignore()이 필요한 이유
제대로된 이해
cin은 '\n'를 변수에 담지 않는다. (입력버퍼에 남겨둔다.)cin은 '\n'를 처리하지 않고 입력버퍼에 남겨둔다.
getline은 '\n'를 변수에 담는다.
getline은 '\n'를 입력버퍼에서 가져와서 처리한다.
s2에 '\n'가 전달되며 '\n'를 제거 후 s2에 ''을 담기 때문에 s1과 ''이 출력되고 종료된다.
추가이해
cin.ignore();는 버퍼 전체를 비우는것이 아니라 맨 앞의 문자하나를 지운다.
getline(읽어올 입력스트림, 저장할 문자열변수)
출처 : cin과 getline을 같이 사용할때 cin.ignore()이 필요한 이유 기록 (tistory.com)
cin과 getline을 같이 사용할때 cin.ignore()이 필요한 이유 기록
제대로 알지 못하면서 알고 있다고 생각하는것만큼 무서운것이 없습니다. 선무당이 사람 잡는다. cin과 getline을 같이 사용할때 cin.ignore()이 필요한 이유를 잘못 알고 쓰고 있었습니다. 잘못된 이
namwhis.tistory.com
bool 타입
- 참과 거짓, 1과 0의 값만 가지고 있는 자료형이다.
- 예약어 true와 false를 가지고 있으며, true는 1, false는 0이라는 상수값을 가진다.
- true와 false는 1bit로 표현할 수 있는데 왜 굳이 1byte(8bit)를 안쓰고 7bit를 낭비하면서 1byte를 쓰냐?
- 그냥 개발자들끼리 맞춘 것이다. 최소 byte를 1byte로..!!
- bool type의 크기는 1byte이다.
객체 지향 프로그래밍 (←→ 함수 프로그래밍)
- 모든 데이터를 객체로 취급하며 이 객체들을 조립하여 프로그램을 만드는 방법
객체 지향 프로그래밍의 특징
- 캡슐화 : 표현하고자 하는 데이터와 동작을 하나로 묶어 놓는 것이다. 객체는 스스로 독립적이다. 프로그램의 부품으로 활용될 수 있다.
- 정보 은폐 : 외부에서 사용하는 기능만 공개하고 나머지는 숨길 수 있다.
- 상속 : 이미 만들어진 클래스를 이용해서 새로운 클래스를 정의하는 방법이다.
- 추상화 : 일단 추상적인 틀만 정의해놓고 그것을 구체화 시켜서 사용할 수 있다.
- 다형성 : 똑같은 함수를 호출한다 하더라도 객체에 따라 다른 동작을 할 수 있게끔 동작하는 방법이다. 같은 이름을 사용하여 다른 기능을 구현하는 것이다.
※ 클래스를 만드는 것 자체로는 메모리에 올라가지 않는다. 동적할당을 해주고 사용하여야 한다. ( 예시를 통해 알아보자 )
Class
- 객체 지향 프로그래밍에서 객체를 생성하기 위해 변수, 함수를 정의하는 틀이다.
- C++에서 클래스는 구조체의 상위 호환이라고 생각할 수 있다.
- 멤버 변수를 가진다에서 구조체의 성격을 그대로 가지고 있으며 . 연산자, → 연산자 등 문법은 서로가 동일하다.
human1 이라는 포인터 변수는 구조체에서 새로운 자료형인 Human의 자료형을 사용하여 class Human의 크기만큼 new를 사용하여 동적할당이 된 것이다. (필기 참고)
접근 권한 제어자
- public : 모두 접근이 가능하다. (외부, 내부)
- private : 같은 클래스 내를 제외하고는, 접근이 불가능하다. 클래스 내에 함수를 정의해서 접근이 가능하다. 은닉화가 가능하다 ( 중요한 데이터를 감춤 )
- protected : private 과 동일하지만, 상속 관계에 놓여있을 때 자식 클래스에서만 접근이 가능하다.
Q 그럼 클래스와 구조체의 큰 차이는 ?
클래스에서 디폴트 접근제어자는 private 이다.
구조체에서 디폴트 접근제어자는 public 이다.
객체와 인스턴스
- 객체 : 하나의 독립적인 친구를 바라 볼 때 객체라고 표현한다.
- ex) human1 은 객체이다.
- 인스턴스 : 클래스와 같이 설명할 때에는 인스턴스라고 표현한다.
- ex) human1 은 Human 클래스로 만들어진 인스턴스이다.
★ 혼동이 올 수 있겠지만, 객체와 인스턴스는 같은 말이다(?).
생성자
- 클래스의 객체를 선언하면, 메모리만 할당 될 뿐, 초기화는 따로 되지 않는다.
- 생성자는 객체를 초기화해주는 역할을 한다. 객체 초기화라는 한 가지 일만 하기 때문에 이름이 고정적이다.
- 이름은 항상 클래스의 이름과 동일하며 리턴값은 없다.
생성자 호출 : 객체가 만들어질 때, 객체를 선언할 때 호출이 된다.
- 1. 명시적인 방법
Student stu1 = Student(1, "김민수", 26); - 2. 암시적인 방법
Student stu2 (2, "김민수", 26);
참고 : [C++ 기본 공부정리] 14-4. OOP - 생성자(constructor) (tistory.com)
[C++ 기본 공부정리] 14-4. OOP - 생성자(constructor)
공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 틀린 부분에 대한 지적은 감사합니다. 1. 생성자(constructor) 클래스를 정의한 후 클래스 객체를 생성하게 되면 메모리에
min-zero.tistory.com
파괴자 (소멸자)
- 생성자와 반대로 객체를 메모리에서 해제해주는 역할을 한다.
- 생성자가 객체 자체의 초기화 외에 외부 환경까지 초기화한다면, 외부 환경의 메모리도 해제해줘야 할 때, 파괴자를 따로 정의하여 처리할 수 있다.
※ 파괴자는 특수의 경우 이외에, 필요하지 않다 ... !
정적 멤버 변수
- 객체별로 할당되지 않고 모든 객체가 공유하는 멤버 변수이다.
이렇게 만들어서 클래스만 배포하면, Num을 우리가 따로 만들어주거나 해야한다. 그리고 애초에 관련된 변수가 바깥에 있는 것은 말도 안된다. 은닉화에도 위배가 된다.
class Count 안에 private 안에 static int Num 과 같이 정적 멤버 변수로 선언을 해주어야 한다.
'C++언어 공부 > 개념 공부' 카테고리의 다른 글
2024.01.30 C++ 언어 공부 5일 차 (상속 관련) (1) | 2024.01.30 |
---|---|
2024.01.29 C++ 언어 공부 4일 차 (0) | 2024.01.29 |
2024.01.28 C++ 추가 공부 [얕은 복사, 깊은 복사] (0) | 2024.01.28 |
2024.01.25 C++ 언어 공부 2일 차 (2) | 2024.01.25 |
2024.01.24 C++ 언어 공부 1일 차 (0) | 2024.01.24 |