본문 바로가기

개발공부(C, C++)

(13)
TBCPP 정리 ( 마크다운 문서로 모두 변환 예정) SECTION 1. 시작해봅시다 폴더구조 & 실행 하나의 솔루션 안에 여러 개의 프로젝트를 생성할 수 있고, 각 프로젝트의 Source Files 폴더 오른쪽 클릭 후 Add > New Item 을 해서 새로운 소스 파일을 만들어 작성한다. 프로젝트 생성시 precompiled 를 체크하면 멀티 플랫폼을 지원 못하게 되므로 주의하자. 여러 개의 프로젝트가 있을 때, 실행될 프로젝트를 고르려면 오른쪽 클릭을 해서 set as startup project 를 클릭해준다. VS 단축키, 사용팁 Ctrl + 마우스 휠 을 통해 작업창 글씨 크기를 크게나 작게 할 수 있다. Ctrl + F5 로 Start without debugging 한다. 빌드할 거냐고 물어보니까 따로 빌드부터 할 필요X VS 에서 주석 처..
따배씨(따라 배우는 C언어_홍정모) Chapter12 CHAPTER 12 Storage Classes, Linkage and Memory Management "I can do this all day!" _Captain America "모든 것이 완벽하다면, 배울 수도 없고 성장할 수도 없다." _비욘세 지젤 놀스 12.3 변수의 영역과 연결 상태, 객체의 지속시간 전역변수는 file scope variable, 즉 파일 영역 변수라고도 하는데, 전역변수라고 주로 부르는 이유는 기본적으로 main() 함수 밖에 있는 변수나 함수는 다른 파일에서도 쓸 수 있기 때문이다. 즉, 내가 어떤 파일의 file scope(main() 밖)에 정의한 변수나 함수는 다른 파일에서 앞에 extern 이란 키워드를 붙여 다른 파일에서 가져다 쓸 것임을 표시할 수 있다. 이 때..
따배씨(따라 배우는 C언어_홍정모) Chapter11 CHAPTER 11 "언덕을 넘어가는 순간, 속력을 얻기 시작할 것이다." _찰스 슐츠 11.1 문자열을 정의하는 방법들 문자열도 배열이다. puts("문자열입니다.") 라는 puts 문자열 출력함수는 \0 까지 자동으로 출력해주며, 마지막에 \n 도 알아서 추가해주는 편리한 출력함수다. putchar('a') 라는 한 글자 출력함수도 있다. 배열은 읽기/쓰기가 모두 가능한 메모리를 사용해 원소의 수정이 자유롭지만, 문자열은 읽기 전용 메모리를 사용하기 때문에 const 의 여부와 관계없이 원소를 수정할 수 없다. 미리 정의해놓은 넉넉한 배열의 길이보다 짧은 문자열을 초기화하면, warning 이 뜨기도 한다. 크게 신경쓰지 말자. char greetings[50] = "Hello" "How are" "..
따배씨(따라 배우는 C언어_홍정모) Chapter10 CHAPTER 10 "행복으로 가는 한 쪽 문이 닫히면 다른 쪽 문이 열린다. 그러나 우리는 때때로 닫힌 문만 쳐다보느라 열린 쪽은 오랫동안 못보기도 한다." _Helen Keller 10.1 배열과 메모리 배열의 시작 인덱스가 0인 이유는, 인덱스라는 게 이 배열을 위한 메모리의 시작점과의 거리를 뜻하기 때문이다. 시작점과 시작점 사이의 거리는 0이겠지. 10.3 포인터의 산술 연산 (Pointer Arithmetic) 포인터에 어떤 상수 숫자(literal)를 더한다는 건, 그 숫자 * 포인터의 자료형 크기 를 더하는 것과 같다. 배열과 포인터를 같이 쓸 때 많이 쓰이는 특성이다. 양/음수 단항연산자와 포인터끼리의 덧셈은 허용되지 않는다. 그런데 포인터끼리의 뺄셈은 허용된다! 포인터끼리 뺄셈을 하면,..
따배씨(따라 배우는 C언어_홍정모) Chapter9 CHAPTER 9 함수 9.12 포인터의 작동 원리 포인터 변수에 저장되는 값은 다른 변수의 주소이다. 직접적으로 데이터를 저장하기 보다는 다른 메모리 공간이나 그 공간에 저장되어 있는 데이터(또는 객체 object)를 간접적으로 가리키는(point) 역할을 한다. int* a_ptr = &a; 처럼 *(asterisk) 를 이용해 주소를 저장하는 변수를 만들어 이용. 이 변수는 x86 에서는 4바이트, x64 에서는 8바이트다. 9.15 NULL 포인터와 런타임 에러 어떤 포인터에 어떤 주소를 넣을지 말지를 런타임에 결정하는 경우, 조건에 따라 포인터에 아무런 주소도 초기화 하지 못하면 문제가 생길 수 있다. 그래서 C 에서는 NULL, C++ 에서는 nullptr 이라는 null 값을 포인터를 생성할..
따배씨(따라 배우는 C언어_홍정모) Chapter8 CHAPTER 8 문자 입출력과 입력 유효성 검증 8.1 입출력 버퍼 효율적인 작업을 위해 한꺼번에 입력을 받거나 출력하는 데 쓰이는 것. 운영체제가 관리한다. 이론대로라면 getchar() 과 putchar() 을 while 문과 함께 쓸 때, 어떤 글자를 입력받자마자 putchar 이 실행되어 바로바로 처리가 되어야 한다. 하지만 실제로 해보면 abc 순서대로 입력받으면 aabbcc 가 아닌 abcabc 가 콘솔에 표시된다. 즉 입력받자마자 어떤 처리를 하는 게 아니라 입력받을 걸 순서대로 버퍼로 옮겨놨다가 입력이 끝난 후 버퍼 안에 담긴 내용을 한꺼번에 처리한다. 버퍼를 사용하지 않는 입출력 콘솔을 경험하고 싶다면 #include 하고 getchar() 대신 _getch()나 _getche() 로 ..
따배씨(따라 배우는 C언어_홍정모) Chapter7 CHAPTER 7 분기 "가장 위대한 선생님이다, 실패란 것은." __마스터 요다 7.2 표준 입출력 함수들 getchar(), putchar() 예제 printf(), scanf() 와 달리 한 글자씩 입력 받고 출력하는 함수. (하지만 진짜 한글자 한글자 처리하는 것만은 아니기 때문에 곧 배울 버퍼의 개념을 이해할 필요가 있다.) while 문을 이용해서 문자열을 받아오는 게 가능하다. 이 때, while 문 내부에서 특정 글자를 다른 글자로 바꾼다거나 하는 다양한 작업이 가능하다. 특히 char 이 int 로 변환되어 사용된다는 점을 활용해 아스키 코드를 잘 활용한다면 효과적인 프로그래밍이 가능하다. 굳이 아스키 코드를 모두 외울 필요가 없다는 점을 알아두자! char 형이 결국 아스키 코드기 때문..
따배씨(따라 배우는 C언어_홍정모) Chapter6 CHAPTER 6 반복문 "성공의 두 가지 요구조건은, 첫째는 올바른 때에 올바른 장소에 있는 것이고 둘째는 성공과 관련된 일을 하는 것이다." __Ray Kroc 6.1 while 반복 루프에서 scanf() 의 반환값 사용하기 scanf() 는 받아오기로 지정한 형식지정자와 형식이 맞지 않는 입력값을 받으면 에러를 발생시킨다. 그래서 반환값을 사용하지 않으면 잘못 입력한 순간 프로그램 전체가 먹통이 된다. 따라서 반환값을 받아 제대로 입력받지 못하면 0 이라는 점을 이용해야 프로그램 전체가 망가지는 것을 막을 수 있다. 앞서 배웠듯이 scanf() 의 반환값은 입력받은 변수의 개수이다. ::: tip 알아두자 cin.ignore() // 버퍼 버리기, cin.clear() // 에러 삭제 를 이용하는..