리눅스에서 파일을 읽고 쓰는 방법은 저수준 파일입출력과 고수준 파일입출력으로 구분할 수 있다. 각각의 차이는 다음 표와 같고, 나는 파일 디스크럽터를 통해 파일을 다룰 수있는 가장 기본적인 OPEN, READ함수를 사용하기 위해 이 글을 정리해보았다.
단일 연결리스트에서 삽입과 삭제를 통해 head 포인터의 값을 변화시킬 수 있다.이때, 호출 함수의 포인터변수가 참조하는 객체를 피호출 함수에서 바꾸고자 할 경우 이중 포인터를 사용하면 된다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간(RAM)은 다음과 같다.
Makefile을 사용하는 이유는 위와 같은 복잡한 과정을 생략할 수 있어서이기도 하지만, Makefile이 제공하는 강력한 기능 중 하나인 Incremental build 를 사용하기 위해서다.
하지만 정적변수는 전역변수와 동일하게 컴파일시 메모리에 할당되며, 프로그램 종료시 메모리가 해제된다. 따라서 정적 변수는 전역변수처럼 변수의 범위를 벗어나는 경우에도 값을 유지하는 속성을 가지고 있다.
가만보면 printf 라는 함수는 인자를 1개만 넣어도 되고, 2개만 넣어도 되고, 3개, 4개 그 이상을 넣어도 문제없이 돌아간다. 이것을 가능하게 하는 가변인자(Variadic Arguments)에 대해 정리해보았다.
ar 명령은 정적 라이브러리를 생성할 때뿐만 아니라, 정적 라이브러리의 기능을 부분적으로 변경하고자 할 경우에도 사용할 수 있다.
ft_printf 과제를 진행하려면 이 전 과제로 만든 libft 정적 라이브러리를 사용해야한다. 어떻게 ft_printf 소스파일과 libft.a 라이브러리 파일을 함께 컴파일할 수 있는지 정리해보았다.
Makefile 을 작성할 때 자주 사용하는 자동 변수들과 문법을 정리해보았다.
형식문자열? 포맷? 형식태그? 서식지정자? 헷갈리는 printf 함수의 옵션들을 정리해보았다.
컴파일할 때 아래 옵션을 넣어주면 어디서 문제 생긴건지 알려준다. -g -fsanitize=address
CPP의 std i/o stream, namespace 에 대한 기본적인 정리
My Awesome Phonebook 과제를 통해 객체지향으로 프로그램을 설계하는 방법, 생성자로 인스턴스를 생성하는 방법, 접근제어 지시자와 const 함수로 좋은 클래스를 정의하는 방법을 학습했다.
new 는 1.메모리 할당, 2.생성자 호출, 3.타입 변환 까지 총 세 가지의 일을 한다. malloc보다 훨씬 유용하다.
진짜 '랜덤'한 수를 얻으려면 seed에 매번 다른 숫자를 넣어 srand함수로 rand함수를 초기화 해줘야 한다. 이때 매번 다른 수를 어떻게 넣어줄 수 있을까?
참조자와 포인터의 차이점, 그리고 댕글링 레퍼런스의 위험성과 그것을 해결하는 방법 중 하나인 Const 참조자에 대한 정리.
this와 stringstream 을 활용해 인스턴스의 주소값을 문자열로 얻을 수 있다.
텍스트 파일의 특정 문자열을 원하는 문자열로 치환하는 프로그램 만들기
canonical이란, "규정대로"하는 프로그래밍을 의미한다. 앞으로의 CPP 과제는 Coplien form 규정대로 클래스를 작성해야한다.
fractional bits가 8일 때 공식을 정리하자면 다음과 같다.
다중 상속 클래스 객체 생성시의 문제점은, 기초 클래스 ClapTrap이 불필요하게 두 번 생성된다는 점이다.
과제를 요약하자면, 마법사 Sorcerer가 불쌍한 Victim 과 Peon을 동물로 변신시켜버리는 내용이다. 이 때 마법에 당한(?) Victim과 Peon은 같은 getPolymorphed() 메서드를 호출하지만, 그 실행 결과는 다르다.
추상 클래스의 특징은 오버라이드, 즉 '함수를 반드시 재정의해야하는 것'이라고 정리할 수 있을 것 같다. 순수 가상함수를 재정의하지 않으면 코드 상에서 에러로 판단하기 때문에 실수들을 방지할 수 있다.
바람직한 추상 클래스 == 인터페이스
C에서는 조건문(if)를 통해서 예외를 처리했었지만, CPP에서는 보다 더 직관적인 문법을 제공한다.
ex00과제에서 static_cast 를, ex01과제에서 reinterpret_cast 를, ex02과제에서 dynamic_cast 에 대해 학습한다.
함수 템플릿을 사용하면 서로 다른 타입에서 동작하는 함수를 한 번에 정의할 수 있다.
과제의 핵심은 stack이 CPP에서 <컨테이너 어댑터>라는 점을 인식하는 것이다.