Programming Lecture 7. Void Pointer ~ standard input function

in #tipsware7 years ago

TIPS강좌배너.png

2018년 1월 25일
이번주 월요일에 나는 마이크로소프트 한국지사로 TIPS 6차시 수업을 들으러 갔습니다. 강사는 Tipssoft의 대표이사 김성엽 이사님 이십니다. 대표님은 마이크로소프트 C++프로그래밍 부문 MVP로 활동 하고 계십니다.
이번 수업에서는 void포인터와 표준 입력함수를 배웠습니다.

  • void pointer
    Void형 포인터는 누구에겐 매우 강력한 무기로, 누구에겐 사용할 일이 없는 그저 지나가는 문법으로 사용 될 수 있습니다. Void형은 C언어에서 앞서 말씀드리길 ‘정해져 있지 않은’이라는 말로 사용된다 하였습니다. 그렇기 때문에 이 의미를 중요하지 않게 여기는 분도 있으실 것입니다. 하지만 위에 말을 다르게 생각하면, 모든형태로 변화할 수 있는 이라는 의미로 생각할 수 있습니다. 그렇기에 조금 다르게 생각하면 이 형태는 호환성이 매우 뛰어남과 동시에 상위 프로그래머(코더가 아닌)에게 프로그래밍에 대한 중요한 키가 될 수도 있습니다.
    void형태의 포인터는 형 변환(캐스팅)이 없을 경우 주소만을 가지고 있는 일반변수에 주소를 넣는 경우와 같습니다. 하지만 앞에 캐스팅이 시작 될 경우 모든 형태의 자료형으로 접근 할 수 있는 좋은 칼 입니다. 사용자가 무슨 용도로 프로그래머가 만든 함수를 사용할 지 모르기 때문에 미연의 상황을 방지하는 데에도 유용하게 사용됩니다. 후에 함수의 포인터와 응용된다면 void형의 참 의미를 알고 사용할 수 있는 프로그래머는 C언어 최상위 난이도의 프로그래밍도 잘 할 수 있을 것 입니다.

  • 표준 입력 함수
    표준 출력 함수와 마찬가지로 콘솔창에서 사용하기 위해 만들어진 함수입니다. 표준 입력 장치는 우리에게 키보드 입니다. 가장 많이 사용하기 때문이죠, 그 밖에도 입력장치에는 스캐너, 마우스, 디지타이저등 여러가지가 있지만 가장 보편적으로 꼭 있으야 하는 것이 키보드입니다. 여기에서는 버퍼라는 것이 중요한 키워드 입니다.
    버퍼란 하드웨어 적으로는 데이터를 지니고 있는 메모리(클럭이 온되면 데이터를 연결된 회로로 넘겨주는)를 뜻합니다. 하지만 여기에서의 버퍼는 위에 의미와 조금 다르더군요(수업시간에 덕분에 쪽을 당했습니다 ㅠㅠ) 예를 들어서 A, B라는 별개의 소프트웨어 또는 하드웨어가 있고, 이 때 A에서는 작업의 결과물로서 어떤 데이터를 내놓으며 B에서는 어떤 데이터를 입력받아서 작업을 한다고 가정합니다. 이 때, A의 결과물로 나온 데이터를 B에 입력하고자 하는 것이 목적일 경우, A의 출력 데이터를 특정 메모리 영역 'α'에 저장하고 B에서 특정 메모리 영역 'α'의 데이터를 읽게 해야 합니다. 이 때 여기서 특정 메모리 영역 'α'를 우리는 버퍼 라고 합니다. 이는 스트리밍, 스풀, 캐시메모리와 혼동 하게 되는데 wiki백과에 따르면 버퍼는 큐라고 부르기도 합니다. 스풀와 스트리밍은 버퍼를 이용해서 구현되는데, 이들은 버퍼가 아닌 버퍼를 이용하는 방식 중 하나입니다. 또한 캐시메모리는 설계에 따라 데이터를 일부만 담을 수도 있고, 아예 안담을수도 있다는 차이가 있습니다.
    표준 입력 함수는 표준 입력 버퍼를 통해서 작동하는 함수 입니다. 우리가 키보드를 입력하면 stdin이라는 버퍼에 저장되고 거기에서 scanf함수는 스페이스바와 엔터, getc함수는 엔터키를 기준으로 버퍼의 내용을 짤라서 가져오게 됩니다.(getchar함수는 getc의 메크로 함수로 가짜라고 할수있다 ㅎㅎ) 현재 콘솔함수는 점점 사라지는 추세로(리눅스와 윈도우가 점점 각자의 길을 가게되면서) 작년에는 gets함수를 사용 할 수 있었지만 올해 다시 컴파일을 해보니 gets함수가 없다고 오류가 발생 하였습니다(눈물 ㅠㅜㅠㅜ…) 각설 하고 표준 입력 함수는 버퍼를 이용하기 때문에 버퍼에 남는 내용에 민감합니다. 입력함수들은 사용 후에 버퍼를 비워주지 않는다면 오작동 할 여지가 큽니다. 이는 fflush함수(메모리를 비워주는 함수)를 사용함으로 해결했지만 이 함수 또한 사라졌습니다.(다 사라지네여…) 그래서 지금은 rewind함수를 사용하여서 비워주는 것 같은 효과를 보여줍니다(앞으로 당겨주는 함수입니다) 표준 입력 함수는 뒤에 배열 포인터를 통해 예시를 같이 들겠습니다.

  • 배열과 pointer
    배열과 포인터는 상당히 관련이 깊습니다. 배열과 포인터는 사용 원리가 똑같은데 배열의 메모리는 stack영역에, 포인터의 메모리는 heep영역에 있습니다. 때문에 배열은 사용하는데에 메모리 한계가 더 많이 느껴지고, 배열의 탄생배경이 포인터를 어려워서 쓰지 못하는 사람을 위해 만들었기 때문에 능력의 한계 또한 명확합니다. 아래는 배열과 포인터를 통해 stdio헤더에 있는 여러 함수를 만들어 본 예시입니다.

  • strlen function
    My strlen.PNG
  • strcat function
    my strcat.PNG

  • scanf function - this is haven many error.
    my scanf.PNG