# cpp module
[CPP Module] 00
기록의 이유 CPP 과제를 하면서 각 과제에서 중요하게 생각한 점과 배운점을 정리하기 위해 기록을 시작한다. ex00 프로그램에 들어온 인자들의 알파벳을 모두 대문자로 하여 출력하는 과제 cpp를 간단하게 시작해보는 과제 (like Hello World) 사용 함수 정확하게 함수는 아니지만 표준 입출력 스트림인 cin과 cout을 필수적으로 사용해야 한다. 사용 법만 알아도 사용하는데 큰 불편함이 없지만, cout이 어떻게 작동하는지 알고 싶어서 조금 더 공부해봤다. 표준 입출력 스트림의 계층도 표준 입출력 스트림의 계층도 계층도 istream과 ostream 부분에 istream과 ostream이 basic_istream, `ba
CPP Module 04 바닥까지 싹싹 긁어먹는 법 (ex03)
ex03 순수가상함수를 가지고 있는 추상 클래스를 일반적으로 인터페이스라고 부른다.(C++98에는 존재하지 않는 개념이지만) ex03은 인터페이스를 이용하는 과제이다. > 우선 아래와 같은 AMateria 클래스를 만들어야 한다. 해당 AMateria를 상속받는 Materias 속성 두 가지를 만든다. Ice, Cure. 두 속성은 type이라는 string 변수를 가지고 해당 변수값은 속성의 이름을 lowercase로 가진다.(ice, cure) AMateria로부터 순수 가상 함수로 상속받은 clone은 같은 속성의 새로운 객체(new)를 반환한다. use는 다음과 같은 출력을 반환한다. Ice: "* shoots an ice bolt at (name) *" Cure: "* heals (name)'s wounds *" name은 인터페이스 ICharacter를 상속받는 Character 클래스가 가지고 있는 변수이다. 아래와 같은 ICharacter 인터페이스

CPP Module 01
메모리 할당, 포인터와 레퍼런스, switch 구문 ex00: BraiiiiiiinnnzzzZ > Zombie 클래스를 구현하십시오. private 멤버: string name 멤버함수: void announce(void); Zombie가 자신을 다음과 같이 소개합니다: 추가로 다음 두가지 함수를 구현하십시오. : name 이름으로 Zombie 인스턴스를 생성하여, 함수 스코프 외부에서도 쓸 수 있게 반환합니다. : name 이름으로 Zombie 인스턴스를 생성하고, announce()를 실행합니다. 디버깅을 위해 소멸자에 적절한 출력 메시지를 구현하십시오. 과제의 핵심? Zombie 인스턴스 생성 시, 정적 할당과 동적 할당의 차이를 물어보는 문제. 메모리 영역 복습 
CPP Module 00
CPP 과제의 시작 > ### 공통 지침 >> 컴파일 c++을 사용하여 컴파일하며, -Wall -Wextra -Werror 플래그를 추가해야 합니다. -std=c++98 플래그를 추가했을 떄 컴파일이 정상적으로 이루어져야 합니다. 형식 및 클래스 이름 명명 Class 이름은 UpperCamelCase 형식을 지켜야 합니다. 예시) ClassName.hpp/ClassName.cpp ... 따로 명시되어있지 않는 한, 모든 output 메시지는 new-line 으로 끝나야 하며, standard output 으로 출력되어야 합니다. Goodbye Norminette! 강제되는 코드 스타일은 더이상 없지만, 가독성 있는 코드 스타일링을 유지하세요. 허용/금지 사항 Standard library에 있는 모든 것은 사용 가능하되, 최대한 "C++ 스러운" 함수들을 사용하세요. 다른 외부 라이브러리

[C++] cast
C++에는 casting을 위한 연산자 4가지를 제공한다. staticcast, constcast, dynamiccast, reinterpretcast 인데 각자의 역할이 모두 다르다. static_cast static_cast 는 가장 일반적인 형변환 형식이다. 논리적으로 변환 가능한 타입을 변환해준다. 예를들어 float형을 int로 변환한단거나 하는 이런식으로 사용하면 된다. const_cast cosnt_cast는 const 형식의 변수에서 const를 제거하는데 사용된다. 그렇다고 const형 변수의 값을 변환할 수 있는건 아니고, 위와 같이 const형이 아닌 매개변수를 받는 함수의 매개변수로 const형 변수를 넘겨주려고 할 때나 사용된다. 그리고 형 변환은 포인터형으로만 변경할 수 있다. 하지만 const_cast에는 큰 취약점이 존재하는데, 위 코드를 실행해보면
[C++] 상속과 virtual 키워드
C++에선 클래스에서 다른 클래스를 상속받아 사용할 수 있고, 상속한 클래스에 이미 정의되어 있는 함수를 재정의하는 오버라이딩이 가능하다. 그리고 상속받은 클래스를 상속한 클래스의 자료형으로 사용하는 업캐스팅이 가능한데, 오버라이딩과 업캐스팅을 둘 다 해주다보면 문제가 발생한다. 업캐스팅을 하지 않은 b 변수는 f 함수를 실행하였을때 정상적으로 B 클래스의 f 함수가 실행되어 "B" 를 출력하지만, A 클래스로 업캐스팅 된 a 변수는 B 클래스의 생성자를 이용해 생성해주었음에도 A 클래스의 f 함수가 실행되어 "A"를 출력하게 된다. 이 문제를 해결해주기 위한 것이 virtual 키워드이다. 오버라이딩 할 함수의 부모클래스에 있는 함수에 virtual 을 붙여주면 업캐스팅한 자식클래스에서도 정상적으로 원래 본인의 함수를 실행해준다. 상속 해줄 클래스를 만들 때 특히 소멸자는 항상 virtual 키워드를 붙여서 선언해주어야 한다. C++에서는 다중상속을 지원해주는데, 이 경

고정소수점과 부동소수점
cpp module 02의 주제는 고정소수점을 클래스로 구현하는 것이다. 구현 자체는 그리 어렵지 않고 고정소수점과 부동소수점의 개념을 익히는 것이 중요하다. 처음에 나는 부동이 움직이지 않는다 라는 의미로 이해하고 '그럼 고정과 부동 차이가 대체 뭔가' 했는데 물에 떠서 움직인다는 뜻의 부동이었다. 아니 애초에 우리가 실수형을 처리할 때 사용하는 float 변수가 부동소수점의 원어인 floating point 에서 따온듯 하다. 아무튼 그래서 우리가 사용하는 실수형 변수는 부동소수점을 사용한다. 고정소수점 고정 소수점은 비트 저장시 정수를 표현할 비트와 소수를 저장할 비트가 나뉘어져 있다. 그래서 7.625라는 10진법을 저장하려면, 이진법으로 바꾸었을 때 111.101이 되고 위 사진처럼 정수부 자리
[C++] 참조(레퍼런스)와 포인터의 차이
포인터는 주소값을 가리키는 것이고, 참조는 변수 그 자체를 불러온다. 포인터를 사용할 때 변수명 앞에 *을 붙이는 것처럼 참조형 변수를 사용할 때는 &를 붙인다. 포인터는 주소값을 가리키기 때문에 어떠한 변수를 가리키기 위해서는 그 변수의 주소값을 넣어주어야 하지만 참조는 그냥 변수를 대입해주면 된다. 예를 들어 메모리 영역 0x00000042를 int a에 할당하고 10을 저장했다고 하면, pointer 변수는 0x00000046에 할당되고, 0x00000042가 저장되어 있을 것이다. 하지만 참조변수 ref는 별도의 메모리 영역을 사용하지 않고 0x00000042에 그대로 할당된다. a라는 변수를 ref로도 부를 수 있도록 해준다. 위 코드를 실행해보면 10이 출력된다. 함수의 매개변수를 참조형 변수로 지정했기 때문에 함수에서는 들어온 매개변수의 주소에 바로 접근할 수 있게되는 것이다. 이렇게 매개변수를 참조형 변수로 지정하는 것은 메모리상에서 큰 이점을 같는데, 그냥 변

CPP Module 05
CPP Module 05 > 해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다. 1. C++의 예외처리 예외(exception)란 프로그램의 실행 도중에 발생하는 문제상황을 의미한다. 문법적인 오류가 아닌, 프로그램의 논리에 맞지 않는 상황인 것이다. if문을 통해 간단하게 예외를 처리할 수도 있지만 그렇게 되면 예외처리를 위한 코드와 프로그램의 흐름을 구성하는 코드를 쉽게 구분하지 못한다는 단점이 있다. 따라서 C++은 구조적으로 예외를 처리할 수 있는 메커니즘을 제공한다. 이를 이용하면 예외처리 부분을 프로그램의 일반적인 흐름에서 독립시킬 수 있기 때문에 코드의 가독성과 유지보수성을 높일 수 있다. 이 메커니즘은 다음의 3가지 키워드를 통해 이용할 수 있다. try 예외발생에 대한 검사의 범위를 지정한다. catch try 블록의 뒤에 바로 등장하며, try 블록에서 발생한 예외를 처리

CPP Module 04
CPP Module 04 > 해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다. 1. 다형성 (Polymorphism) > 부모 클래스 = 기반 클래스 = 기초 클래스 > 자식 클래스 = 파생 클래스 = 유도 클래스 1-1. 다형성 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다. 객체지향 언어에서 서로 다른 객체가 동일한 메시지에 대하여 서로 다른 방법으로 응답할 수 있는 기능이라고 정의할 수도 있다. 참조 변수의 다형성은 기초 클래스 타입의 참조 변수로 유도 클래스 타입의 객체를 참조할 수 있도록 하는 것이다. (업 캐스팅) 상속의 구조에서 다형성을 이루기 위해선 몇 가지 조건을 만족해야 하는데 이를 컴파일 타임과 런 타임, 2가지 관점으로 나누어 볼 수 있다. 컴파일 타임에서는 상속 관계에 있는 클래스들의 함수와 연산자의 `overload

