#pragma once
// 헤더 파일에서는 코드의 머리 부분, 전방 선언, 클래스나 구조체의 멤버 변수, 멤버 함수의 전방 선언 같은 것만 적는다.
void header();
struct A
{
int A;
int B;
void structheader();
};
#include <iostream>
#include "header.h" // header.h 라는 곳에 있는 코드를 전부 이쪽으로 가져온다.
//이 경우 #include "header.h" == void header(); 이다.
// #include "header.h" 가 선언되었기에 이곳에 void header();가 있는 것과 같다.
// 이 때 불러온 헤더 파일 내에 동일한 명칭의 변수, 함수, 구조체, 클래스가 존재해선 안된다.
// 예시 -> int A가 있는 "A.h" 과 int A가 있는 "B.h"을 같이 불러오면 컴파일 에러가 난다.
// 꼭 넣어야 할 경우 namespace를 사용한다.
//namespace : 전역변수/전역함수/클래스 등의 이름 충돌을 피하기 위해서 사용하는 키워드.
//같은 이름의 파일을 다른 폴더에 넣어서 이름이 서로 충돌하지 않게끔 하는 것과 같다.
// namespace는 선언만 하는 곳이다.
int main()
{
header();
return 0;
}
void header()
{
std::cout << "Hello, header!" << std::endl;
}
#include <iostream>
// :: 는 범위 지정 연산자. 어디에 소속되어 있는지 명시하기 위해 사용하는 연산자다.
// 예시 : korea::korean 으로 한국이라는 곳에 한국인이 속해 있다 라는 뜻
namespace player1
{
int money = 50;
}
namespace player2
{
int money = 100;
}
int main()
{
std::cout << "player's money : " << player1::money << std::endl; // player1의 범위 안에 있는 변수 money의 값을 가져와라.
std::cout << "player's money : " << player2::money << std::endl; // player2의 범위 안에 있는 변수 money의 값을 가져와라.
// 구조체에서 구조체 변수가 같은 이름의 구조체 멤버변수나 함수를 공유하더라도 각기 다른 값을 가질 수 있다는 것과 비슷할지도...?
return 0;
}
// char와 string의 차이점
//
// char 와 string은 문자(배)열이라는 공통점을 지니고 있다.
// char의 단점
// 문자열 자르기, 문자열에서 어떤 단어나 문자를 찾는게 불가능하다.
//
// string을 사용하려면 #include <string>을 먼저 작성할 필요가 있다.
//
#include <iostream>
// using 키워드 : 타이핑 양을 줄이기 위해서 사용하는 키워드. 어디에 속해 있는 변수, 함수의 반복적 타이핑을 줄이는데 사용된다.
// 예시
using namespace std; // std 라는 영역에 존재하는 객체를 표시하는 걸 나타내는 std::를 쓰지 않아도 된다.
namespace hi
{
void good()
{
cout << "hello" << endl;
}
}
namespace hello
{
void good()
{
cout << "hello" << endl;
}
}
using namespace hi;
using namespace hello;
int main()
{
cout << "hello, world!" << endl;
std::cout << "써도 되고 안 써도 된다." << std::endl;
//cout << good << endl; // 하지만 이와 같이 같은 이름의 변수/함수/클래스명이 존재할 때 동시에 사용하면 컴파일 오류가 나온다.
//cout << good << endl;
return 0;
}
// Main.cpp
#include <iostream>
int main(void)
{
int Number;
std::cin >> Number;
std::cout << "Number: " << Number
<< " // eof bit: " << std::cin.eof()
// cin.eof 함수 : cin을 통해 변수 Number에 어떤 값이 들어갔는지 보는 것. 예를 들어 123abc를 넣었다면 123만 출력된다.
<< " // fail bit: " << std::cin.fail() << std::endl;
// cin.fail 함수 : cin을 통해 변수 Number에 값을 넣기 전에 중간 배수로인 스트림에 문제가 있는지 확인하는 것.
// 예를 들어 123abc를 넣었다면 int 자료형의 변수인 Number에 들어가지 못한 스트림에 abc가 있어 초기화되지 못하기에 false 상태가 출력된다.
std::cin.clear();
// cin.clear : eofbit, failbit, badbit을 unset 시켜주는 함수. good state로 만들어줌.
// eofbit : “더이상 읽을 입력 데이터가 없음”
// failbit : “읽고자 하는 입력 데이터의 자료형이나 형식이 맞지 않음”
// badbit : “입력 장치의 심각한 오류”, 거의 일어나지 않음.
// good state : “아무 문제 없음”, “기본 상태”
std::cin.ignore(LLONG_MAX, '\n');
// cin.ignore(LLONG_MAX, '\n')
// cin.ignore : 스트림에 있는 문자를 버린다. 별도의 값을 지정하지 않으면 문자 1개를 버린다.
// (LLONG_MAX, '\n') : 최대 문자 수를 버린다. 단, \n 문자를 버릴 경우 버리는 걸 멈춘다.
// (10, '\n') : 스트림에 있는 문자 10 개를 버린다. 단, \n 문자를 버릴 경우 버리는 걸 멈춘다.
std::cin >> Number;
std::cout << "Number: " << Number
<< " // eof bit: " << std::cin.eof()
<< " // fail bit: " << std::cin.fail() << std::endl;
std::cin.clear();
std::cin.ignore(LLONG_MAX, '\n');
std::cin >> Number;
std::cout << "Number: " << Number
<< " // eof bit: " << std::cin.eof()
<< " // fail bit: " << std::cin.fail() << std::endl;
return 0;
}
#include <iostream>
#include <string>
// 자료형 변수명 = 값; == int A = 1;
// 자료형* 포인터명 = 메모리주소값; == int* B = &A;
// 자료형& 참조명 = 변수명; == int& C = A;
int main()
{
int A = 1;
int* B = &A;
int& C = A;
std::cout << *B << std::endl; // 포인터는 변수의 메모리주소를 대입시키는 것이다.
std::cout << C << std::endl; // 참조(레퍼런스)는 변수의 별명을 붙이는 것이다.
// 따라서 이 같은 경우 *B == C; 와 같이 출력된다.
// 하지만 참조의 경우 포인터와 몇 가지 차이점이 있다.
// 1. 참조는 NULL 값을 대입시킬 수 없다. (참조자는 변수의 별명을 붙이는 건데 별명을 붙일 대상이 없는 식)
// 2. 참조는 선언과 동시에 반드시 초기화 되어야 한다. (NULL과 같은 이유. 초기화 시키지 않으면 별명을 붙일 대상이 없다.)
// 3. 참조는 한 번 정해진 변수를 바꿀 수 없다. (int& A = B; 에 A = C; 를 하면 int& A가 C가 되는게 아니라, B에 C의 값이 대입된것.
int F = 1;
int G = 10;
int* E = &F;
std::cout << *E << std::endl;
E = &G;
std::cout << *E << std::endl;
// 포인터의 경우 한 번 정해진 변수를 바꿀 수 있다.
return 0;
}