카테고리 없음

03 - 30 C++ 보충 2-1챕터

pp4037 2026. 3. 30. 20:07
#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;
}