CPP Module 03
CPP Module 03 > 해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다. 1. 상속 (Inheritance) 1-1. 상속의 기능 객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법으로 다른 클래스에서 속성과 특성을 파생시키는 기능을 의미힌다. 여기서 상속을 하는 클래스를 상위 클래스, 기반 클래스, 기초 클래스, 또는 부모 클래스라고 하고, 상속을 받는 클래스를 하위 클래스, 파생 클래스, 유도 클래스, 또는 자식 클래스라고 한다. 상속이 이루어지면 유도 클래스는 기초 클래스의 모든 멤버를 물려받는다. 1-2. 상속 시 클래스 초기화 기초 클래스와 유도 클래스 모두 해당 클래스의 멤버는 해당 클래스의 생성자를 통해서 초기화해야 한다. 따라서 유도 클래스의 객체 생성 과정에서는 기초 클래스의 생성

CPP Module 02
CPP Module 02 > 해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다. 1. Orthodox Canonical Form Canonical Form이란 정해진 규칙을 정확히 따르며 개발하는 프로그래밍을 의미한다. 일종의 code convention이라고 볼 수 있다. 과제에서 요구하는 해당 형식은 다음 네 가지의 형태를 명시적으로 정의하여 선언하는 것을 가리킨다. 기본 생성자 복사 생성자 대입 연산자 오버로딩 소멸자 1-1. 기본 생성자 기본 생성자는 별도로 생성자를 구현하지 않을 시 사용되는 생성자이다. 매개변수는 없고 멤버 변수가 0, NULL 등으로 초기화 된다. 1-2. 복사 생성자 복사 생성자란 같은 클래스의 다른 객체의 참조자(Reference)를 인자로 받아, 그 참조를 이용해 자신의 객체를 초기화하는 클래스 함수이다. 기존 값을 복사하

