visual studio 2017 installation 설치
visual studio 2017 installation 개인적으로 몇 가지 취미를 갖고 있는데 그중 하나가 각종 컴퓨터 프로그램 언어를 공부하는 거랍니다. 그런데 먹고살기 바쁘다는 핑계로 며칠 하다가 접곤 해서 아직 기초도 없는 상태인데요. 없는 시간을 쪼개서 다시 한 번 프로그램 언어를 공부해보려고 하고 여러 가지 언어 중에서 가장 기초라고 할 수 있는 C언어부터 다시 하나씩 볼 생각입니다. 그리고 실습을 위해서 C언어 컴파일러인 visual studio 2017을 설치하려고 하는데 저 같은 초보님들 중에서 이 컴파일러의 설치 과정 참고하실 분들 계실까 해서 간단하게 정리해보려고 합니다. 먼저 visual studio 2017의 설치 파일을 받기 위해서 아래 주소를 클릭해서 홈페이지로 이동할게요. h..
C언어 기초 ws2_32.lib 추가
C언어 기초 ws2_32.lib 추가 윈도우에서 FormatMessage()와 WSAGetLastError()를 이용해서 에러 정보를 확인할 수 있는데요. WSAGetLastError()를 호출해서 에러를 의미하는 정수형이 리턴되는데 이때 이 숫자의 의미를 알기 위해서는 FormatMessage()를 사용해야 하는 것입니다. 윈도우에서 이 함수들을 사용하기 위해서는 ws2_32.lib를 프로젝트 라이브러리 파일에 추가해줘야 하는데요. 그 과정을 정리해볼까 합니다. ■ 제가 사용하는 컴파일러는 [visual studio 2010]이거든요. 프로젝트 속성에서 라이브러리를 추가하는 과정은 다음과 같습니다. ▲ 프로젝트를 마우스 우클릭해서 [속성] 메뉴로 이동하구요. ▲ 속성 페이지에서 [링커] ▶ [입력]을 ..
C language structure array
C language structure array 이번 글에서는 c언어의 구조체 배열에 대해서 알아보겠습니다. 배열이란 같은 자료형을 여러 개 선언할 때 하나로 묶어서 관리할 수 있는 역할을 하는데요. 구조체 역시 변수를 여러 개 선언한다면 이것들을 하나의 배열로 만들어서 관리할 수 있습니다. 구조체 배열을 선언하는 방법 역시 일반 자료형의 배열 선언방법과 같습니다. struct (구조체이름) (배열이름) [길이]; ■ 이 형식으로 선언하면 되는데요. 이렇게 정리하니까 조금 정리가 안되는거 같네요. 배열을 선언하고 활용하는 간단한 예제를 하나 만들어서 확인해보겠습니다. ▲ info라는 구조체를 정의하고 있으며 멤버로는 int x, y가 있습니다. 그리고 struct info arr[4];라는 배열을 선언하..
c언어 구조체 개념 정리
c언어 구조체 c언어 구조체란 여러 개의 변수를 하나의 그룹으로 묶어서 자료형을 만드는 건데 여기에는 포인터는 물론 배열도 포함될 수 있습니다. 기본 자료형과는 성격이 약간 다르지만 편리성을 위해서 새로운 자료형을 만드는 것이라고 생각하면 될 거예요. 예를 들어 평면에서 좌표를 구한다고 생각해볼게요. 좌표는 x,y가 무조건 짝을 이루어서 다녀야 합니다. 떨어질 수가 없는 관계인 거죠. 그래서 이 둘을 하나의 구조체로 묶어서 사용할 수 있는겁니다. 만약에 구조체 이름을 aaa라고 한다면 다음과 같이 c언어 구조체를 만들 수 있습니다. struct aaa{ int x; int y; }; 마지막 중괄호 (}) 뒤에 세미콜론(;) 붙이는 거 참고하시고요. 이렇게 구조체를 만들 수 있습니다. 이것은 int나 ch..
C language puts, fputs, gets, fgets
C language puts / fputs c언어를 공부하면서 그동안 문자열을 입력받기 위해서 scanf() 함수를 이용했고 출력할 때는 printf()를 이용했었는데요. 이 scanf() 함수는 공백을 처리하지 못하는 단점이 있었습니다. 하지만 여기서 알아볼 입력 함수들은 공백도 처리하면서 문자열을 입력받을 수 있기 때문에 유용한데요. 먼저 문자열을 출력하는 puts와 fputs부터 간단하게 알아보고 입력받는 gets와 fgets 함수를 살펴보겠습니다. int puts(const char * s); int fputs(const char * s, FILE * stream); ▲ puts 함수는 표준 스트림인 stdout을 대상으로 출력되지만 fputs 함수는 두 번째 인자를 통해서 출력의 대상을 변경할 ..
c언어 독학 EOF
c언어 독학 EOF 취미생활로 c언어 독학을 하고 있는데 그동안 문자열을 입력받고 출력할 때는 scanf()와 printf() 함수를 이용했습니다. 하지만 이 녀석들은 메모리의 공간도 많이 차지하고 연산의 양이 많은 단점이 있어서 하나의 문자만 입력받고 출력할 때는 putchar, fputc, getchar, fgetc 함수를 이용하는 게 좋기 때문에 지난 글에서 이 함수들의 쓰임새를 대충 살펴봤습니다. 그런데 문자를 문자를 입. 출력 하는 함수인데 반환형이 int형인 게 좀 이상합니다. int getchar(void); int fgetc(FILE*stream); ■ 왜 반환형이 int형 일까요? 그 이유를 대충 살펴보겠습니다. C언어에는 파일의 끝을 표시하기 위해서 EOF(End Of File)라는 상..
c언어 문자 입출력 함수
c언어 문자 입출력 함수 지난 글에서 데이터의 흐름을 의미하는 스트림에 대해서 알아봤었는데요. 그를 바탕으로 문자 단위의 입출력 함수인 putchar, fputc, getchar, fgetc 함수에 대해서 알아보겠습니다. ■ 먼저 하나의 문자를 출력하는 함수는 putchar(int c)와 fputc(int c, FILE*stream) 함수인데요. putchar는 표준 출력 스트림 stdout으로 전송하는 함수입니다. 즉, 인자로 전달된 문자를 모니터에 출력하는 역할을 하게 되는 거고요. fputc 함수는 두 번째 인자로 문자를 전송할 스트림을 정해줄 수 있고 표준 스트림뿐만 아니라 파일로 데이터를 전송할 수도 있습니다. 자세한 내용은 나중에 파일 입출력 단원에서 다시 정리하기로 하고 아래쪽에서 만들어볼 ..
c언어 기초 스트림 stream
c언어 기초 스트림 stream 이번 글에서는 c언어 기초 중에서 데이터를 입력받고 출력하는 역할을 하는 스트림(stream)에 대해서 개념 정리를 해볼까 합니다. 프로그램에서 데이터의 입력과 출력은 한 방향으로만 진행되는데 키보드 등의 입력장치에서 컴퓨터로 데이터가 들어가고 컴퓨터에서 모니터로 출력되는 등 한 방향으로만 움직이는데 이들 사이에는 데이터가 이동할 수 있는 스트림이라는 가상의 다리가 있습니다. 스트림은 한 방향으로 움직이는 데이터의 이동을 의미합니다. ■ 즉, 출력 스트림과 입력 스트림이 있는데 이는 운영체제에서 제공하는 소프트웨어입니다. 그리고 키보드와 마우스 등을 콘솔이라고 하는데 이런 것들을 통한 입출력과 파일을 이용한 입출력은 차이가 있는데요. 콘솔은 운영체제에서 자동으로 생성이 되..
c언어 프로그램 main() 함수 인자 전달
c언어 프로그램 main() 함수 인자 전달 지금까지 C언어 프로그램을 공부하면서 main() 함수에는 인자를 전달하지 않은 기본 형태만 사용해왔는데 main() 함수도 인자를 전달할 수 있고 이를 확인하기 위해서는 프로그램을 실행하는 방법이 조금 차이가 있거든요. 그 과정을 정리해볼까 합니다. 먼저 다음과 같이 main() 함수에 인자를 전달할 수 있습니다. ▲ 제한적이긴 하지만 이렇게 문자열 인자를 전달할 수 있고 첫 번째 int는 전달되는 인자의 개수를 의미하고 bb[]는 문자열 배열을 받는 매개변수입니다. 이 함수에 인자를 전달하기 위해서는 CMD에서 응용프로그램(exe)을 실행한 후 입력해야 하는데 먼저 응용프로그램의 위치를 찾아볼게요. ▲ 사용 중인 컴파일러에 따라서 조금씩 다르겠지만 Visu..
C언어 기초 매개변수로 함수 전달하기
C언어 기초 매개변수로 함수 전달하기 지난 글에서 C언어 기초 중에서 함수 포인터에 대해서 알아봤었는데요. 함수의 이름도 메모리상의 주소를 저장하는 변수라고 정리했었습니다. 그렇다면 다른 포인터와 마찬가지로 이 이름을 매개변수로 던져주면서 호출되는 곳에서는 그 값을 포인터로 받아서 프로그램을 실행할 수 있겠죠? ■ 이번 글에서는 그 내용을 확인하는 예제를 만들면서 정리해볼 건데요. 어떤 함수를 호출하면서 int 값 두 개와 이름을 매개변수로 넘겨주고 호출되는 곳에서는 그 값들을 받은 뒤에 이름과 값을 반환해서 해당 함수를 다시 호출하고 매개변수로 들어온 int 값을 재전달 하는 형식입니다. 좀 복잡한가요?ㅠ.ㅠㅎ 바로 예제를 볼게요. ▲ main()에서 aaa를 호출하면서 200, 100, 이름 bbb와..
C언어 기초 함수 포인터
C언어 기초 함수 포인터 이번 글에서는 C언어 기초 중에서 함수 포인터에 대해서 기본 개념과 선언하는 방법을 알아보겠습니다. 우리가 정의하는 함수도 변수와 마찬가지로 메모리에 저장되는데요. 함수의 이름이 그 주소 값을 의미하는 것입니다. 즉, 이 주소 값을 저장하기 위한 별도의 함수 포인터를 선언할 수 있습니다. 함수 포인터도 선언하기 위해서는 먼저 포인터 형을 결정지어야 하는데 다음과 같은 함수가 있다고 가정해볼게요. int aaa(int x){...} 이 함수는 반환형과 매개변수 모두 int형인 aaa라는 함수입니다. 그리고 앞에서 정의한 대로 'aaa'는 이 함수의 메모리상의 주소 값을 저장하고 있는데요. 함수 포인터는 이 반환형과 매개변수를 기준으로 포인터 형을 결정짓습니다. 그래서 이 함수의 주..
c언어 기초 프로그래밍 2차원 배열 이름이 가리키는 것들
c언어 기초 프로그래밍 2차원 배열 이름이 가리키는 것들 C언어의 2차원 배열 이름에 관한 이야기를 좀 해볼까 한다. 그전에 간단하게 1차원 배열 이름에 대해서 정리하고 넘어가 보자. 1차원 배열의 이름이 가리키는 것은 첫 번째 요소이며 이는 포인터와 같은 역할을 한다. 그리고 이 배열을 인자로 전달할 때 호출되는 함수에서는 포인터 변수로 받아서 배열에 접근해야 한다. int aaa[3]; ▲ 여기서 aaa 이름이 의미하는 것은 aaa[0]의 주소 값이다. 다시 말해 aaa와 aaa[0]은 같다. 하지만 2차원 배열은 그렇지가 않은데 그 과정을 정리해볼까 한다.그렇다면 2차원 배열의 이름이 가리키는 것은 무엇일까? 이도 마찬가지로 첫 번째 요소 [0][0]을 가리키는 것은 동일하다. 먼저 이 부분부터 확..
C언어 독학 포인터 배열
C언어 독학 포인터 배열 ■ 포인터도 변수의 메모리 주소를 저장하는 일 종의 변수이다. 그렇기 때문에 이 또한 배열로 저장할 수 있는데 일반 변수의 배열과 크게 다르지 않기 때문에 간단한 예제를 통해서 그 내용을 알아보고 이중 포인터가 필요한 이유에 대해서 정리해본다. 먼저 선언하는 형식은 다음과 같다. int * aaa[10]; ▲ 길이가 10인 int형 포인터 변수이다. aaa가 가리키는 것은 첫 번째 요소 aaa[0]의 주소인데 이는 이는 싱글 포인터의 주소이기 때문에 aaa는 더블 포인터가 된다. 예제에서 확인해본다. ▲ 세 개의 변수를 선언 및 초기화하고 각각의 주소를 가리키는 aa, bb, cc를 선언하고 있다. 그리고 int형 pabc를 선언하고 세 개의 포인터 변수로 초기화하고 있는데 이때..
C언어 독학 Call by reference
C언어 독학 Call by reference 특정 변수의 메모리상의 주소 값을 저장하는 것이 포인터이고 이 녀석도 변수의 한 종류이기 때문에 메모리에 주소 값을 갖게 이중 포인터에 그 값을 저장할 수 있다고 지난 글에서 정리를 해봤다. 이번 글에서는 이중 포인터를 활용하는 예제를 통해서 그 과정을 정리해볼까 한다. 그전에 전달되는 인자의 개념을 다시 한 번 정리하고 넘어간다. 함수를 호출하면서 던져주는 값인 인자는 해당 값 자체를 넘겨주는 것이 아니고 값을 복사해서 넘겨준다는 개념을 지난 글에서 정리해봤었는데… 이렇게 복사된 값을 변경해도 해당 변수에 저장된 원래의 값은 변경되지 않는걸 확인했었다. 그래서 그 값을 변경하기 위해서는 포인터를 이용해서 해당 주소에 직접 접근해서 주소 값 자체를 바꿔버려야 ..
C언어 독학 이중 포인터
C언어 독학 이중 포인터 포인터란 어떤 변수의 메모리상의 주소값을 저장하는 변수입니다. 그리고 포인터 자체도 변수이기 때문에 메모리에 자리를 잡게 되고 이 녀석도 자기의 주소값을 갖게 됩니다. 그렇기 때문에 포인터 변수를 대상으로 '&'연산이 가능하며 반환되는 이 녀석의 주소 값을받아서 저장할 수 있는 것을 이중 포이터라고 합니다. 즉, 포인터 변수를 가리키는 또 다른 포인터인데요. 선언하는 형식은 다음과 같습니다. int **aaa= &포인터변수; *연산자를 두 개 입력하면 되는데 예제에서 작성해보겠습니다. int형 변수 su를 10으로 초기화하고 이 변수의 주소를 poi에 저장하고 있습니다. 그리고 다시 poi의 주소를 dpoi에 저장하고 있는 모습인 이중 포인터 공부하시면 싱글 포인터는 이미 보셨을..
C언어 독학 배열의 길이 없이 초기화하기
C언어 독학 배열의 길이 없이 초기화하기 C언어에서 배열은 1차원과 다차원(2차원)이 있는데요. 이 배열들을 초기화하는 과정은 거의 비슷하다는 걸 지난 글에서 확인해봤습니다. '거의' 같다는 건 다른 점도 있다는 뜻이겠죠?^^ 몇 가지 차이점 중에서 이번 글에서 알아볼 배열의 길이를 알려주지 않고 초기화하는 방법이 조금 차이가 있습니다. 예를 들어 1차원 배열은 다음과 같이 길이를 명시하지 않고 초기화하면... int x []={1, 2, 3}; ▲ int형 배열 x의 길이가 3이라는 걸 컴파일러가 자동으로 찾아줍니다. 하지만 2차원 배열은 조금 다른데요. 지난 글에서 정리했듯이 2차원 배열은 행과 열로 값들이 위치하게 되는데... int y[][]={1, 2, 3, 4, 5,6}; ▲ 이렇게 행, 열의..