C++(57)
-
[C++] friend 선언(클래스, 함수)
friend 선언 - 클래스• 클래스에 friend 선언을 하면 private 멤버에 접근할 수 있다.애초에 private의 목적이 외부에 공개하지 않는 것이기 때문에 웬만하면 friend를 사용하지 않는 게 좋다.접근하기 불편하다고 friend 선언이나 public 선언을 하면 어디에서든지 접근하여 사용할 수 있어서 유지보수가 힘들어진다.따라서 데이터를 주고받을 일이 많지 않다면 멤버는 private으로 감추고 멤버 함수를 통해서만 접근할 수 있도록 막아주는 방법이 좋다.▷ 예시#include using std::cout;using std::endl;class A; // A 클래스 미리 선언class B {private: int bi; friend class A; // A 클래스는 B 클래스..
2024.04.03 -
[C++] vector 내부에 iterator 클래스 구현 (+ 연산자 오버로딩, 복사 생성자)
vector 내부에 iterator 클래스 만드는데, 클래스 템플릿이기 때문에 내부에 있는 iterator도 템플릿이 된다.iterator는 데이터의 시작 주소와 가리키고 있는 데이터가 시작 주소로부터 몇 번째인지 알아야 한다.즉, iterator는 데이터의 시작 주소와 인덱스(시작 주소로부터 몇 칸 떨어져 있는지)만 알면 된다. ex) 3번째를 가리키는 경우, 시작 주소와 인덱스 2의 주소만 알면 된다.또한 자료형도 알아야 하는데, 템플릿이기 때문에 데이터의 시작 주소 타입은 `T*`이다. ▷ 코드CArr.h#pragma once#include // 클래스 템플릿template// T는 가변 배열에 저장될 데이터 타입이다.class CArr // CArr로 vector를 만들어도 CArr과 iter..
2024.04.03 -
[C++] printf(), scanf()로 cin, cout 구현
#include #include // printf(), scanf_s()#include // setlocale(), _wsetlocale()// 사용자 정의 입출력 스트림 클래스 // cin, cout을 하나의 클래스에 구현했다.class CMyIOStream {public: //--------- cout 구현 ---------// // 연산자 오버로딩: 정수 출력 CMyIOStream& operator>(int& _idata) { scanf_s("%d", &_idata); // 정수 입력 return *this; // 객체 자기 자신 반환 } // 연산자 오버로딩: 문자열 입력 (1byte 문자열) CMyIOStream& operator..
2024.04.02 -
[C++] 템플릿 (함수/클래스)
아래 링크 클릭 시 해당 본문으로 이동템플릿 (Template)함수 템플릿클래스 템플릿▷ 전체 코드템플릿 (Template)template : 주형(용해된 금속을 주입하여 주물을 만드는 데 사용하는 틀)• ``에서 `T`는 템플릿 타입 매개변수로, 템플릿에 사용될 데이터 타입에 대한 자리 표시자(placeholder) 역할을 한다.• 보통 `typename`과 `T`로 작성하지만 내 마음대로 작성해도 된다.(ex. class로 적어도 되지만, 여기서 class는 우리가 알고 있는 class가 아니다.)※ 함수 템플릿은 함수가 아니고, 클래스 템플릿은 클래스가 아니다. • 템플릿이라는 것 자체가 틀을 만드는 중이라서 아직 만들어지지 않은 코드이므로 자동완성 기능을 제공하지 않는다. (를 눌러도 자동완성이 ..
2024.04.02 -
[C++] 연산자 오버로딩
클래스는 내가 선언한 자료형이기 때문에 컴파일러는 연산을 어떻게 처리해야 할지 알 수가 없다.이때 연산자 오버로딩을 사용하여 정의하면 내가 만든 자료형끼리의 연산이 가능해진다.연산자 오버로딩 (Operator Overloading)• 오버로딩 : 동일한 이름의 함수이지만 인자나 몇 가지 특징이 달라서 컴파일러가 충분히 구별할 수 있는 것• 기존에 정의된 연산자(`+`, `-`, `*`, `=` 등)처럼 각 연산자에 대응하는 기능을 직접 정의해서 만든다.이를 통해 사용자가 정의한 자료형도 원래 자료형처럼 연산자를 사용할 수 있다.• `operator` 키워드를 사용하고, 연산자도 함수의 일종으로 본다.즉, 연산자를 호출했을 때 어떤 함수가 호출되도록 연결지어주는 기능이 있어야 한다.• 클래스의 객체에 대입..
2024.04.02 -
[C++] 접근 지정자
멤버는 언제든지 변경가능하기 때문에 원치 않는 수정으로 값이 바뀌는 문제가 발생한다.이를 방지하기 위해 변경할 수 없게 제한을 두는 기능이 필요하다.접근 지정자가 바로 그 역할을 하며, 캡슐화를 지원한다.캡슐화• 알약 내부 성분이 캡슐 덕분에 보호받는 것처럼 외부로부터 객체의 데이터에 접근하는 것을 막아서 보호하는 것을 의미한다.• 접근해도 되는 데이터는 외부에서 접근할 수 있게 해준다.접근 지정자• C++에서 클래스나 구조체 내에서 객체의 멤버 변수와 멤버 함수에 접근성을 결정하는 키워드이다.• 클래스는 접근 지정자를 명시하지 않으면 디폴트로 `private`이 지정된다.※ 그래도 명시적으로 private 적어주기반면, 구조체는 접근 지정자 디폴트가 `public`이다. 1) public [공개]• 외..
2024.04.01 -
[C++] 래퍼런스 (vs. 포인터)
포인터 및 래퍼런스 문법 요약• 자료형* 변수명; ➜ 포인터 변수 선언 (자료형* 타입의 변수)• *포인터변수; ➜ 포인터로 주소 역참조 (포인터 변수에 저장되어 있는 주소로 역참조 한다.)• &변수; ➜ 변수의 주소값 (본인의 주소값을 반환)• 자료형& 변수명; ➜ 래퍼런스 변수 선언원본에 접근할 수 있는 방법인 포인터 말고도 C++에서 래퍼런스가 추가됐다.래퍼런스(Reference) `&` • C++에 추가된 기능으로, 포인터와 유사하다.• 참조한 원본을 전달한다.• 참조 변수를 통해서 직접적으로 원본을 수정할 수 있다.래퍼런스를 사용하는 이유크기가 큰 원본을 그대로 전달하면 복사 비용이 많이 든다.포인터 변수는 주소를 통해서 접근하기 때문에 원본의 크기는 고정적이다.그래서 비용을 줄이기 위해 래퍼런..
2024.04.01 -
[C/C++] 가변 배열 - 구조체/분할 구현
아래 링크 클릭 시 해당 본문으로 이동가변 배열 - C구조체분할 구현가변 배열 - C++구조체분할 구현가변 배열 - C구조체와 동적 할당을 이용하여 가변 배열 자료형 만들기Arr.h#pragma once// 가변 배열 자료형 tArr (int)typedef struct _tagArr{ int* pInt; int iCount; int iMaxCount;} tArr;// 배열 초기화 함수 // 반환 타입이 필요없기 때문에 void // 주소를 넘겨줘야 되기 때문에 인자 타입은 배열의 주소인 tArr*void InitArr(tArr* _pArr);// 데이터 추가 함수 // 인자 타입은 배열의 주소 tArr* // int 데이터를 추가해야 되므로 int형 인자 _iData 추가void P..
2024.03.28