CPP Module 01
CPP Module 01 > 해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다. 1. ex00 (BraiiiiiiinnnzzzZ) 객체(인스턴스)를 생성하는 두 가지 방법 : stack 영역 런타임 시점에서 크기가 결정된다. LIFO 구조이다. 함수의 매개변수나 지역변수가 위치하는 곳이다. 스택의 경우 선언했던 함수 영역을 벗어난 경우 자동으로 소멸된다. .연산자를 통해 인스턴스에 접근할 수 있다. heap 영역 컴파일 시점에서 크기가 결정된다. 동적 메모리 할당(new)을 통해 저장되는 영역이다. 힙 영역은 모든 프로세스에서 동적으로 로드된 모듈에서 공유된다. ->연산자를 통해 인스턴스에 접근할 수 있다. 사용이 종료된 시점에 할당을 해제(delete)하지 않으면 메모리 누수가 발생한다. 
CPP Module 00
CPP Module 00 > 해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다. 1. ex00 (Megaphone) 1-1. 타입 캐스트 연산자 C++는 다음의 4가지 타입 캐스트 연산자를 지원한다. 1) static_cast 논리적으로 변환 가능한 경우에만 변환 허용 실수 → 정수 또는 정수 → 실수로 변환하는 것은 가능 포인터 → 정수 등으로 변환하는 것은 불가능 배열 → 포인터로 변환하는 것은 가능 포인터 type을 다른 것으로 변환하는 것은 허용하지 않지만, 상속 관계에 있어서는 포인터끼리 변환 가능 2) dynamic_cast 포인터 → 포인터, 참조자 → 참조자 간의 변환만을 허용 3) const_cast 오로지 상수성 변환만 허용 포인터 또는 참조자의 상수성을 잠깐 제거해주는데 사용 `v

[42Seoul] CPP Module 01 - ex04
fstream 헤더 fstream 헤더는 c++에서의 파일 입출력 헤더이다.std::cout, std::cin과 유사하게 시프트 연산을 통해 사용할 수 있다. fstream 헤더에는 총 세 가지 클래스가 존재한다. ifstream ofstream fstream 파일 불러오기 파일 내용 출력해 보기 s1문자열이 있는지 확인하기 s1 내용을 s2 내용으로 바꾸기 해당 파일을 .replace 확장자 붙여서 출력하기

[42Seoul] CPP Module 01 - ex03
해당 과제에서는 main문이 주어진다. == main을 보고 필요함 함수를 파악해야 한다. club 객체의 setType 함수를 사용해도 Human 객체가 지니고 있는 Weapon의 type이 변경되므로, Human 클래스 내의 Weapon은 생성자는 setWeapon 함수를 통해 들어온 Weapon 객체가 저장된 메모리를 참조할 수 있어야 한다. Human 클래스 내의 Weapon은 포인터나 참조자로 선언한다. 과제 규칙 중 HumanB는 Weapon이 NULL일 수도 있다는 의미이로 HumanB는 포인터로 선언. club은 포인터 변수가 아니며, HumanA 생성자의 두번째 매개변수로 객체 자체를 받기 때문에 HumanA는 참조자로 선언한다. HumanA, HumanB에서 사용하는 Weapon을 꺼내지 않고 setType을 통해 A, B에 저장된 Weapon 값이 변경되어야 한다. setWeapon()나 HumanA 생성자에서는 포인터를 사용하지

[42Seoul] CPP Module 01 - ex02
참조자 변수는 할당된 메모리 공간에 붙여진 이름이다. 우리는 변수의 이름을 가지고 해당 메모리 공간에 접근이 가능하다. 참조자는 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것을 말한다. 자신이 참조하는 변수를 대신할 수 있는 별명과 같은 것이다. stringREF은 str의 별명이며 같은 메모리 공간을 참조한다. 참조자를 통해 값을 변경하면 메모리 공간을 같이 쓰는 변수의 값도 변경된다. 참조자와 포인터 참조자와 포인터

[42Seoul] CPP Module 01 - ex01
객체 배열과 객체 포인터 배열 객체를 배열 넣는 방법은 두 가지가 있는데 객체 배열과 객체 포인터 배열이다. 객체 배열 객체 배열 선언 시 생성자도 호출되지만 생성자에 인자를 전달하지 못한다. 원하는 값으로 초기화가 필요하다면 초기화 과정이 따로 필요하다. 객체 배열 생성 시 생성자가 호출되는 것이 확인된다, 배열 소멸 시 소멸자도 호출. 객체 포인터 배열 객체의 주소를 담는 방식. 선언 후 일일히 동적할당하여 반환된 객체의 주소값을 배열에 대입해 줘야 함. zombieHorde 함수 N개의 Zombie를 한 번에 할당해야 하며 한 번에 삭제되어야 한다. 주소를 반환하라고 하지 않았으니 객체 배열로 만든다. ex00에 사용한 함수를 그대로 재활용해도 된다는 조건에 추가 작업할 시간은 줄었는데 함수를 작성하고 보니 name이 그대로 사용되어 구분이 어려웠다. 
[42Seoul] CPP Module 00 - ex00
EX00: Megaphone [C++ 의 표준출력 std::cout 의 연습] to_upper 프로그램 만들기 제출할 디렉토리: ex00/ 제출할 파일: Makefile, megaphone.cpp 금지 함수: 없음 다음과 같은 동작을 하는 프로그램을 쓰세요 대문자로 바꾸기 if (argc == 1) 출력 출력시 argv 간 띄어쓰기 추가하지 않음 마지막줄 개행 과제를 작성하기 전 C++의 표

[42Seoul] CPP Module
네임 스페이스, 클래스, 멤버 함수, stdio 스트림, 초기화 목록, 정적, 상수 등등에 대해 공부합니다 C++ Module에서는 C++98만 사용하고 있습니다. 객체 지향 프로그래밍의 기초를 공부하는 것을 목표로 합니다. 현재의 C++와 42에서 공부할 C++가 많은 면에서 다르다는 것을 알고 있다. 숙련된 C++ 코더가 되고 싶다면 현대적인 표준 C++이 필요할 것이다. General rules Header 안에 구현된 모든 기능 및 보호되지 않은 Header는 0 점을 의미합니다 모든 출력은 표준 출력이며, 기본적으로 개행으로 끝납니다. 파일 이름에는 letter, class name, function name, method name이 와야 합니다. 명심하세요. 당신은 이제 C가 아닌 C++로 코딩하고 있습니다. 다음 기능은 금지된 기능입니다. 해당 기능을 사용하면 0 점 처리를 받습니다. *alloc, printf, fr