[C/C++] 선언(Declaration)과 정의(Definition)의 차이

프로그래밍/C++ 2022. 6. 21. 01:08

* 본 글은 학부생의 눈높이에 작성되었습니다 int a; int a = 10; 오류C2086'int a': 재정의 위 코드를 Visual Studio 에서 실행해보면 int a가 재정의(redefinition) 됐다는 오류 메세지가 출력되면서 컴파일이 되지 않습니다. 이런 오류 메세지는 컴파일러마다 다른데 재정의가 아니라 재선언(redeclaration) 이라는 오류 메세지가 출력되기도 합니다. 과연 정의와 선언의 차이는 무엇일까요? 정의와 선언은 다양한 프로그래밍 자료에서 혼동되어 사용되는 단어긴 하지만 엄밀히 따지면 이 둘은 다른것 입니다. 오늘은 이에 대해 알아보겠습니다. 선언(Declaration) vs 정의(Definition) 모든 정의는 선언을 포함하고 있지만 모든 선언은 정의가 아니다. 즉..

Article Thumbnail
[C++] Natural Sort 사용하기

프로그래밍/C++ 2022. 6. 14. 01:30

숫자, 이름이 여러 섞여 있는 내용의 문자열에 대해 윈도우 탐색기와 같은 정렬을 기대하려면 Natural Sort 라는 정렬을 시행해야 합니다. Natural Sort 란 쉽게 말해서 인간이 하는 방식으로 영문자 숫자를 정렬하는 방식을 이야기 합니다. 파이썬에선 natsort 라는 라이브러리가 있어서 그냥 pip install 로 설치하고 사용하면 끝이였는데 C++에서는 당연하게도 직접 구현해야 합니다. 제목을 보시면 알겠지만 Natural Sort 구현하기가 아니라 '사용하기' 입니다. 깃허브에 이미 친절하게 구현을 해둔 분이 있어서 이걸 사용하시면 됩니다. https://github.com/scopeInfinity/NaturalSort GitHub - scopeInfinity/NaturalSort: ..

Article Thumbnail
[C++] Visual Studio <std::filesystem> 사용하기

프로그래밍/C++ 2022. 6. 11. 23:39

서론 기존에 대학교 프로젝트로 C언어를 이용해 파일 이름 변경기를 만든적이 있었습니다. C언어에는 string class도 없어서 문자열들을 배열에 동적으로 저장하고 싶으면 char[] 을 이용해서 동적할당으로 구현해야 했고, 이에 따른 버그가 다량으로 발생했습니다. (예를 들어서 파일 이름을 변경할 때 치환할 문자열이 너무 길거나 illegal 한 문자가 들어가면 프로그램이 그대로 튕겨버린다던가..., C에서는 예외처리 문법도 없습니다 ;;) 또한 디렉토리 내에 파일을 순회할 때 C언어에서 공식적으로 파일 시스템에 관한 기능이 제공되지 않아서 우회책으로 dirent.h 이라는 헤더 파일의 조금 수정된 버전을 이용해서 기능을 구현했던 기억이 납니다. *dirent.h를 사용해서 디렉토리 순회하는 방법에 ..

Article Thumbnail
[C++] C++ 싫어. 파이썬 좋아.

프로그래밍/C++ 2022. 6. 8. 02:53

도대체 이놈의 언어는 동적 할당 하나 때문에 class에서 고려해줘야 하는게 몇개인지.. 복사 생성, 복사 대입, 이동 생성, 이동 대입... 하다보면 정말 C++이 얼마나 극한의 성능 최적화가 가능한지 알게 됨과 동시에, C에서 객체 지향 개념만 추가하다가 이것 저것 다 추가해서 누더기 괴물이 되어버린 C++이 얼마나 방대한 언어인지 새삼 깨닫게 됩니다.. 특히 임시값을 가리키는 Rvalue Reference는 또 어떻게 만들 생각을 했는지.. GC(가비지 컬렉터) 가 있는 언어가 정말 그리워 지는군요 ㅜ ㅜ 이와는 반대로 온갖 고생해서 컴파일하면 kb 단위 exe 용량이랑, 엄청 빠른 수행 속도 보고 또 그런 생각이 사라지기도 하고..

Article Thumbnail
[C++] std_lib_facilities.h 헤더 파일 이란?

프로그래밍/C++ 2022. 4. 2. 03:22

위와 같은 원서로 C++ 강좌를 듣고 있는데 std_lib_facilities.h 라는 난생 처음 보는 헤더 파일로 프로그래밍을 배우고 있습니다. 사실 수업만 따라가면 알 수 있는 내용이였으나 이 파일을 아예 처음 보셨다거나 수업에서 접하게 되었는데 설명없이 넘어가서 뭔지 모르겠다는 분들을 위해 이 헤더 파일이 무엇인지 간단하게 설명해드립니다. /* std_lib_facilities.h */ /* simple "Programming: Principles and Practice using C++ (second edition)" course header to be used for the first few weeks. It provides the most common standard headers (in th..

Article Thumbnail
[C++] while(cin) 으로 자료형이 올바른 값을 계속 입력 받기

프로그래밍/C++ 2022. 4. 1. 00:40

수업을 듣다가 아래 두개의 구문에 대한 의문이 생기게 되었습니다. 과연 정확히 이 두 표현식이 정확히 의미하는 바가 무엇일까? 오늘은 아래 코드에 대한 해석과 비교하는 것에 대해 다룹니다. while(cin) while(cin >> x) //What is the difference? C++ 앞 부분을 조금이라도 공부해보신 분들이 있다면 cin 이라는 것에 대해 아실겁니다. C언어에서 scanf와 대응되는 것으로 C++에서는 이라는 헤더 파일에 있는 녀석인데 서식 문자 없이 간편하게 입력을 받을 수 있죠. int x; cin >> x; 위 2줄의 코드를 이용하면 C++에서 간편하게 변수에 값을 입력 받을 수 있습니다. (데이터 타입에 상관 없이 cin이 알아서 입력을 잘 처리해줍니다.) 그런데 만약 저 위..

Article Thumbnail
[C++] new와 delete

프로그래밍/C++ 2022. 3. 12. 02:07

본 글은 C언어의 동적할당과 프로세스의 메모리 구조를 전부 알고 있다는 전제하에서 진행됩니다. 잘 모르신다면 아래 링크에서 #프로세스의 메모리 구조 부분을 읽어주세요. https://pgh268400.tistory.com/383 [C언어 강좌] #18 동적 메모리 할당과 가변 인자 안녕하세요? 파일입니다. 어김없이 또 C언어 학습에 있어 새로운 챕터가 시작되었군요. 이번 챕터와 다음 챕터를 마치게 되면 제 C언어 강좌는 끝을 내게 됩니다. 지금 강의는 31편째지만 이 많은 pgh268400.tistory.com C언어에서 동적 메모리 할당 메모리를 관리하는 문제는 언제나 중요한 문제입니다. C, C++ 는 언어 차원에서 메모리 관리를 프로그래머가 직접 하도록 설계 되어 있습니다, 또한 대부분의 객체지향 ..

Article Thumbnail
[C++] Lvalue와 Rvalue란?

프로그래밍/C++ 2022. 3. 9. 22:30

C++ 문법을 보다보니 lvalue와 rvalue라는 용어를 발견했습니다. 아마 컴파일을 하다보면 rvalue와 lvalue에 관한 오류가 한번쯤 발생한걸 보신분들도 있을겁니다. 어떤 의미일까? 하여 관련 내용을 찾아보고 학습한 내용을 기록합니다. 일반적으로 표준 C언어의 관점에서는 Lvalue는 Left-value, Rvalue는 Right-value로 왼쪽에 있는 값, 오른쪽에 있는 값으로 이해할 수 있는데 대입연산자 (=) 를 기준으로 왼쪽에 있으면 left value, 오른쪽에 있으면 right value 라는 직관적이고 심플한 의미를 가지고 있습니다. 그러나 C++ 표준에서는 더이상 L과 R이 Left와 Right 의 의미를 가지고 있지 않습니다. 그러므로 앞에서 언급한 Left, Right의 ..

Article Thumbnail
[C++] 참조자 (레퍼런스, Reference)

프로그래밍/C++ 2022. 3. 8. 23:11

기존 포인터 연산 #include using std::cout; using std::endl; int change_val(int * p){ *p = 3; //p주소를 찾아가 해당하는 값(val)에 3을 대입한다. } int main(){ int num = 5; cout

Article Thumbnail
[C/C++] Tricky C Quizzes (Never a good code)

프로그래밍/C++ 2022. 3. 3. 19:05

C++ 강의를 듣고 있는데 교안 마지막 부분에 한번 생각해볼만한 거리로 나름 재미있는 코드들을 (사실은 끔직한) 제공해주셨길레 한번 재미삼아 하나씩 알아가보며 정리해봤습니다. #1 How many times main() will get called? - main() 함수는 몇번이나 호출되는가? #include int main() { printf("main() called \n" ); main(); return 0; } 보시면 printf로 main() called 를 출력하고 다시 main() 함수를 재귀적으로 호출하고 있습니다. 일반적으로 C/C++ 에서는 main 함수가 프로그램의 진입점(시작점)이 되는데 이렇게 main 함수를 재귀적으로 호출하면 어떻게 될까요? 우선 탈출점이 없으므로 main() ..

Article Thumbnail
[C++ Basic] namespace(이름공간)란?

프로그래밍/C++ 2022. 3. 3. 02:38

C++에서 std::cout 와 std::endl 를 이용하면 각각 출력 역할과 개행 역할을 하며 std::cout을 이용해 원하는 내용을 출력할 수 있습니다. cout, endl 을 보시면 앞에 std가 붙어 있는걸 알 수 있는데, std는 C++ 표준 라이브러리의 모든 함수, 객체 등이 정의된 이름 공간(namespace) 이라고 합니다. 그러면 이름 공간이 뭔지 알아봐야겠죠. 오늘 알아볼 것은 namespace, 한국어 직역으로 이름공간이라고 하는 녀석입니다. 이름공간 (namespace) 개인이 간단하게 작성하는 짧은 코드의 경우엔 문제가 안될 수 있지만 보통 기업체나 프로그래머 여러명이서 협업하는 프로젝트의 경우 파일을 나눠서 작업하는 경우가 대부분이기 때문에 파일도 여러개 생기고 특히 함수나 ..

Article Thumbnail
[C++ Basic] std::cout, std::endl, std::cin 을 통한 기본 콘솔 입출력

프로그래밍/C++ 2022. 3. 1. 20:14

안녕하세요 파일입니다. 저번 작성하던 C언어 강좌를 마치고 C++ 강좌를 계획했었으나 C++의 너무나도 방대한 레퍼런스 덕분에 강좌 대신에 매일 배운것을 정리하고 짧은 레퍼런스 형태로 정리를 해서 도움을 드리고자 글을 작성하려고 합니다. 그리고 C언어에서 C++로 막 넘어온 분들을 대상으로 C언어와의 차이점과 비교하면서 작성할것이니 참고 부탁드립니다. 오늘은 C++의 기본 입출력인 std::cout, std::endl, std::cin 에 대해 알아보겠습니다. #include int main(){ std::cout

Article Thumbnail