pc관련2019. 3. 16. 20:52


‘RAM은 다다익선’이라는 말이 있다. RAM 용량이 클수록 데이터를 읽어오는 속도가 빨라져서 컴퓨터를 쾌적하게 사용할 수 있기 때문이다. 이 RAM과 관련된 용어를 하나하나 살펴보자.


용량


메모리 용량은 1개의 RAM이 제공하는 저장 용량을 뜻한다. 단위는 GB이며 2배수 단위로 올라가서 용량이 1GB, 2GB, 4GB 식으로 상승하게 된다.


조립컴퓨터 견적을 짤 때 ‘램다익선’이라는 말을 자주 듣게 된다. 그 이유는 메모리의 용량이 크면 클수록 컴퓨터 속도가 빨라지기 때문이다. 램의 용량이 부족하면 ROM에서 직접 데이터를 읽어오기 때문에 작업 속도가 느려지는 것이다. 특히 고사양 게임이나 그래픽 프로그램 등을 원활하게 돌리기 위해서는 램 용량이 충분해야 한다. 다만, 램 용량이 충분한 경우 추가적으로 메모리를 확충한다고 속도가 높아지지는 않으니 주의가 필요하다.


그렇다면 새 컴퓨터를 사거나 조립컴퓨터 견적을 짤 때 RAM 용량은 어느 정도로 맞추는 게 좋을까? 대체로 사무용이나 웹 서핑용으로는 4~8GB 정도로도 충분하다. 하지만 배틀그라운드와 같은 고사양 게임을 즐기려면 RAM 용량이 8~16GB 이상은 돼야 한다. 그래픽 제작, 편집 등을 한다면 16GB 이상의 RAM이 필요할 수도 있다.

 


우리가 데스크톱, 노트북 등에 꽂아 사용하는 RAM은 대부분 휘발성 메모리다. 이것은 저장된 정보를 유지하기 위해 전기가 필요한 컴퓨터 메모리를 말한다. 휘발성 메모리는 SRAM과 DRAM으로 나뉜다. 오늘날 대부분의 RAM은 구조가 간단하고 저렴하며 전력 소비가 적은 DRAM이다.


이와는 반대로, 전원이 공급되지 않아도 입력된 정보가 지워지지 않는 메모리를 비휘발성 메모리라고 한다. 최근에는 정보를 영구적으로 저장할 수 있는 ROM의 장점과 정보 입출력이 자유로운 RAM의 장점을 혼합한 NVRAM이 떠오르고 있다. 이른바 ‘차세대 메모리’라고도 불리는 NVRAM으로는 MRAM, STT-RAM, PRAM 등이 있다.


DIMM


DIMM은 Dual In-line Memory Module의 약자로, 메모리 규격을 나타내는 말이다. DIMM이라는 이름은 단자가 기판의 양쪽에 자리 잡은 것에서 유래했다. 이전의 SIMM과는 달리, DIMM에는 양쪽에 다른 신호선이 설치돼 있다.


DIMM은 메모리의 크기와 핀 수에 따라 여러 종류로 나뉜다. 일반적인 DIMM은 데스크톱에 많이 쓰이며, 핀 수는 168, 184, 240, 240개다. SO-DIMM은 크기가 DIMM의 절반 정도라 노트북에 많이 쓰이며, 핀 수는 72, 100, 144, 200개다. 이보다 작은 사이즈를 지닌 Micro-DIMM도 있다. 이 규격의 핀 수는 172, 214개다.


이것이 중요한 이유는 메인보드가 구매한 메모리의 규격을 지원하지 않으면 RAM을 사용할 수 없기 때문이다. 따라서 RAM을 확충할 계획이 있다면 본인의 컴퓨터가 어떤 규격을 쓰는지, 그 규격 내 핀 수는 몇 개나 되는지 확인할 필요가 있다.


DDR


DDR은 Double Data Rate의 준말로, 정확히는 DDR SDRAM이라 한다. 이 RAM은 외부 클럭의 시작과 종료에 맞춰 데이터를 전송해 전송 속도가 이전의 RAM보다 2배나 높다. 그래서 현재 대부분의 컴퓨터와 스마트폰, 태블릿PC는 DDR을 사용하고 있다.


PC용 DDR RAM은 DDR1, DDR2, DDR3, DDR4 등으로 나뉜다. 뒤에 붙은 숫자가 높아질 때마다 동작 속도가 2배씩 오른다. 가령, DDR2는 DDR1보다 2배 정도 빠르며, DDR4는 DDR1보다 8배 정도 빠르다.


각 DDR 메모리를 사용하려면 그 규격을 지원하는 메인보드가 필요하다. 가령, DDR3 메인보드에서는 DDR4 RAM을 사용할 수 없으니 주의해야 한다.


동작 클럭


동작 클럭은 메모리의 동작 속도를 나타낸다. 숫자가 클수록 데이터를 더 빨리 저장, 전달한다. 즉 동작 클럭이 높을수록 성능이 더 좋은 RAM이라고 볼 수 있다.


RAM의 속도는 자체 속도와 CPU와의 데이터 전송률을 모두 고려해 매겨진다. 가령, DDR3 RAM은 ‘DDR3-2133’과 같이 표기한다. 여기서 ‘2133’ 등의 숫자는 데이터 전송 속도가 2,133Hz임을 의미한다. 이것은 실제 내부 동작 클럭과는 다르다. 참고로 DDR3-2133의 내부 동작 클럭은 266MHz다.


클럭과 속도를 기준으로 한 메모리 규격은 JEDEC이라는 단체에서 정한다. 개중에는 이 규격 이외의 메모리 클럭을 지닌 RAM도 있는데, 이것은 메모리 제조사가 임의로 클럭을 올려 판매하는 오버클럭 메모리다.


RAM 타이밍


메모리 타이밍으로도 불리는 RAM 타이밍은 메모리 내부에 저장된 데이터를 얼마나 빠른 속도로 찾는지를 의미한다. 숫자가 작으면 작을수록 데이터를 검색하는 속도가 빠르다. 다만, 동작 클럭보다는 성능에 미치는 영향이 적으므로 우선적으로는 클럭 수치를 기준으로 제품을 고르는 것이 좋다.


가장 대표적인 RAM 타이밍으로는 CL(CAS Latency)이 있다. 이것은 메모리 컨트롤러와 메모리 사이의 응답 시간을 나타낸다. 그 외에 데이터의 위치를 찾는 시간인 TRCD와 TRP, 주소를 찾는 명령어의 주기를 나타내는 TRAS가 있다.


이상의 RAM 타이밍은 메모리의 스펙이 적힌 스티커를 통해 확인할 수 있다. 스티커를 보면 10-10-10-25 식으로 네 개의 숫자열이 나타난 경우가 많다. 대개, 첫 번째 숫자는 CL, 두 번째 숫자는 TRCD, 세 번째 숫자는 TRP, 네 번째 숫자는 TRAS다.


XMP


XMP는 eXtreme Memory Profiles의 약자로, 인텔이 개발한 메모리 오버클럭 기술이다. 이전에는 메모리의 동작 클럭을 끌어올리기 위해 일일이 수동으로 설정해야 해서 복잡하고 오랜 시간이 소모됐다. XMP는 이와 달리 메인보드 BIOS를 통해 쉽거 간편하게 메모리와 시스템을 최적화한다.


XMP를 통해 RAM을 오버클럭하면 무엇이 좋을까? 우선 동작 클럭이 상승하니 데이터를 저장하는 속도가 빨라진다. 게다가 RAM의 레이턴시(메모리가 다음 명령을 처리할 때까지 걸리는 대기시간)도 낮아진다. 메모리 대역폭도 향상돼서 내장그래픽 성능도 개선할 수 있다.


XMP를 사용하기 위해서는 RAM과 CPU, 메인보드 모두 해당 기능을 지원해야 사용할 수 있다. 그래서 XMP 기능을 갖춘 RAM을 구매하기에 앞서 자신의 CPU와 메인보드가 이를 지원하는지 확인해보자. 인텔 홈페이지에서 XMP를 지원하는 메모리와 메인보드 리스트를 살펴볼 수 있다.

 


CPU와 HDD, 그리고 램 사이의 상관관계


일반적인 컴퓨터 작업의 과정을 살펴보면, 램은 HDD로부터 일정량의 데이터를 복사해 임시 저장한 후, 이를 필요 시마다 CPU에 빠르게 전달하는 역할을 한다. 이후부터는 속도가 느린 HDD는 배제하고 빠른 CPU와 램끼리만 데이터를 교환하므로 전반적인 작업을 고속으로 처리할 수 있다. 이러한 이유로, HDD가 단순히 데이터를 보관하는 역할에 그치는데 비해, 램은 컴퓨터 전반의 성능에 미치는 바가 크다고 할 수 있다. 이에 따라 램은 주기억장치, HDD는 보조기억장치로 분류된다.


일반적으로 컴퓨터 게임을 실행할 때 램과 HDD의 상관관계를 확인할 수 있다. 게임을 처음 실행할 때, 또는 각 스테이지를 넘어가는 도중에 화면이 정지하며 ‘로딩 중(Now Loading)’, 혹은 ‘기다려 주세요(please wait)’ 등의 메시지가 나오는 것을 본 적이 있을 것이다. 여기서 말하는 ‘로딩(적재)’이라는 것이 HDD에서 데이터를 읽어 램으로 전송하는 과정을 의미한다. 로딩이 끝나야 비로소 게임을 플레이할 수 있다.


그런데 컴퓨터에 장착된 램의 용량이 적거나 속도가 느리면 프로그램을 실행시키는데 걸리는 로딩 시간이 길어지거나, 경우에 따라서는 아예 실행되지 않을 수도 있다. 그리고 로딩을 일단 마치더라도 작업 도중에 간간이 로딩 하는 횟수가 잦아지기 때문에 전반적인 작업 속도가 크게 저하된다. 램의 용량이 적은 구형 컴퓨터에서 고사양 프로그램(최신 게임 등)을 구동할 경우, 로딩을 해야 하는 때가 아닌데도 작업 도중에 갑자기 화면이 느려지거나 정지하면서 HDD가 작동하는(컴퓨터 전면 HDD 램프가 깜박임) 경우를 자주 볼 수 있다. 


이러한 현상은 프로그램 실행에 필요한 데이터의 용량에 비해 램 용량이 부족하여, 부득이 CPU가 HDD에서 직접 데이터를 불러오는 경우에 발생한다. 이를 스와핑(swapping) 또는 페이징(paging)이라고 하며, 램을 증설하면 상당 부분 이를 해결할 수 있다.

 

 


램은 출시된 시기에 따라 성능이 차츰 향상되었다. 2000년 이후에 나온 PC라면 대부분 DDR-SDRAM(Double-Data-Rate Synchronous Dynamic Random Access Memory) 계열의 램을 사용한다. DDR-SDRAM은 이전에 사용하던 SDR-SDRAM(Single-Data-Rate Synchronous Dynamic Random Access Memory)에 비해 같은 클럭(clock: 동작속도)에서 2배의 성능을 낼 수 있는 것이 특징이다. 


DDR-SDRAM 기술도 점차 발전을 거듭했다. 같은 클럭의 초기 DDR-SDRAM(이하 DDR1) 보다 2배의 성능을 내는 DDR2-SDRAM(이하 DDR2)이 2004년부터, 4배의 성능을 낼 수 있는 DDR3-SDRAM(이하 DDR3)은 2007년부터 출시되기 시작했으며, 2014년에는 8배의 성능을 내는 DDR4-SDRAM(이하 DDR4)이 등장했다. 2015년 현재, 컴퓨터 램 시장은 DDR3가 주류를 이루고 있으나, 향후 DDR4로 대체될 것으로 전망된다.

 


DDR4가 가장 성능이 좋다 하여 구형 PC의 램을 업그레이드 할 때 무조건 DDR4를 사야 하는 것은 아니다. DDR1 ~ DDR4는 같은 DDR 계열의 제품이긴 하지만, 내부적인 기술에 차이가 있고, 모듈의 모양(슬롯 형태)도 다르기 때문에 사용할 수 있는 메인보드가 각각 정해져 있다. 다시 말해, DDR2 전용의 메인보드에 DDR3를, 혹은 DDR3 전용의 메인보드에 DDR4를 꽂을 수 없다. 


예외적으로 두 종류의 램 슬롯을 동시에 갖춘 메인보드도 소수 존재하지만, 이런 경우에도 두 종류의 램을 혼용하는 것은 불가능하며, 둘 중 한가지만 선택해서 장착해야 한다. 이런 메인보드는 램 규격이 바뀌는 과도기에 종종 출시되는데, 처음에는 구형 규격의 램을 사용하다가 이후에 구형 램을 제거하고 신형 규격의 램으로 교체할 때 유용하다.


한편 같은 규격의 램이라도 용량이나 데이터 전송속도가 다를 수 있다. 이를테면 ‘DDR3 PC3-12800 4GB’라는 램이 있다면, 이는 4GB 용량의 DDR3 규격 램 중에서도 약 12,800MB/s의 최대 데이터 전송속도를 낼 수 있는 제품이다. 마찬가지로, ‘DDR3 PC3-10600 8GB’라는 램이면, 8GB 용량의 DDR3 규격의 램 모듈이며, 최대 데이터 전송속도는 약 10,600MB/s라는 의미다. 


여러 개의 램 모듈을 하나의 메인보드에 함께 꽂을 경우, 용량이나 속도는 각각 다르더라도 규격(DDR1, DDR2, DDR3, DDR4 등)만 같다면 PC 작동에 별다른 문제는 없다. 다만, 그 중에서 가장 낮은 성능의 램에 전반적인 램 성능이 동기화 된다. 예를 들어 DDR3 PC3-12800 4GB 제품과 DDR3 PC-10600 8GB를 함께 꽂을 경우, 메인보드는 총 12GB의 PC3-10600 DDR3 규격 램이 장착된 것으로 인식한다.


램을 2개씩 꽂는 것을 추천하는 이유


아울러 최근 나오고 있는 대부분의 메모리 컨트롤러(memory controller: 램의 제어장치로, 메인보드나 CPU에 내장됨)는 2배수에 해당하는 램 모듈을 장착했을 때 대역폭(한 번에 옮길 수 있는 데이터의 양)을 2배로 높일 수 있는 ‘듀얼채널(Dual-channel)’ 기술을 제공한다. 쉽게 말해, 1개 또는 3개의 램 모듈을 장착했을 때 보다 2개 또는 4개의 램 모듈을 장착하면 보다 나은 성능을 기대할 수 있다는 것이다. 물론, 램을 듀얼채널로 장착했다 하여 갑자기 PC의 속도가 2배로 빨라지거나 하지는 않는다. 하지만 대용량의 프로그램을 사용하거나 동시에 여러 가지 작업을 동시에 할 때 상대적으로 유리하다.


듀얼채널은 한 쌍의 채널에 해당하는 2개의 슬롯에 램 모듈을 각각 꽂아 구성한다. 듀얼 채널 구성이 가능한 슬롯끼리는 색상으로 구분이 된다. 만약 2개의 램 모듈을 꽂더라도 각각 다른 색상의 슬롯에 장착할 경우, PC의 작동 자체는 가능해도 듀얼채널의 기능은 발휘되지 않는다. 그리고 듀얼채널 구성 시, 한 쌍의 램 모듈은 되도록이면 제조사, 속도, 용량 등이 같은 것으로 하는 것이 좋다. 물론, 양쪽 램 모듈이 완전히 동일하지 않아도 정상적인 듀얼채널 구성이 되는 경우도 많지만, 아무래도 실패 확률이 높아진다.


끝으로, 일부 구형 메인보드나 CPU는 듀얼채널 기능을 아예 지원하지 않을 수 있으며, 서버나 워크스테이션과 같은 일부 고급 사양의 시스템은 3개나 6개의 램 모듈을 꽂을 경우 데이터 대역폭이 3배로 향상되는 ‘트리플채널(Triple-channel)’ 구성, 혹은 4개나 8개의 램 모듈을 꽂으면 데이터 대역폭이 4배로 향상되는 ‘쿼드채널(Quad- channel)’ 구성을 지원하는 경우도 있다.


램 증설로 PC 성능을 UP!


데스크톱이나 노트북 등의 개인용 컴퓨터, 즉 PC는 대부분 램의 업그레이드가 가능하게 설계되어있다. PC용 램은 반도체 칩 여러 개를 직사각형의 기판 위에 부착한 모듈(module) 형태로 공급된다. 참고로, 데스크톱용과 노트북용 램 모듈은 크기가 다르니 구입시 주의해야 한다.


램 모듈은 PC 내부의 메인보드(mainboard 또는 motherboard: 주기판) 상에 위치한 메모리 슬롯에 장착한다. 슬롯의 수는 메인보드의 종류마다 다르지만, 노트북이나 보급형 데스크톱 메인보드의 경우 2개, 중급형 이상의 데스크톱 메인보드라면 4개가 제공되는 경우가 많다. PC 출고 시, 대부분 1개나 2개의 램 모듈이 장착되기 때문에 남은 슬롯에 추가로 램 모듈을 장착하여 업그레이드가 가능하다. 만약 남은 슬롯이 없다면 기존의 램 모듈을 빼낸 뒤에 업그레이드를 해야 한다.


그리고 메인보드의 종류에 따라 최대한으로 장착할 수 있는 램 용량이 정해져 있다. 이를테면 인텔 H81 계열 메인보드의 경우 최대 16GB까지, 인텔 Z97 계열의 메인보드는 최대 32GB까지 지원하는 경우가 많다. 따라서 램을 증설하고자 한다면 먼저 해당 PC 및 메인보드의 제조사에 관련 정보를 문의하는 것이 좋다. 


다만, 메인보드가 고용량의 램을 지원하더라도 32비트 기반의 운영체제를 이용한다면 4GB 이상의 램을 모두 사용할 수 없다. 예를 들면 아직도 많은 사람들이 사용하는 PC용 운영체제인 마이크로소프트 윈도우 7 32비트 버전에선 4GB 이상의 램을 꽂더라도 3.5GB 혹은 3.25GB 등으로 실제 용량보다 적게 인식된다. 따라서 4GB 이상의 램을 완전히 사용하고 싶다면 64비트 버전의 운영체제를 설치해야 한다.

'pc관련' 카테고리의 다른 글

win10 설치 관련  (0) 2019.04.26
메인보드, PC케이스 - 종류  (0) 2019.03.17
저장장치(SSD,HDD)  (0) 2019.03.14
파워서플라이에 종류  (0) 2019.03.11
CPU쿨러,쿨링팬  (0) 2019.03.07
Posted by 둥이파파^^
pc관련/C언어2019. 3. 16. 20:37

함수는 C에서 프로그램을 작성할 때 중심이 되는 부분이다. 앞에서는 이미 컴파일러의 일부분으로 제공되는 C의 라이브러리 함수의 몇 가지를 살펴보았다. 이 장에서는 프로그래머가 작성하는 사용자 정의 함수에 대해서 알아보도록 하겠다.


오늘은 다음과 같은 내용을 배울 것이다.

- 함수는 무엇이고, 어떤 내용으로 구성되는가?

- 함수와 구조화 프로그래밍의 장점

- 함수를 작성하는 방법

- 함수 내에서의 지역 변수 선언

- 함수에서 프로그램으로 결과 값을 돌려주는 방법

- 함수에 인수를 전달하는 방법


1. 함수는 무엇인가?

 : 이 장에서는 '함수란 무엇인가?'에 대한 해답을 두 가지 나누어 설명할 것이다. 우선, 함수가 무엇인지 설명하고 나서 함수의 사용 방법을 알아보도록 하자.


1.1 함수의 정의

 : 우선 함수가 무엇인지 알아보자. 함수(function)는 일정한 동작을 수행하고, 필요에 따라 함수를 호출했던 프로그램으로 결과 값을 돌려주는 C의 독립적인 코드이며, 독특한 이름을 가진다. 이것을 좀더 구체적으로 살펴보자.


 - 함수는 이름을 가진다.

: 모든 함수는 독특한 이름을 가지고 있다. 프로그램에서는 이런 이름을 사용하여 함수에 포함된 내용(코드)을 사용할 수 있게 된다. 이런 동작을 함수 호출이라고 한다. 함수는 또한 다른 함수 내에서 호출될 수 있다.


 - 함수는 독립적이다.

: 함수는 프로그램 내의 다른 부분에 의해서 영향을 받거나 또는 다른 부분에 영향을 주지 않고 주어진 동작을 수행한다.


 - 함수는 특정 동작을 수행한다.

: 이것은 아주 간단한 사실이다. 함수가 수행하는 동작은 프로그램에서 프린터로 텍스트 문장을 인쇄하거나 숫자 순서대로 배열을 정렬하고, 세제곱근을 구하는 것과 같이 프로그램의 전체적인 동작을 구성하는 일부분이자 독립된 작업 내용이다.


 - 함수는 호출한 프로그램으로 결과 값을 돌려줄 수 있다.

: 프로그램이 함수를 호출할 때에는 함수에 포함된 문장이 실행된다. 이런 함수 내의 문장은 필요할 때마다 호출한 프로그램으로 결과를 전달할 수 있다. 지금까지 설명한 내용이 함수의 '정의'이다. 함수에 대한 내용을 설명할 때 이런 내용을 기억하기 바람.


1.2 함수의 사용 예

<리스트 5.1>에 있는 프로그램에는 사용자 정의 함수가 포함되어 있다.


<리스트 5.1> 숫자의 세제곱을 계산하기 위해 함수를 사용하는 프로그램

 

-> 입력 / 출력
 Enter an integer value: 9
 The cube of 9 is 729.
=> cube()함수와 main()함수의 구조를 비교해본다면, 두 함수의 구조가 같다는 것을 알 수 있다. main()도 하나의 함수이다. 함수의 다른 예로는 앞에서 사용했던 printf()와 scanf()가 있다. printf()와 scanf()는 사용자 정의 함수와 달리 라이브러리 함수이지만, 사용자 정의 함수와 마찬가지로 인수를 사용하고 결과를 돌려주는 함수이다.

2. 함수의 사용
 : C 프로그램에서는 프로그램 내에서 함수를 호출할 때까지 함수 내의 문장을 실행하지 않는다. 프로그램은 함수를 호출할 때 하나 이상의 자료를 인수의 형식으로 함수에 전달할 수 있다. 인수(argument)는 함수에서 특정 동작을 수행하기 위해서 필요한 프로그램의 데이터이다. 인수를 전달받은 함수는 주어진 동작을 수행하기 위해 함수 내에 포함된 문장을 실행하게 된다. 함수 내의 모든 문장이 실행되고 나면, 프로그램에서 함수를 호출했던 부분이 다시 실행될 것이다. 함수는 필요한 경우에 복귀값의 형식으로 프로그램에 결과값을 전달할 수 있다. <그림 5.1>은 한 번씩 호출되는 세 개의 함수가 사용되는 프로그램을 보여주고 있다. 함수가 호출될 때마다 프로그램의 제어는 함수로 전달된다. 함수의 실행이 완료될 때 제어는 프로그램 내에서 함수를 호출한 부분으로 다시 전달된다. 함수는 필요한 만큼 여러 번 호출될 수 있으며, 어떤 순서로도 호출될 수 있다.

 

 

<그림 5.1> 프로그램에서 함수를 호출할 때 제어는 함수로 전달되며, 함수의 실행이 완료될 때 다시 프로그램으로 전달된다. 이제 함수에 대한 개념과 함수의 중요성을 이해할 수 있을 것이다. 잠시 후에 자신만의 함수를 작성하고 사용하는 방법을 살펴보도록 하자.

** 문법 - 함수의 작성과 사용


함수 원형

    return_type function_name(arg-type name-1, ..., arg-type name-n);


함수 정의

    return_type function_name(arg-type name-1, ..., arg-type name-n)

    {

         /* 함수의 여러 가지 문장들 */

    }


함수 원형(function prototype)은 프로그램에서 나중에 정의되는 함수에 대한 내용을 컴파일러에게 알려주고 함수가 돌려주는 복귀값의 형태를 포함한다. 또한 함수의 동작 내용을 설명하는 함수의 이름을 포함하고 있다. 함수 원형에는 함수에 전달되는 인수의 형태(arg-type)가 포함되고, 필요에 따라 함수에 전달되는 변수의 이름을 포함한다. 함수 원형은 항상 세미콜론으로 끝난다. 함수 정의(function definition)는 실제적인 함수의 내용이다. 함수 정의에는 실행될 문장이 포함된다. 함수 정의에서 첫 번째 부분은 함수 헤더 (function header)라고 하는데, 함수 원형에서 세미콜론을 제거한 것과 같은 내용을 가진다. 함수 헤더는 세미콜론으로 끝나지 않는다. 또한 함수 원형에서는 변수의 이름이 선택적으로 사용되지만, 함수 헤더에서는 반드시 포함되어야 한다. 헤더의 다음에는 함수가 수행하는 동작을 위해서 필요한 프로그램 문장이 포함된다. 함수의 주요 내용이 되는 이 부분은 중괄호 내에 포함되어야 한다. 또한, void가 아닌 다른 어떤 형태의 복귀값이 필요하다면, 지정된 형태에 일치하는 return문이 포함되어야 한다.


   함수 원형의 예


       double squared(double number);

       void print_report(int report_number);

       int get_menu_choice(void);


   함수 정의의 예


       double squared(double number)

       {

         return (number * number);

       }

 

       void print_report(int report_number)

       {

          if(report_number == 1)

            puts("Printing Report 1");

          else

            puts("Not printing Report 1");

       }

 


3. 함수와 구조화 프로그래밍

 : C 프로그램을 작성할 때에는 개별적인 프로그램 동작을 함수를 통해서 독립적으로 수행하는 구조화 프로그래밍(structured programming)을 구현할 수 있다. 프로그램의 독립된 부분에서 작업을 처리한다는 것은 앞에서도 설명한 함수의 특징과 동일하다. 함수와 구조화 프로그래밍은 아주 밀접한 관련이 있다.


3.1 구조화 프로그래밍의 장점

 : 구조화 프로그래밍이 왜 중요한가? 두 가지 중요한 이유가 있다.


- 복잡한 프로그래밍 문제를 여러 개의 단순하고 짧은 내용으로 분할하므로 구조화 프로그래밍을 통해 프로그램을 작성하는 것이 더 쉽다. 각각의 작업은 프로그램과 독립적으로 존재하는 함수에 의해서 수행된다. 이런 과정을 통해서 한 번에 하나씩 문제를 처리하며 상대적으로 쉽게 프로그램을 작성할 수 있다.


- 구조화 프로그래밍을 통해 작성한 프로그램은 디버깅이 쉽다. 만약 프로그램에 비정상적인 동작을 나타내는 버그(bug)가 포함되어 있다면, 구조화 프로그래밍에서는 특정 함수를 분리해서 문제를 쉽게 발견할 수 있다.


 구조화 프로그래밍과 관련된 다른 한 가지 장점은 시간을 절약할 수 있다는 것이다. 만약 어떤 프로그램에서 특정 동작을 수행하는 함수를 작성한다면, 이런 동작을 수행할 필요가 있는 다른 프로그램에서 그 함수를 쉽게 사용할 수 있을 것이다. 심지어 새로운 프로그램에서 약간 다른 내용의 동작을 수행할 필요가 있다면, 처음부터 새로운 함수를 작성하는 것보다 이전에 작성했던 함수를 변경하여 사용하는 것이 더 쉽다는 것을 알 수 있을 것이다. 실제로 이런 함수를 직접 작성해보지 않더라도, 지금까지 두 함수 printf()와 scanf()를 아주 많이 사용했다는 것을 생각해보기 바란다. 만약 함수가 한 가지 작업을 수행하도록 작성되어 있다면, 다른 프로그램에서 사용하기는 더 쉬어진다.


3.2 구조화 프로그래밍의 방법

 : 구조화 프로그래밍을 구현하기 원한다면, 우선 몇 가지 계획을 세울 필요가 있다. 이런 계획은 프로그램을 직접 작성하기 전에 세워야 하는 것으로, 종이와 연필만으로도 간단히 할 수 있는 일이다. 프로그래밍 계획에는 처리할 작업을 목록으로 나열해야 한다. 일단 전체적이고 포괄적인 프로그램의 동작을 생각해보자. 만약 이름과 주소록을 관리하기 위한 프로그램을 작성하려고 한다면, 프로그램이 어떤 동작을 수행해야 할까? 몇 가지 예를 들어보자.


- 새로운 이름과 주소를 입력한다.

- 현재의 내용을 변경한다.

- 성과 이름에 의한 순서대로 내용을 분류한다.

- 우편용 레이블(label)을 인쇄한다.


여기에서는 프로그램의 동작 내용을 네 가지 주요 작업으로 분할했다. 각각의 내용은 함수로 구성할 수 있다. 이제, 이것을 더욱 구체적으로 나누어보자. 예를 들어, '새로운 이름과 주소를 입력한다'는 동작은 다음과 같이 더욱 구체적으로 나타낼 수 있을 것이다.


- 디스크에서 현재의 주소록을 읽어들인다.

- 하나 이상의 새로운 내용을 입력하도록 해준다.

- 새로운 데이터를 목록에 추가한다.

- 갱신된 목록을 디스크에 저장한다.


이와 비슷하게 '현재의 내용을 변경한다.'는 동작은 다음과 같이 나누어볼 수 있다.


- 디스크에서 현재의 주소록을 읽어들인다.

- 하나 이상의 내용을 변경한다.

- 갱신된 목록을 디스크에 저장한다.


이런 두 가지 항목에서 공통적인 내용이 있다는 것을 알 수 있다. 디스크에서 데이터를 읽어들이고 갱신된 내용을 다시 디스크에 저장하는 동작은 두 가지 경우에 모두 사용된다. 그래서 '디스크에서 현재의 주소록을 읽어들이는' 하나의 함수를 작성하고, 이 함수를 '새로운 이름과 주소를 입력한다'는 함수와 '현재의 내용을 변경한다.'는 함수에서 호출할 수 있다. 또한, '갱신된 목록을 디스크에 저장하는' 함수도 똑같은 방법으로 사용할 수 있을 것이다.


여기서 구조화 프로그램의 한 가지 장점을 알 수 있을 것이다. 프로그램을 작업별로 세분화하면 프로그램 내에서 공통적으로 수행되는 작업이 무엇인지 알 수 있다. 그래서 프로그램을 작성하는데 소모되는 시간을 절약하고, 프로그램을 더욱 작고 효율적으로 만들 수 있으며, '공통적인' 디스크 작업 함수를 작성할 수 있다.이런 프로그래밍 방식은 계층적(hierarchical)으로 짜여진 프로그램의 구조를 형성한다. <그림 5.2>에서는 주소 목록 프로그램의 계층적인 프로그래밍 방식을 보여주고 있다.

 

<그림 5.2> 구조화 프로그래밍은 계층적으로 구성된다. 이런 과정에 의해서, 프로그램에서 수행할 필요가 있는 작업의 세분화도니 목록을 작성할 수 있다. 그리고 나서 모든 동작을 한번에 수행해야 하는 복잡한 프로그램을 작성하는 것보다는 상대적으로 더욱 간단한 각각의 함수를 한 번에 하나씩 작성할 수 있게 된다. 하나의 함수를 작성해서 정상적으로 동작하는지 확인하고 나면 다른 함수를 작성할 수 있다. 프로그램은 서서히 틀을 잡게 될 것이다.

3.3 하향식 접근

 : C 프로그래머들은 구조화 프로그래밍을 통해서 하향식 접근 방법(top-down approach)를 사용하게 된다. 이것은 프로그램의 구성 방법이 마치 나무를 뒤집어 놓은 것처럼 보이는 <그림 5.2>에서 설명한 내용이다. 프로그램의 실제 동작은 대부분 '가지의 끝 부분'에 해당하는 함수에서 수행된다. '상위'의 함수는 이런 여러 가지 함수들 중에서 필요한 것을 실행하도록 지시하는 역할을 한다. 결과적으로, 많은 C 프로그램은 프로그램의 주요 부분인 main() 함수에 적은 양의 코드만을 포함하게 되고, 프로그램의 골격을 이루는 내용은 여러 함수에 포함된다. main()에는 프로그램의 실행을 지시하는 몇 줄의 함수 호출문만 포함된다. 메뉴를 사용하는 프로그램에서는 종종 사용자가 선택한 사항에 따라서 프로그램의 실행을 분기하는 방법이 사용된다. 메뉴의 각 분기는 서로 다른 함수를 사용한다.


4. 함수의 작성

 : 함수를 작성하는 데 있어서의 첫 번째 단계는 함수의 용도를 결정하는 것이다. 일단 함수가 수행해야 하는 동작을 결정하고 나면 함수를 작성하는 실제 과정은 그리 어렵지 않을 것이다.


4.1 함수의 헤더

 : 모든 함수의 첫 번째 부분은 함수에 대한 특정 사항을 설명하는 세 개의 요소로 이루어지는 함수 헤더이다. 헤더는 <그림 5.3>에 나타나 있다. 각각의 요소에 대해서 하나씩 살펴보도록 하자.

<그림 5.3> 함수 헤더의 세 가지 요소

▶ 함수의 복귀형

 : 함수의 복귀형은 함수의 동작이 완료된 후에 함수를 호출했던 프로그램으로 돌려주는 데이터의 형태를 가리킨다. 복귀형은 C의 모든 데이터형이 될 수 있다. 즉, char, int, long. float, double이 사용될 수 있다. 또한, 아무런 값도 전달하지 않는 void형의 함수를 정의할 수 있다. 다음은 몇 가지 예이다.


        int   func1(...)    /* int형을 돌려준다. */

        float func2(...)    /* float형을 돌려준다. */

        void  func3(...)    /* 아무 것도 돌려주지 않는다. */


▶ 함수의 이름

 : 함수의 이름을 지정할 때에는 C의 변수 이름에 대한 규칙을 따라야 한다. 함수의 이름은 독특한 것이어야 하고, 다른 어떤 함수나 변수에 할당된 이름을 사용해서는 안된다. 함수가 수행하는 동작 내용을 알 수 있도록 함수의 이름을 지정하는 것이 좋다.


▶ 매개 변수 목록

 : 대부분의 함수에서는 프로그램에서 전달받는 인수(arguments)를 사용한다. 함수는 어떤 형태의 인수를 사용하는지 나타내어야 한다. 즉, 인수의 데이터가 지정되어야 한다. 함수에는 모든 C의 데이터형이 인수로 사용될 수 있다. 인수의 형태에 대한 내용은 함수 헤더에 매개 변수 목록의 형식으로 포함된다. 함수에 전달되는 각각의 인수에 대해서 매개 변수 목록에는 대응하는 내용이 포함되어야 한다. 이런 내용은 데이터형과 매개 변수의 이름이다. 예를 들어, 다음은 <리스트 5.1>의 함수에서 사용된 헤더이다.


        long cube(long x)


매개 변수 목록은 이 함수가 x라는 매개 변수로 표현되는 하나의 long형 인수를 사용한다는 것을 나타내기 위해서 long x라고 되어 있다. 하나 이상의 매개 변수가 존재한다면 각각의 변수를 쉼표로 구분해야 한다. 그래서 다음과 같은 헤더는


        void func1(int x, float y, char z)


x라는 이름의 int형 변수, y라는 이름의 float형 변수, z라는 이름의 char형 변수 등 세 개의 인수를 사용하는 함수를 정의한다. 어떤 함수에서는 아무런 인수도 사용하지 않으며, 이 때에는 매개 변수의 목록에 void를 사용해야 한다.


        void func2(void)


가끔 매개 변수와 인수의 차이점에 대해서 혼란스러울 것이다. 매개 변수(parameter)는 함수의 헤더에 포함되는 내용으로, 인수에 대응하여 '영역을 확보하는' 역할을 한다. 함수의 매개 변수는 고정적인 것이므로 프로그램이 실행되는 동안에 변경되지 않고 사용된다. 반면에, 인수는 함수를 호출하는 프로그램에 의해서 함수로 전달되는 실제값이다. 함수가 호출될 때마다 다른 인수값이 전달될 수 있다. 함수가 호출될 때마다 같은 수와 같은 형태의 인수를 전달해야 하지만, 인수의 실제 값은 달라질 수 있다. 함수는 인수에 대응하는 매개 변수의 이름을 통해서 값을 받아들인다. 예제를 통해서 이런 사실을 분명히 이해하도록 하자. <리스트 5.2>는 두 변 호출되는 하나의 함수가 포함되어 있는 아주 간단한 프로그램이다


<리스트 5.2> 인수와 매개 변수의 차이점

 

-> 출력

   The value of z = 1.750000

   The value of z = 32.555000


<그림 5.4>에는 인수와 매개 변수의 관계가 나타나 있다.

 <그림 5.4> 함수가 호출될 때마다 인수가 함수 내의 매개 변수에 전달된다.

4.2 함수의 몸체

 : 함수의 몸체(function body)는 중괄호 내에 포함되어 있으며 함수의 헤더 다음에 나타난다. 함수의 실제 동작은 여기서 수행된다. 함수가 호출될 때, 프로그램의 제어는 함수의 몸체에서 부터 시작해서 return문을 만나거나 닫는 중괄호가 나타날 때 다시 함수를 호출한 프로그램으로 돌아간다.


▶ 지역변수

 : 함수의 몸체에서는 변수를 선언할 수 있다. 함수 내에서 선언되는 변수를 지역 변수(local variables)라고 한다. 지역적(local)이라는 것은 변수가 함수 내에서만 사용되고 프로그램의 다른 부분에서 동일한 이름으로 선언된 변수와 구분된다는 것을 뜻한다. 이것이 지역 변수의 개념이다. 이제부터 지역 변수를 선언하는 방법을 살펴보자. 지역 변수는 다른 변수에서와 동일한 규칙을 사용하여 선언할 수 있다. 또한, 지역 변수는 선언하는 동시에 초기화할 수 있다. 함수 내에서는 C의 모든 변수형을 선언할 수 있다. 다음은 함수 내에서 선언되는 네 개의 지역 변수를 사용하는 예제이다.


        int func1(int y)

        {

            int a, b = 10;

            float rate;

            double cost = 12.55;

        }


여기에서는 함수 내부에서 사용되는 지역 변수 a, b, rate, cost를 선언한다. 함수의 매개 변수도 변수의 선언에 해당되는 것이므로, 매개 변수의 목록에 있는 변수도 함수 내에서 사용될 수 있다. 함수 내에서 변수를 선언하고 사용할 때, 이 지역 변수는 프로그램의 다른 부분에서 선언된 모든 변수에 대해서 독립적이다. 심지어 다른 변수가 같은 이름을 사용하고 있더라도 서로 다른 변수이다. <리스트 5.3>에 있는 프로그램은 이런 독립성을 보여주고 있다.


<리스트 5.3> 지역 변수의 사용 

-> 출력


   Before calling demi(), x = 1 and y = 2.

   Within demo(), x = 88 and y = 99.

   After calling demo(), x = 1 and y = 2.


여기에서 알 수 있듯이 함수의 지역 변수 x와 y는 함수의 바깥에서 선언된 전역 변수 x, y와 완전히 다르다. 함수 내에서 변수를 사용하는 경우에는 세가지 규칙이 적용된다.


- 함수에서 변수를 사용하기 위해서는 함수 헤더나 함수 내에서 선언해야 한다.

- 함수를 호출하는 프로그램에서 사용되는 값을 함수 내에서 사용하기 위해서는 인수의 형태로 전달해야 한다.

- 함수를 호출한 프로그램으로 함수의 결과값을 전달하기 위해서는 함수에서 결과값을 돌려주어야 한다.


▶ 함수의 내용

 : 함수에서 사용할 수 있는 문장의 종류나 내용에는 기본적으로 아무런 제한이 없다. 함수에서 수행할 수 없는 유일한 한가지 동작은 다른 함수를 정의하는 것이다. 그러나 순환문, if문, 할당문을 포함하여 함수에서는 C의 모든 문장을 사용할 수 있다. 또한 함수에서는 라이브러리 함수와 사용자 정의 함수를 호출할 수 있다. 함수의 길이에는 제한이 있을까? C는 함수의 길이에 대해서 아무런 제한을 두고 있지 않지만, 실용적인면에서 볼 때 함수는 상대적으로 짧은 것이 좋다. 구조화 프로그래밍에서 각각의 함수는 상대적으로 간단한 하나의 작업을 수행하는 것이 좋다는 사실을 기억하기 바란다. 함수의 길이가 상당히 길어진다면 하나의 함수로 여러 가지 동작을 수행하려고 했기 때문이다. 이런 함수는 아마도 두 개 이상의 더욱 세분화된 함수로 나눌 수 있을 것이다. 그렇다면, 어느 정도의 길이가 긴 것일까? 여기에 대한 정확한 해답은 없지만, 실제 경험에 의하면 25줄이나 30줄 이상의 함수를 작성하는 경우는 거의 없고 찾아보기도 힘들다. 함수의 길이에 대해서는 스스로 판단해야 한다. 어떤 프로그램에서는 긴 함수가 필요할 것이고, 대부분의 함수에서는 몇 줄의 문장만이 필요할 것이다. 프로그래밍 경험을 쌓아감에 따라, 더욱 세분화되니 함수를 사용해야 하는 경우와 어느 정도의 길이를 가지는 함수를 작성하여 사용해야 하는 경우를 구분할 수 있게 될 것이다.


▶ 값의 전달

 : 함수의 결과 값을 프로그램으로 돌렺주기 위해서는 return문과 함께 C의 수식을 사용해야 한다. 제어가 return문에 도달할 때, 수식은 평가되고 제어는 다시 원래의 프로그램으로 전달된다. 함수의 복귀값은 수식의 결과이다. 다음 함수를 살펴보자.


        int func1(int var)

        {

           int x;

           return x;

        }


이 함수가 호출될 때 return문까지의 함수의 내용이 실행된다. return은 함수를 마치고 처음에 함수를 호출했던 프로그램으로 x라는 값을 돌려준다. return에는 모든 C의 수식을 사용할 수 있다. 함수는 여러 개의 return문을 가질 수 있다. 그러나 실제로 효과를 나타내는 것은 가장 먼저 실행되는 return문이다. <리스트 5.4>에서 볼 수 있듯이 여러 개의 return문을 사용하는 것은 함수에서 다양한 값을 돌려주는 호과적인 방법이다.


<리스트 5.4> 함수에서 여러 개의 return문을 사용하는 예

 

-> 입력 / 출력

   Enter two different integer values:
   300
   200
   The larger value is 300.

4.3 함수의 원형
 : 프로그램에는 사용되는 각각의 함수에 대한 함수 원형이 포함되어야 한다. <리스트 5.1>의 4변째중에는 함수 원형이 나타나 있고 앞에서 다른 여러 프로그램의 함수 원형을 보았다. 함수 원형은 무엇이고 왜 사용해야 하는 것일까? 앞의 예제에서, 함수의 원형은 함수의 헤더에 세미콜론을 추가한 것과 같다는 것을 알 수 있다. 함수 헤더와 마찬가지로 함수의 원형에는 함수의 복귀형, 이름, 매개 변수에 대한 내용이 포함된다. 함수 원형이 하는 일은 컴파일러에게 함수의 복귀형, 이름, 매개 변수에 대해서 알려주는 것이다. 컴파일러는 이런 자료를 이용하여 소스 코드에서 함수를 호출할 때마다 함수를 찾아서 함수에 전달되는 인수의 수와 형태를 확인하고 함수가 돌려주는 복귀값이 정확한지 검사할 수 있다.
 만약 이런 과정에서 문제가 발생하면 컴파일러는 에러 메시지를 출력한다. 실제로 함수 원형이 함수의 헤더와 정확히 일치할 필요는 없다. 동일한 형태와 순서의 매개 변수를 사용하고 동일한 개수의 매개 변수를 포함시킨다면 변수의 이름은 달라질 수 있다. 헤더와 원형의 내용이 반드시 일치할 필요는 없다. 그러나 헤더와 원형을 똑같이 작성하면 프로그램을 더욱 이해하기 쉽다. 함수 정의를 마칠 때 함수의 원형을 작성하기 위해서 헤더를 복사해서 에디터에서 제공되는 잘라 붙이기 기능을 사용하면 된다. 마지막에는 반드시 세미콜론을 추가하기 바란다. 함수 원형은 소스 코드의 어디에 위치되어야 하는 것일까? 함수 원형은 main()이 시작되기 전이나 또는 첫 번째 함수가 정의되기 전에 포함되어야 한다. 프로그램을 이해하기 쉽게 하려면 모든 함수원형을 한군데 모아두는 것이 가장 좋다.

5. 함수에 인수 전달하기
 : 함수에 인수를 전달하기 위해서는 함수의 이름 다음에 나타나는 괄호 내에 인수를 포함시 켜야 한다. 인수의 수와 형태는 함수 헤더나 원형에 나타나 있는 것과 일치해야 한다. 예를 들어, 함수가 두 개의 int형 인수를 사용하도록 정의되어 있다면, 더 많거나 적지 않고 데이터형이 다르지 않은 두 개의 int형 인수를 전달해야 한다. 만약 함수에 부적절한 형태나 개수의 인수를 전달하려고 한다면, 컴파일러는 함수 원형에 나타나 있는 내용을 근거로 하여 문제를 찾을 것이다.
 함수가 여러 개의 인수를 사용할 경우 함수 호출에 포함되는 인수는 순서대로 함수의 매개 변수에 할당된다. <그림 5.5>에 나타나듯이 첫 번째 인수는 첫 번째 매개 변수에 대응하고, 두 번째 인수는 두번째 매개 변수에 대응하는 순서로 전달된다.

<그림 5.5> 여러 개의 인수는 순서대로 함수의 매개 변수에 할당된다.

각각의 인수는 C에서 사용할 수 있는 어떤 수식이든지 될 수 있다. 상수, 변수, 산술이나 논리 수식, 또는 심지어 하나의 return값을 가지는 다른 함수를 사용할 수도 있다. 예를 들어, half(), square(), third()가 모두 복귀값을 가지는 함수라면 다음과 같은 문장을 작성할 수 있다.


      x = half ( third ( square ( half ( y ) ) ) );


프로그램은 우선 y라는 인수를 전달하며 함수 half()를 호출한다. half()의 실행이 완료되면 half()의 복귀값을 인수로 사용하여 square()가 호출된다. 다음으로 square()의 복귀값을 인수로 사용하여 third()가 호출된다. 그리고 나서 다시 half()가 호출되며, 이번에는 third()의 복귀값을 인수로 사용하게 된다. 마지막으로 half()의 복귀값은 변수 x에 할당된다. 다음은 이와 같은 내용의 문장을 여러 개로 나눈 것이다.


       a = half(y);

       b = square(a);

       c = third(b);

       x = half(c);


6. 함수의 호출

 : 함수는 두 가지 방법으로 호출할 수 있다. 어떤 함수는 단순히 함수 이름과 인수만을 사용하여 한 문장으로 호출할 수 있다. 만약 함수가 복귀값을 가진다면 그 값은 버려진다.


       wait(12);


두 번째 방법은 복귀값을 생성하는 함수에서만 사용할 수 있다. 이런 함수는 결과적인 값, 즉 복귀값을 전달하므로 C의 수식으로 간주된다. 그래서 C의 수식을 사용할 수 있는 곳이라면 어디에서든지 사용할 수 있다. 앞에서는 이미 복귀값을 생성하며 할당문의 오른쪽에서 사용되는 수식의 예를 보았다. 몇 가지 다른 예를 살펴보도록 하자. 다음 예제에서 half_of()는 함수의 매개 변수이다.


       printf("Half of %d is %d." x, half_of(x));


우선, x를 인수로 하여 함수 half_of()가 호출되고, printf()는 x와 half_of(x)의 결과를 인수로 사용하여 호출된다. 두 번째 예에서는 하나의 수식 네에서 여러 함수를 사용하고 있다.

  

       y = half_of + half_of(z);


여기에서는 half_of()를 두 번 사용하고 있지만, 두 번째 함수는 다른 함수가 될 수도 있을 것이다. 동일한 내용을 여러 문장으로 나누면 다음과 같다.


       a = half_of(x);

       b = half_of(z);

       y = a + b;


마지막 두 예제는 함수의 복귀값을 사용하는 효과적인 방법을 보여준다. 다음은 if문 내에서 사용된 함수이다.


       if (half_of(x) > 10)

       {

          /* 어떤 문장이 될 수 있다 */

       }


함수의 복귀값이 기준에 일치한다면, 즉 half_of()가 10보다 큰 값을 돌려주면 if문은 참이 되고 그 아래에 있는 문장이 실행된다. 그러나 함수의 복귀값이 조건을 만족시키지 않는다면 if문의 내용은 실행되지 않는다. 다음은 더 좋은 예이다.


       if (do_a_process() != OKAY)

       {

          /* 에러 처리 루틴 */

       }


여기서 사용된 예제도 실제 프로그래밍 예제는 아니다. 그러나 이 문장은 함수가 정상적으로 실행되었는지를 확인하기 위해서 복귀값을 사용하는 중요한 예제이다. 만약 정상적이지 않은 결과가 나타나면 if문에서는 에러 처리 루틴이 실행된다. 이것은 파일에서 자료를 읽어들이고, 값을 비교하고, 메모리를 할당하는 경우에 흔히 사용되는 에러 처리 방법이다. 또한, void의 복귀형을 가지는 함수를 수식에서 사용하게 되면 컴파일러는 에러 메시지를 출력할 것이다.


6.1 재귀 용법

 : 재귀 용법(reacquisition)은 함수가 직접적으로나 간접적으로 그 자신을 호출하는 것을 말한다. 간접적인 재귀(indirect reacquisition)는 하나의 함수를 호출하는 다른 어떤 함수가 현재의 함수 내에서 호출되는 경우를 말한다. C에서는 재귀적인 함수의 사용을 허용하는데, 재귀 용법은 가끔 매우 유용하게 사용된다. 예를 들어, 재귀 용법은 숫자의 계승(factorial)을 계산하는 데 유용하다. 숫자 x의 계승은 x!로 표기하는데 다음과 같이 계산할 수 있다.


      x! = x * (x - 1) * (x - 2) * (x - 3) * ... * (2) * 1


x!는 다음과 같이 계산할 수 있다.


      x! = x * (x - 1)!


계산을 한 번 진행하면 (x-1)!은 동일한 방법으로 계산할 수 있을 것이다.


      (x - 1)! = (x - 1) * (x - 2)!


이런 공식을 사용하여 x가 1이 될 때까지 재귀적인 방법으로 계산을 진행하게 된다. <리스트 5.5>에 있는 프로그램은 계승을 계산하기 위해서 재귀적 함수를 사용한다. 프로그램이 unsigned int형을 사용하므로 계승을 구할 숫자값은 8까지만 허용된다. 9이상의 계승의 결과는 정수형 변수의 범위를 벗어난다.


<리스트 5.5> 계승을 계산하기 위한 재귀적 함수의 사용

 

-> 입력 / 출력


   Enter an integer value between 1 and 8:

   6

   6 factorial equals 720}


7. 함수의 위치

 : 프로그램에서 함수를 어디에 위치시키는 것이 좋을까? 여기에서는 함수를 main()과 같은 파일 내에서 main() 함수의 뒤에 위치시키는 것이 좋다고 알아 두기 바란다. <그림 5.6>에는 함수를 사용하는 프로그램의 기본적인 구조가 나타나 있다. 실제로는 사용자 정의 함수를 main()이 아닌 독립된 소스 코드 파일에 포함시킬 수 있다. 이런 방법은 큰 프로그램을 작성하거나 하나 이상의 프로그램에서 동일한 기능의 함수를 사용하기 원할 때 유용하다.

<그림 5.6> 함수의 원형을 main()의 앞 부분에 위치시키고, 함수 정의 내용을 main()의 뒷 부분에 위치시킨다.

 

 

'pc관련 > C언어' 카테고리의 다른 글

숫자배열 사용하기  (0) 2019.03.20
C언어-프로그램제어문  (0) 2019.03.17
데이터 저장하기 : 변수와 상수  (0) 2019.03.11
C 프로그램의 구성 요소  (0) 2019.03.10
c프로그램밍 기초  (0) 2019.03.09
Posted by 둥이파파^^
pc관련2019. 3. 14. 22:14

저장장치들에 케이블 및 연결포트 모습

 

 

왼쪽부터~~~순서대로

 

1. 하드디스크 3.5인치 (HDD)


2. 하드디스크 2.5인치


3. SSD


4.mSATA (미니 사타 ) SSD


5. m.2 SSD

 

 

규격


SSD의 규격은 제품의 형태와 연결 인터페이스 등에 따라 SATA, mSATA, M.2 등으로 나뉜다. 먼저 SATA(Serial ATA) SSD는 기존 HDD처럼 SATA 포트에 연결해 사용하는 SSD다. 주로 3.5인치와 2.5인치 제품이 많이 나온다.


SATA SSD는 크기가 커서 울트라북에 장착하기가 어렵다. 그래서 나타난 규격이 mSATA다. 이 규격을 지닌 SSD는 메인보드에서 mSATA 슬롯을 지원해야 사용할 수 있다.


이 mSATA를 대체하기 위해 발표한 M.2도 있다. 메인보드에 바로 연결해 사용하는 이 방식을 통해 최대 10GB/s의 속도를 경험할 수 있는데다가 매우 얇아서 이를 채용하는 울트라북이 늘고 있다.


▲ M.2 SSD.


M.2는 SATA 방식, NVMe 방식 등으로 나뉜다. 속도는 후자가 빠르다. NVMe는 기존의 AHCI 인터페이스를 대체하기 위해 개발된 것으로, 오늘날 SSD에서 찾아볼 수 있는 여러 수준의 병렬화를 허용해 이전 인터페이스보다 다양한 성능 개선을 이룰 수 있다.


컨트롤러


SSD 내부는 크게 컨트롤러와 낸드플래시 메모리로 구성된다. 이 중에서 컨트롤러는 낸드플래시 메모리에 데이터를 저장하고 낸드플래시 메모리를 관리하는 한편 다시 데이터를 읽는 등 SSD의 모든 것에 관여하는 핵심 부품이다. 컨트롤러가 좋 지 않다면 SSD 속도가 느려지고 데이터가 손실될 수 있으니 좋은 컨트롤러를 사용하는 것이 중요하다.


주요 컨트롤러 브랜드로는 삼성전자, 마벨, 실리콘모션 등이 있다. SSD 시장 점유율 1위를 달리는 삼성전자는 자체적으로 컨트롤러를 개발해 사용하고 있으며 마벨은 인텔, 샌디스크, 마이크론, 도시바 등의 SSD에 많이 쓰인다.


낸드플래시 메모리


HDD는 자기 디스크에 데이터를 저장하는 반면, SSD는 낸드 플래시 메모리라는 반도체를 이용해 데이터를 저장한다. SSD 가 HDD보다 속도가 빠른 것은 이 때문이다. 게다가 내부에 모 터를 넣을 필요도 없어져서 진동과 소음도 덜하다.


캐시 메모리


CPU 안에는 캐시 메모리라는 기억 장치가 있다. 메모리의 속도는 CPU 보다 훨씬 느려서 CPU가 메모리에서 명령어나 데이터를 일일이 읽어내면 속도가 대단히 느리다. 그래서 처음 프로그램을 실행할 때 메모리에서 들어오는 내용을 캐시 메모리에 복사해두고 프로그램을 실행하면 속도가 빨라진다.


SSD에도 더욱 빠른 데이터 처리를 위해 캐시 메모리를 넣은 제품들이 있다. 캐시 메모리가 클수록 많은 데이터를 처리할 수 있기 때문에 캐시 메모리 용량이 크면 클수록 좋다. 저가형 SSD들 중에는 이 캐시 메모리가 없는 경우도 있다.

 

 

읽기 속도


읽기 속도는 SSD를 비롯한 메모리에 저장된 파일을 읽어오는 속도를 말한다. 당연히 읽기 속도가 빠를수록 파일 로딩이 빨라 쾌적하게 컴퓨터를 사용할 수 있다. 이 읽기 속도는 내부의 컨트롤러에 따라 달라진다. 인터페이스 또한 읽기 속도에 영향을 끼친다.


SSD의 읽기 속도는 순차 읽기와 랜덤 읽기로 나뉜다. 순차 읽기 속도는 용량이 큰 데이터를 읽을 때의 속도를 뜻하며, 랜덤 읽기 속도는 용량이 작은 데이터를 읽을 때의 속도를 의미한다. SSD에 운영체제를 설치할 경우에는 순차 읽기보다는 랜덤 읽기 속도가 중요하다. 순차 읽기 속도 단위는 MB/s이며, 랜덤 읽기 속도 단위는 IOPS다.


쓰기 속도


쓰기 속도는 SSD를 비롯한 메모리에 파일을 저장하는 속도를 뜻한다. 그래서 쓰기 속도가 빠른 SSD의 경우 파일을 빨리 저장할 수 있다. SSD의 쓰기 속도는 순차 쓰기와 랜덤 쓰기로 나뉜다. 제조사에서 표기하는 쓰기 속도는 일반적으로 속도가 더욱 빠른 순차 쓰기인 경우가 많다.


순차 쓰기 속도는 대용량 파일을 저장할 때 적용되는 속도로, 프로그램 설치, 대용량 동영상 복사 등과 관련이 있다. 한편, 랜덤 쓰기 속도는 메모리 스와핑 시에 적용된다. PC 메모리 용량이 부족할 때 운영체제가 SSD를 메모리 대신 사용하는 것을 메모리 스와핑이라 하는데, 이때는 작은 파일을 읽을 때 나오는 속도인 랜덤 쓰기가 중요하다. 순차 읽기 속도 단위는 MB/s이며, 랜덤 읽기 속도 단위는 IOPS다.


TBW


TBW는 Tera Byte Written의 약자로, SSD에서 진행된 총 데이터 쓰기 량을 나타낸다. 데이터 쓰기는 SSD의 수명과 밀접한 관련이 있기 때문에 이를 바탕으로 SSD 수명에 대한 수치를 판단할 수 있다. TBW는 일반적으로 쓸 수 있는 쓰기 수명인 ‘통상적 TBW’와 제조사에서 책임지는 수명의 한계인 ‘MTBF’(사용보증 시간)로 나뉜다.


참고로 일반 소비자용 SSD의 경우 실제 이용 가능한 TBW는 제조사에서 보증한 TBW보다 다소 높은 편이다. 제조사에서는 A/S 처리 비용 때문에 일반 소비자용 제품에 대해서는 MTBF를 낮게 잡는 편이기 때문이다. SSD 용량과 플래시 메모리의 하위 평균 P/E 사이클을 곱하면 SSD의 대략적인 TBW를 파악할 수 있다.

용량


HDD보다 빠르고 안정적인 SSD가 유행하는 요즘에도 HDD 수요가 끊이지 않는 이유는 용량 때문이다. SSD는 아직 256~512GB가 대세를 이루고 있지만, HDD는 1~2TB 제품이 주를 이루고 있다. 기업용 HDD 중에는 14TB에 달하는 대용량 제품도 있다.


그런데 HDD를 설치하고 컴퓨터에서 용량을 체크해보면 표기된 용량보다 더 적은 양을 사용할 수 있음을 알 수 있다. 이것은 하드디스크에 문제가 있어서는 아니다. 컴퓨터는 2진수 방식으로 데이터를 나타내는데, 제조사에서는 소비자가 알아보기 쉽게 10진법으로 표기해서 10진수의 용량을 2진수로 인식하는 과정에서 차이가 나는 것이다.


로드/언로드 사이클


옛날에 음악을 들을 때 LP판을 턴테이블에 올리고 바늘을 내리면 음악을 들을 수 있는 것처럼, HDD의 헤드가 내려가 플래터와 만나면 데이터를 읽을 수 있다. 이를 헤드파킹이라 하는데, 이 헤드파킹이 가능한 횟수를 로드/언로드 사이클이라 한다.


헤드파킹을 할 수 없으면 HDD의 데이터를 읽을 수 없다. 그래서 로드/언로드 사이클은 HDD의 최대 수명이라 할 수 있다. 최근 출시되는 HDD의 로드/언로드 사이클은 300,000번이다. 다만, 제조사에 따라 헤드파킹 주기가 달라서 헤드 파킹 횟수가 너무 많아져 하드디스크 수명이 짧아지는 경우도 있으니 조심하자.


회전수


HDD는 내부의 플래터(Platter)라는 자성 디스크에 데이터를 기록하고, 이를 고속으로 회전시켜 특정 위치에 저장된 데이터를 찾아낸다. 이 플래터의 분당 회전수에 따라 HDD의 성능이 달라진다. 분당 회전수의 단위는 RPM으로 5000RPM이라면 플래터가 1분 동안 5,000번 동안 회전한다고 볼 수 있다.


분당 회전수가 빠르면, 데이터를 찾아 읽어내는 속도도 높아지기 때문에 성능이 높아진다. 그러나 RPM이 높다고 꼭 좋은 건 아니다. 분당 회전수가 빠르면 발열과 진동, 소음도 심해지고 소비전력도 높아지기 때문이다. 그래서 용도에 따라 적절한 RPM을 지닌 제품을 선택하자. 안정성을 원하면 5000RPM대 제품을, 빠른 속도를 원한다면 7200RPM 제품을 고르면 된다.


인터페이스


인터페이스는 HDD를 메인보드와 연결하는 방식을 뜻한다. 이 인터페이스에 따라 HDD의 최고 속도가 달라진다. 현재 PC용 HDD는 SATA3를 가장 많이 사용한다. 이 인터페이스는 최대 6Gb/s의 데이터 전송속도를 제공한다. 물론 현실적으로는 HDD의 구조상 한계로 인해 이만한 속도를 내기 어렵다.


한편, 외장하드는 USB, 선더볼트 등의 인터페이스를 통해 컴퓨터와 연결한다. 이 중에서 최근 가장 주목받는 인터페이스로는 USB 3.0이 있다. USB 3.0은 USB 2.0보다 전송속도가 10배 정도 빨라서 대용량의 데이터도 빠르게 저장할 수 있다. 와이파이를 통해 외장하드를 노트북, 스마트폰 등과 연결할 수 있는 제품도 있다.


저장방식


플래터의 표면에 데이터가 어떻게 기록되는지에 따라 성능과 최대 용량 등이 결정된다. HDD의 기록방식은 LMR, PMR, SMR 등으로 나뉜다. LMR은 데이터를 수평으로, PMR은 수직으로 배열하는 방식이다. SMR은 기왓장을 겹쳐 쌓는 것처럼 하나의 데이터 트랙에 인접한 트랙을 겹쳐서 저장하는 방식이다.


현재 LMR 방식은 대용량을 저장할 수 없어 사장돼 현재는 PMR과 SMR이 대세를 이루고 있다. PMR은 속도가 빠르고 안정성이 좋은 대신 용량을 늘리기가 쉽지 않고, SMR은 많은 용량을 저장할 수 있지만 성능과 안정성이 떨어진다. HDD가 대용량 제품 위주로 재편되면서 PMR 방식을 적용한 하드디스크는 점점 사라지고 있다.


버퍼


버퍼는 HDD의 기판에 배치된 메모리를 말한다. 이 메모리는 HDD와 컴퓨터 사이에서 임시 저장공간 역할을 한다. 사용하려는 파일을 HDD에서 미리 읽은 뒤 버퍼로 옮기는 것이다. SSD의 캐시 메모리와 비슷하다고 볼 수 있다.


버퍼 용량이 많으면 임시로 저장할 수 있는 파일의 크기가 많아지기 때문에 속도가 빨라진다. 그러나 일반적인 데스크톱이나 노트북에서는 많은 버퍼 용량이 유의미한 성능 차이를 만들어주지는 못 한다. 반면, 웹서버 등에 쓰이는 기업용 HDD에서는 랜덤 액세스 문제 때문에 버퍼 용량이 상당히 중요하다.


보증기간


하드디스크를 사용하다 보면 크고 작은 문제가 발생할 수 있다. 이런 문제가 발생했을 때 제조사나 판매사가 무상 수리를 해주는 기간을 보증기간이라 한다. 일반적으로 많이 사용하는 HDD는 보증기간이 2년까지이나, 기업용 HDD나 고성능 하드디스크는 최대 5년까지 무상 수리가 가능하다.


여기서 주의할 점은 수리 과정에서 일반적으로 데이터 복구까지 지원되지는 않는다는 것이다. 그래서 가능한 한 꾸준한 백업을 통해 데이터 손실을 방지해야 한다. 또한, 보증기간 이내라도 특정 부분에 관해서는 유상으로 수리해야 할 수 있으므로 제조사와 판매사의 A/S 정책을 잘 살펴보자.

'pc관련' 카테고리의 다른 글

메인보드, PC케이스 - 종류  (0) 2019.03.17
PC메모리  (0) 2019.03.16
파워서플라이에 종류  (0) 2019.03.11
CPU쿨러,쿨링팬  (0) 2019.03.07
CPU종류  (0) 2019.03.07
Posted by 둥이파파^^
pc관련2019. 3. 11. 22:50

사람은 밥을 먹고 살고, 전자제품은 전기를 먹고 산다. 컴퓨터도 전자제품인 만큼 구동을 위해 필수적으로 전기가 필요하다. 그럼 컴퓨터에게 전기를 주는 역할은 누가 담당할까? 바로 파워 서플라이다. 파워 서플라이는 컴퓨터의 구동에 필요한 전력을 공급해 주는 장치이며, 입력 전력으로부터 필요한 출력 전력을 생성한다. 이번 시간에는 파워 서플라이의 종류에 대해 자세히 알아보자. 


ATX 파워

 

“ 이제 컴퓨터 전원을 끄셔도 됩니다.”는 윈도우 구 버전을 경험했던 세대에게는 낯설지 않은 문구다. 컴퓨터도 한낱 가전제품에 불과할 뿐인데, 전원을 끄는 아주 기본적인 작업도 사람이 허락까지 받아가며 해야 하다니! 이것은 과거 AT 규격을 사용하던 시절 있었던 일이다. AT는 본체의 전원 스위치가 파워 서플라이에 직접 연결되어 있다. 운영체제가 직접 컴퓨터를 종료하는 것이 불가능했다. 1995년 인텔은 이 AT규격을 개선한 ATX(Advanced Technology Extended, AT Extended)규격을 발표했다. 이 규격은 소형 AT 마더보드를 기반으로 설계해 CPU와 확장 슬롯의 배치를 회전시켜 더 넓은 공간을 확보했다. 현재 ATX는 가장 많이 사용하는 규격이며‘파워서플라이’를 말할 때 ATX가 표준 개념으로 인식된다. 또한, 인텔의 ATX 파워 서플라이 가이드는 계속 업데이트되고 있으며 2007년 이후로는 ATX 12V 2.3 규격이 등장해 지금까지 쓰이고 있다. 표준 크기는 150×86×140(W×H×D)이다.

 

M-ATX 파워

 

Micro-ATX 파워를 뜻한다. 일반 ATX 파워 크기에서 크기가 조금 줄어든 형태다. 그런데 크기만 줄어든 게 아니라 성능도 함께 줄어들었다. 그럼 이걸 왜 쓸까? 다름아닌 케이스 크기 때문이다. 크기가 작은 미니타워나 슬림 케이스는 일반 ATX 파워가 장착되지 않는 경우가 있다. 이럴 때 M-ATX 파워가 필요하다. M-ATX 파워는 작은 케이스에도 무리 없이 쏙 들어가 전원 공급을 담당한다. 또한 파워 선택의 폭이 ATX 다음으로 다양하다.

 

TFX 파워

 

삼성, LG 등 브랜드 슬림 PC는 얇은 체구를 자랑한다. 조그만 미니타워 크기에서 한 술 더 떠 폭까지 아주 얇아진 것. 무려 한 손에 PC 본체를 잡을 수 있을 정도다. 이런 얇은 PC엔 한 덩치를 자랑하는 ATX 파워는 물론, 작다고 소문난 M-ATX 파워도 들어갈 수 없다. 이럴 때 필요한 것이 TFX 파워다.


TFX 파워는 파워의 길이가 긴 대신 폭과 높이가 낮다. 간단하게 테트리스 일자 막대기 모양의 파워다. 주로 쓰이는 곳은 앞서 설명했던 슬림 LP 케이스와 더 조그만 덩치를 자랑하는 ITX 케이스다. 과거엔 FLEX 파워가 ITX 파워의 위치를 담당했다. 표준 크기는 150×86×140(W×H×D)이다.

CFX 파워

 

설명하자면 조금은 슬픈 CFX 파워다. 슬픈 이유는 다음과 같다. 2004년 인텔은 ATX 규격을 개선한 BTX 규격을 발표했다. 당시 차세대 규격으로 발표된 BTX는 ATX의 소비전력·발열량 증가를 해결하려는 모습이 돋보였다. 특히 팬을 적게 사용하고 속도를 낮춰도, 공기순환을 개선시킨 메인보드 설계를 통해 저열량·저소음 시스템을 사용할 수 있다는 것. 바로 이 BTX 규격을 사용하기 위해 필요했던 파워가 CFX 였다.


그러나 BTX는 기존 업계의 소극적인 반응 탓에 ATX를 쉽사리 대체할 수 없었다. 이미 기존 ATX 규격을 활용해 자체적인 쿨링 솔루션을 확보하고 있는 업체가 많았던 것. 또한 초기가가 높고 검증기간이 부족하다는 단점이 뒤따랐다. 결국 BTX는 ATX를 밀어내지 못하고 사장되었고, 그렇게 CFX 파워도 조용히 역사의 뒤안길로 사라졌다.

 

SFX 파워

 

M-ATX와 흡사하지만 그것보다 조금 더 작은 파워다. 아주 조그만 케이스가 아니면 거의 사용하지 않는다. 쉽사리 찾아보기 힘든 만큼 SFX 파워를 사용하는 케이스는 대부분 디자인이 멋지다. 주로 ITX 케이스에 쓰인다. 또한 브라켓을 사용하면 ATX 케이스에도 장착이 가능하다.


SFX 파워는 일반적으로 ATX 파워보다 좋은 성능을 내진 못하지만, 그렇다고 무조건 얕잡아봐서는 곤란하다. 예를 들어 실버스톤에서 내는 SFX 파워는 작은 크기지만 ATX 파워에 절대 밀리지 않는 무서운 성능을 내 준다. 무려 80플러스 골드 인증을 받은 데다 풀 모듈러 방식을 채택한 SFX 파워다.

 

DC to DC

 

작은 PC를 구성하다 보면 아무리 작은 크기의 파워라도 부담스러운 경우가 있다. 이럴 때 DC to DC 파워가 필요하다. DC to DC는 AC 전압을 DC 전압으로 직접 바꾼 뒤, DC 전압을 PC 부품에 직접 공급한다. 일반 컴퓨터에서 사용하는 AC-DC 파워와 달리 DC-DC로 직접 보내는 것이다. 초소형 PC, HTPC, 카PC 등에서 만나 볼 수 있다. 또한 발열이 적어 팬을 장착할 필요가 없어 소음도 없다.

 

리던던트

 

영화‘광해’를 보면 주인공‘하선’이‘광해군’이 병으로 자리를 비운사이 왕의 대역을 맡게 된다. 하선은 광해군과 똑같은 외모를 지녔기 때문에 대역이 가능했던 것. PC 또한 사용하다 보면 안정적인 전원이 반드시 필요한 경우가 있다. 특히 서버용 컴퓨터는 안정성이 극도로 요구되고, 파워도 컴퓨터 부품인 이상 언제든 고장날 수 있기에 반드시 대비해야 한다. 이 때 사용하는 것이 리던던트 파워다. 리던던트 파워는 쉽게‘보험’개념의 파워다. 리던던트 파워는 컴퓨터 안에 같은 파워가 2개 들어간다. 만일 파워 한 개가 고장 날 경우, 남은 파워 한 개가 예비용으로 작동하는 것이다.

표기 출력


오래 전 기자는 500W 용량의 파워 서플라이를 구매하려던 친구에게 질문을 받았다“. 500W 제품은 많은데 이게 왜 가격이 달라? 다 똑같은 거 아냐?”실제로 기자도 한 번 가졌던 의문이다‘. 용량만 같으면 다 똑같겠지.’라고 생각해 검증되지 않은 저가 파워로 시스템을 구성했고, 결과는 시스템의 잦은 다운으로 돌아왔다. 용량은 같은데 왜 차이가 날까? 정답은 표기 출력이다. 표기 출력은 제품 판매 시 표기하는 출력이다. 다만, 이 표기 출력은 안정적인 출력이 아니다. 파워가 순간적으로 낼 수 있는 최대 출력을 표시하기 때문에 문제가 된다.

 

파워의 최대 출력이 500W인데, 안정적으로 낼 수 있는 출력이 그에 한참 못 치는 200W라면, 시스템이 불안정해진다. 시스템의 발열, 고주파음, 성능 저하 등의 현상을 겪게 된 사용자는 뚜렷한 이유를 모른 채 오랫동안 고통 받게 된다.

 

정격 출력

 

앞서 표기 출력을 설명하면서 안정적인 출력의 중요성에 대해 말했다. 이렇게 실제로 낼 수 있는 안정적인 출력이 정격출력이다. 정리하자면 파워에서 변함없이 전력을 안정적으로 공급할 수 있는 용량을 말한다. 표기출력과 다른 점은, 표기출력은 순간적으로 낼 수 있는 최대 출력이지만 정격 출력은 변함없이 일정하게 유지된다. 이 정격 출력과 표기출력이 큰 차이를 보이지 않는 것이 좋은 파워다.


특히 전력 소모량이 증가하는 작업들, 즉 오버클럭이나 고사양 게임을 즐기기 위해서는 정격 출력이 높은 파워가 필요하다. 실제로 공급할 수 있는 전력에 부족함이 없어 시스템을 안정적으로 유지할 수 있다. 파워를 구입할 때는 반드시 정격 출력을 확인해야 한다.

 

PFC 회로

 

PFC 회로에 대해 알기 위해선 우선 PFC에 대해 알아야 한다. PFC는 Power Factor Correction의 약자다. 이 뜻을 그대로 해석하면 역률을 개선한다는 뜻. 즉 PFC 회로는 역률을 개선해 주는 회로다. 역률은 네이버 국어사전엔‘역적을 처벌하는 법률’로 등록이 되어 있다. 그럼 PFC 회로는 역적을 처벌하는 법률을 개선해 주는 회로? 사실 그런 심각한 의미는 아니다. 역률이란 밖에서 들어온 전력(피상전력)을 가정에서 실제로 사용한(유효전력) 비율을 말한다. 피상전력은 집으로 들어와 전자기기에 연결되면서 파장의 간격이 벌어져 유효전력과 무효 전력으로 나뉜다. 이 무효전력이 적으면 역률이 높은 것.


그럼 PFC 회로가 하는 일은 뭘까? PFC회로는 무효 전력을 감소시켜 낭비되는 전기를 보정한다. 이는 전력요금·전력손실·전압강하율 감소, 변압기, 전선로의 시설 용량 경감 등을 이뤄 경제적 이익을 가져온다. 단, 국내 전기 요금을 산정할 때 산업용 전력은 역률 측정이 가능해 역률 개선을 통한 요금 감액이 가능하지만, 일반 가정집은 그런 게 없어 실질적으로 요금 절감 효과는 없다. PFC 회로는 패시브 PFC와 액티브 PFC로 나뉜다.

 

패시브 PFC

 

패시브PFC란 전자파를 감소시키며 효율을 높이고 안정적인 전원공급을 해주는 보호 회로다. AC 입력 회로에 변압기 형태의 인덕터(전류의 변화량에 비례해 전압을 유도하는 코일)와 콘덴서 구성의 부품을 추가해 L - C형태의 회로를 구성했다. 여기서 콘덴서가 전압을 뭉개고 코일이 전류를 뭉개 무효전력과 유효전력 파장의 간격을 좁히는 것이다.


패시브PFC의 장점은 회로가 단순해 만들기 쉬워 부품 단가가 낮다. 그만큼 가격 부담이 적다. 또한 전자파 발생률이 액티브 방식보다 훨씬 낮다. 단점으로는 액티브 방식에 비해 효율이 낮고(약 70%), 추가된 인덕터 덕분에 좀 무겁다. 내부 부품들의 발열도 액티브 PFC 방식보다 높다.

 

80PLUS 인증

 

80plus.org에서 파워서플라이 효율을 80% 이상으로 유지해 테스트에 통과한 제품에 주는 인증마크다. 파워에 부하를 줬을 때 측정되는 효율이 기준으로 지정된 효율 이상으로 나와야 한다.

 

액티브 PFC

 

액티브PFC는 패시브PFC를 보완하기 위해 등장한 방식이다. 코일과 콘덴서가 있던 자리는 IC 반도체 대체해 효율이 높은 전기만 선별해서 통과시킨다. 장점은 인덕터가 사라져 무게가 가볍고 전력효율이 높다(95% 이상). 오디오 잡음도 적고 110V / 220V 전원 선택 스위치를 사용할 필요가 없다. 80V ~ 265V 범위의 AC 입력 전원에서는 자동으로 전압 설정이 된다. 단점은, 전자파가 많이 발생한다는 것. 전자파 방지 검사(EMI 검사)를 거치기 위한 보호 장치가 요구된다. 패시브 PFC보다 생산원가가 올라가 가격이 비싸진다.

 

12V 다중출력

 

12V 다중출력은 12V 출력을 여러 개로 분리해 안정성을 높인 것을 말한다. CPU나 VGA 등 소비전력이 높은 부품은 12V 전압을 사용한다. 이걸 사용할 때, 한 쪽의 전선에 과다한 전류가 흐르게 되면 과열로 전선 피복이 타거나 녹는 경우가 있다. 이걸 방지하기 위해 전선마다 최대 부하량을 설정해 과전류 문제를 피하려 한 것. 과부하가 걸리면 과전류 보호회로(이하 OCP)가 이것을 차단하고 파워를 끌 수 있게 만든다. 12V 다중출력 제품은 멀티레일 파워로도 불린다. 이 멀티레일 파워와 다른 개념으로 싱글레일 파워가있다. 싱글레일 파워는 12V에 OCP가 거의 안 걸려 있다. 그러나 싱글레일이 위험한 것은 아니다. OCP만 없을 뿐, 과전력 보호회로(이하 OPP)가 컴퓨터를 보호한다. OCP와 OPP는 둘 다 컴퓨터를 보호한다는 것은 같지만, OCP는 파워의 일부분에 적용이 가능하고 OPP는 파워 전체에 적용되는 보호회로다. 이해를 돕기 위해 고성능 그래픽카드에서 전력을 소모하는 상황을 가정해 보자. 고성능 그래픽카드에서 OCP가 적용될 정도로 너무 전력을 많이 가져가면 전원이 꺼진다. 그러나 OPP는 그래픽카드가 전력을 소모하는 것과는 상관없이 시스템 전체에서 소화할 수 있는 총 전력소모가 위험하다고 감지할 때 전원을 끈다.

'pc관련' 카테고리의 다른 글

PC메모리  (0) 2019.03.16
저장장치(SSD,HDD)  (0) 2019.03.14
CPU쿨러,쿨링팬  (0) 2019.03.07
CPU종류  (0) 2019.03.07
그래픽 카드에 종류들~~  (0) 2019.03.07
Posted by 둥이파파^^
pc관련/C언어2019. 3. 11. 22:42

데이터 저장하기 : 변수와 상수

 : 컴퓨터 프로그램은 일반적으로 여러 가지 종류의 데이터를 다루는데, 동시에 데이터를 저장하기 위한 수단을 필요로 한다. 이런 데이터나 값은 숫자나 문자가 될 수 있을 것이다. C에서는 숫자값을 저장하기 위한 두 가지 방법으로 변수와 상수를 제공하고, 변수와 상수는 다시 여러 가지 종류로 세분된다. 변수는 프로그램이 실행되는 동안에도 내용을 변경할 수 있는 데이터 저장 영역인 반면에, 상수는 변경할 수 없는 고정된 값을 가지게 된다. 여기서 배울 내용은

  

   ▶ C에서 변수의 이름을 정의하는 방법

   ▶ 여러 가지 종류의 숫자 변수

   ▶ 문자 변수와 숫자 변수의 차이점과 유사점

   ▶ 숫자 변수의 선언과 초기화

   ▶ C에서 사용되는 두 가지 형태의 숫자 상수


이 내용을 이해하기 위해선 컴퓨터의 메모리가 동작하는 방법에 대해서 알아둘 필요가 있다.



1. 컴퓨터의 메모리

 : 컴퓨터가 실행되는 동안 사용되는 자료나 데이터는 읽고 쓰기가 가능한 RAM(Random Access Memory)에 저장된다. RAM은 컴퓨터 내에서 집적 회로나 칩(chips)의 형태로 존재한다. RAM은 휘발성(volatile)이 있으므로, 필요할 때마다 저장된 내용을 지우고 새로운 자료로 대치할 수 있다. 또한 RAM은 컴퓨터가 사용되는 동안에만 자료를 ‘기억하며’ 컴퓨터의 전원이 차단되면 모든 내용을 잃게 된다. 각각의 컴퓨터에는 서로 다른 일정량의 RAM이 설치되어 있다. 시스템에 설치되는 RAM은 대개의 경우 521KB, 640KB, 2MB, 4MB, 8MB와 같이 킬로 바이트(KB)나 메가 바이트(MB) 단위로 사용된다. 1킬로 바이트의 메모리는 1,024바이트로 구성된다. 그래서 640KB의 메모리를 가지고 있는 시스템은 실제로 640*1,024인 655,360바이트의 RAM을 가지는 것이다. 1메가 바이트는 1,024킬로 바이트이다. 4MB의 메모리를 가지는 시스템은 4,096, 즉 4,194,304바이트의 RAM을 가지는 셈이다. 바이트(byte)는 컴퓨터의 기억 장소에 대한 기본적인 단위이다. 나중에 ‘메모리 다루기’에서 상세히 설명하고, 여기에서는 특정 형태의 데이터를 저장하는 데 필요한 바이트의 양을 알아보겠다.


    ■ 데이터를 저장하는 데 필요한 메모리의 양

 

컴퓨터의 내의 RAM은 순서대로 다루어진다. 즉, 하나의 바이트는 다른 것 다음에 위치되고, 그 다음에는 또 다른 바이트가 위치되는 것이다. 메모리의 각 바이트는 독특한 주소(address)를 가지고 있으며, 주소는 메모리 내에서 특정 바이트를 다른 것과 구분하는 데 사용된다. 메모리의 주소는 0부터 시적하여 시스템에 설치된 메모리의 마지막까지 순서대로 주어진다. 프로그래머는 메모리에 주소를 할당하는 것에 대해서 염려할 필요가 없다. 주소를 할당하는 일은 모두 C컴파일러에 의해서 자동으로 처리된다. 컴퓨터의 RAM은 어디에 사용되는 것일까? RAM은 여러 가지 용도를 가질 수 있지만, 여기에서는 데이터를 저장하는 데 사용된다는 것만을 알아둘 필요가 있다. 데이터(data)는 C프로그램이 사용되는 특정 형태의 자료를 말한다. 사용자가 주소록을 관리하거나, 가계부를 정리하거나 또는 정육점에서 육류의 시세를 관리하는 등 어떤 목적을 가지고 있든지, 프로그램에서 사용되는 사람의 이름, 전화번호, 수입, 지출, 잔액, 육류의 가격 등과 같은 자료는 프로그램이 실행되는 동안 컴퓨터 내의 RAM에 저장된다. 지금까지 메모리에 대해 간단히 알아봤다. 이제는 C프로그래밍에 대한 내용으로 돌아가서, C가 자료를 저장하기 위해서 메모리를 사용하는 방법에 대해 알아보도록 하겠다


2. 변 수

 : 변수(varibles)는 컴퓨터의 메모리 내에서 독특한 이름을 가지고 있는 데이터 저장영역을 말한다. 변수의 이름을 프로그램 내에서 사용하면, 실제로 해당 메모리 영역에 저장된 데이터를 사용할 수 있게 된다.


2.1 변수의 이름

 : C프로그램 내에서 변수를 사용하려면, 우선 변수의 이름을 명명하는 방법을 알 필요가 있다. C에서 사용되는 변수의 이름은 다음과 같은 규칙이 따른다.

      - 변수의 이름은 문자, 숫자, 밑줄을 포함할 수 있다.

      - 변수의 이름에서 첫 번째 문자는 영문자(letter)가 되어야 한다. 또한, 밑줄을 

      - 첫 번째 문자로 사용할 수 있지만 가능하다면 사용하지 않는 것이 좋다.

      - 대문자나 소문자의 구분에는 중요한 차이가 있다. 그래서 count와 Count라는 두 개의 이름은 서로 다른 변수이다.

      - C의 키워드를 변수의 이름으로 사용할 수 없다. 키워드(keyword)는 C 언어의 일부분으로 사용되는 독특한 명령어를 말한다.


다음은 사용할 수 있거나 사용할 수 없는 변수 이름의 예이다.

 

C는 대문자와 소문자를 구별하므로, 세 개의 변수 이름 percent, PERCENT, Percent는 서로 다른 세 개의 변수를 뜻하는 것으로 간주된다. 반드시 필요하지는 않지만, C프로그래머들은 대개의 경우 소문자만을 사용하여 변수를 정의한다. C의 변수 이름은 대부분의 컴파일러에서 31까지의 길이를 가진다. 변수의 이름이 더욱 길어질 수 있지만, 컴파일러는 사용된 이름에서 처음 31자만을 받아들인다. 이런 특징을 이용하여 변수에 저장되는 데이터의 내용을 알 수 있도록 변수의 이름을 지정할 수 있다.
2.2 숫자 변수의 종류
 : C는 여러 가지 형태의 숫자 변수를 제공해준다. 서로 다른 숫자 변수는 서로 다른 양의 메모리 영역을 필요로 하고 특정 연산 동작을 수행하는 경우에도 변수에 따라 결과가 달라지므로 다양한 형태의 변수가 필요하다. 예를 들어, 1, 199, -8과 같은 작은 정수값을 저장하기 위해서는 적은 양의 메모리가 필요하고, 덧셈이나 곱셈과 같은 연산 동작도 더욱 빠르게 수행된다. 프로그래머는 프로그램을 작성할 때 적절한 변수의 형태를 선택하여 프로그램이 효과적 으로 실행되게 할 수 있다. C의 숫자 변수는 크게 다음과 같은 두 종류로 구분할 수 있다.

 - 정수형 변수(Integer variables)는 소수 부분이 전혀 없는 값을 저장한다. 즉, 음수와 양수만으로 구성되는 값을 가진다. 정수형 변수는 다시 두 가지로 나누어진다. 부호 있는 정수형 변수는 양수나 음수 값을 모두 저장할 수 있지만 부호 없는 변수에는 0과 양수값만을 저장할 수 있다.

 - 부동 소수형 변수(Floating-point variables)는 소수 부분을 가지는 숫자값을 저장하는 변수이다. 즉, 실수 값이 저장된다.

이러한 각각의 형태에는 여러 가지 특정 변수의 형태가 포함된다. 상세한 구분 내용은 <표 3.2>에 요약되어있다. 또한, 여기서 설명되는 내용은 16비트 데이터 구조를 가지고 있는 컴퓨터를 기본으로 하는 것이다. 표에 나타나 있는 메모리의 양은 바이트 단위이다.

<표 3.2> C의 숫자 변수 형태

 

<표 3.2>에 나타나 있는 대략적인 범위(approximate range)는 주어진 변수가 가질 수 있는 최대값과 최소값을 뜻한다. 이런 변수의 정확한 범위는 여기서 다루기에 복잡하므로 생략하겠다. 정밀도(precision)는 변수의 정확성을 말하는 것이다. 예를 들어, 1/3을 계산할 경우의 결과는 3이 무한 대로 계속되는 0.3333....이된다. 7의 정밀도를 가지는 변수에서 이 결과는 7자리까지의 값(0.3333333)을 저장하는 것이다.

<표 3.2>를 보면 int형과 short형이 동일하다는 것을 알 수 있을 것이다. 그렇다면 두 가지 다른 형태가 존재하는 이유는 무엇일까? 16비트의 IBM PC호환 기종에서는 int와 short가 동일한 것으로 처리되지만, 다른 하드웨어 기종에서는 달라질 수 있다. 예를 들어, VAX 시스템에서는 short와 int가 동일하지 않은 것으로 처리된다. short는 2바이트이지만 int는 4바이트를 사용하게 된다. C는 융통성과 이식성이 뛰어난 언어이므로, 두 가지 형태에 대해 다른 키워드를 제공한다는 것을 기억할 필요가 있다. 만약 PC 호환 기종에서 C언어를 사용한다면, int와 short를 상호 교환하며 사용할 수 있을 것이다. 정수형 변수를 부호 있는 형태로 지정하기 위해서는 아무런 키워드도 필요하지 않다. 정수형 변수는 이미 부호가 있는 형태로 설정되어 있다. 그러나 필요하다면 분명하게 지정하기 위해서 signed 키워드를 포함시킬 수 있다. <표 3.2>에 나타나 있는 키워드는 잠시 후에 변수 선언을 설명할 때 사용할 것이다. <리스트 3.1>의 프로그램은 특정 컴퓨터 상에서 변수의 크기를 확인할 수 있도록 도와줄 것이다. 프로그램의 결과가 리스트 다음에 있는 결과와 다르더라도 놀랄 필요는 없다.


<리스트 3.1> 여러 가지 형태의 변수 크기를 출력하는 프로그램 

 -> 출력

           A char            is 1 bytes
           A int              is 2 bytes
           A short           is 2 bytes
           A long            is 4 bytes
           An unsigned char  is 1 bytes
           An unsigned int    is 2 bytes
           An unsigned short is 2 bytes
           An unsigned long  is 4 bytes
           A float           is 4 bytes
           A double          is 8 bytes
  

2.3 변수의 선언
 : C 프로그램에서 변수를 사용하기 위해서는 변수를 선언해야 한다. 변수의 선언 (variable declaration)은 컴파일러에게 변수의 이름과 형태를 알려주며, 선택적으로 변수에 특정 값을 저장하여 초기화하는 것도 가능하다. 만약 프로그램에서 이전에 선언되지 않은 변수를 사용하려고 한다면, 컴파일러는 에러 메시지를 출력할 것이다. 변수의 선언은 다음과 같은 형식으로 수행된다.
             typename      varname;

typename은 변수의 형태로, <표 3.2>에 나타나 있는 키워드의 하나가 사용된다. 변수의 이름인 varname은 앞에서 설명했던 변수 이름의 규칙을 따르는 것이어야 한다. 쉼표로 각 변수의 이름을 구분하여 한 줄에 동일한 형태의 여러 변수를 선언할 수도 있다.

             int count, number, start;
             float percent, total;


2.4 typedef 키워드
 : typedef 키워드는 이미 존재하는 데이터 형에 새로운 이름을 지정하는데 사용된다. 즉, typedef는 특정변수형의 동의어를 정의한다. 예를 들어, 다음 문장은

             typedef int   integer;

int형에 대한 동의어로 integer라는 변수형을 정의한다. 이제 int형 변수를 정의하기 위해서 다음 예제와 같이 integer를 사용할 수 있을 것이다.

             Integer count;

typedef는 새로운 데이터형을 생성하는 것이 아니라 이미 존재하는 데이터형에 대한 다른 이름을 정의한다는 것에 주의하기 바란다.
  

2.5 숫자 변수의 초기화 
 : 변수를 선언하는 것은 컴파일러에게 변수를 위한 저장 영역을 보존하도록 지시하는 것이다. 그러나 보존된 공간에 저장되는 변수의 실제 값은 정의되지 않는다. 실제 값은 0이 될 수도 있고 다른 어떤 ‘임의의’ 값이 될 수도 있다. 그래서 변수를 사용하기 전에는 항상 원하는 값으로 초기화해야 한다. 변수의 초기화는 다음과 같이 할당문을 사용하여 변수 선언문과 별도로 수행할 수 있다.

             Int count;
             Count = 0;    ‘ count를 0으로 초기화

또한, 변수를 선언할 때 직접 초기화할 수도 있다. 이렇게 하려면 변수 선언문에서 변수의 이름을 입력한 다음에 등호(=)와 함께 원하는 초기값을 지정하면 된다.

             Int count = 0;
             Double percent = 0.01, taxrate = 28.5;

      변수를 초기화 할 때에는 허용되는 범위를 벗어난 값을 사용하지 않도록 주의하기 바란다. 다음은 범위를 벗어난 값이 사용되는 초기화의 예이다.

             Int weight = 100000;
             Unsigned int value = -2500;

      C 컴파일러는 이런 에러를 찾아주지 않는다. 프로그램은 이상 없이 컴파일되고 링크 되지만, 실제로 실행하면 예상하지 못한 결과를 얻는다.
 
3. 상 수
 : 상수(constant)는 변수와 마찬가지로 프로그램에서 사용되는 데이터를 저장하는 메모리 영역이다. 그러나 변수와는 달리, 상수로 지정되는 값은 프로그램이 실행되는 동안 바뀌지 않는다. C는 각각 독특한 용도를 가지고 있는 두 가지 형태의 상수를  제공한다.
 

3.1 실제 상수
 : 실제 상수(literal constant)는 필요할 때마다 소스 코드에 직접 포함되는 실제 값이다. 다음은 실제 상수의 사용 예이다.

            Int count = 20;
            Float tax_rate = 0.28;

      20과 0.28은 실제 상수이다. 예제에서는 이런 갓을 변수 count와 tax_rate에 저장하고 있다. 두 변째 예제에서는 소수점이 사용되는 반면에, 처음 예제에서는 소수점이 사용되지 않고 있다. 소수점은 부동소수형 상수와 정수형 상수를 구분하는 기준이 된다. 소수점이 포함되어 있는 상수는 부동 소수형 상수(floating-point constant)이며, C 컴파일러에서 배정도형 숫자로 취급된다. 부동 소수형 상수는 다음의 예제에서처럼 일반적인 십 진 표기법으로 사용될 수 있다.

            123.456
            0.019
            100.

      세 번째 예제의 상수 100.은 소수 부분을 가지고 있지 않은 정수이지만 소수점을 포함하고 있다. 소수점은 C컴파일러가 상수를 배정도형으로 취급하게 해준다. 소수점이 없는 경우에는 일반적으로 정수형 상수로 취급한다. 또한, 부동 소수형 상수는 공학 표기법(scientific notation)으로 사용될 수 있다. 공학 표기법에서는 숫자를 10의 제곱 형태로 표시한다. 공학 표기법은 아주 크거나 작은 값을 나타내는 데 유용하다. C에서는 공학 표기법을 십진수, 문자 E나e, 제곱수의 형태로 사용한다. 다음은 몇 가지 예이다.

       - 1.23E2  : 1.23의 기본 값에 10을 2번 곱한 123
       - 4.08e6  : 4.08의 기본 값에 10을 6번 곱한 4,080,000
       - 0.85e-4 : 0.85의 기본 값에 1/10을 4번 곱한 0.000085
         
소수점이 없는 상수는 컴파일러에서 정수형 숫자로 처리된다. 정수형 상수는 다음과 같이 여러 가지 방법으로 표현할 수 있다.

- 0이 아닌 다른 어떤 숫자로 시작하는 상수는 십 진(decimal) 정수로 처리된다. 십 진 정수는 10을 기본으로 하는 십진수 체계를 말한다. 십 진 상수는 숫자 0에서부터 9까지를 사용하며, 숫자 앞에 +나 ?와 같은 부호를 가질 수 있다. 부호가 없을 때 상수는 양수 값으로 간주된다.

- 숫자 0으로 시작하는 상수는 8진(octal) 정수로 처리된다. 8진 정수는 8을 기본으로 하는 8진수 체계를 말한다. 8진 상수는 숫자 0에서부터 7까지를 사용하며, 숫자 앞에 +나 ?와 같은 부호를 가질 수 있다.

- 0x나 0X로 시작하는 상수는 16진(hexadecimal) 정수로 처리된다. 16진 정수는 16을 기본으로 하는 16진수 체계를 말한다. 16진수 상수는 숫자 0에서부터 9까지와 문자 A~F까지를 사용하며, 숫자 앞에 +나 ?와 같은 부호를 가질 수 있다.

3.2 기호 상수
 : 기호 상수(symbolic constant)는 프로그램 내에서 독특한 이름이나 기호로 표현되는 상수를 말한다. 실제 상수와 마찬가지로 기호 상수의 내용은 변경될 수 없다. 프로그램 내에서 상수의 값을 사용할 필요가 있을 때마다 기호 상수의 이름을 변수의 이름처럼 사용할 수 있다. 기호 상수의 실제 값은 상수를 처음 정의할 때에만 입력해주면 된다. 다음의 예제에서도 알 수 있듯이, 기호 상수는 실제 상수에 비해서 두 가지 중요한 장점을 제공한다. 여러 가지 기하학적인 계산을 수행하는 프로그램을 작성한다고 가정하자. 프로그램은 연산을 수행하기 위해서 π(3.14159)를 자주 사용하게 된다. 참고로, π는 원의 지름에 대한 원주의 비율이다. 예를 들어, radius라는 반지름을 가지는 원의 원주와 면적을 계산하기 위해서는 다음과 같은 프로그램을 작성할 수 있을 것이다.

             Circumference = 3.14159 * (2 * radius);
             Area = 3.14159 * (radius) * (radius)

여기서 사용된 *는 C에서 곱셈 연산자로 사용된다. 첫 번째 문장은 ‘변수 radius에 저장된 값에 2를 곱하고 나서 그 결과에 3.14159를 곱한다. 그리고 계산된 최종 결과를 circumference라는 이름의 변수에 저장한다. 그러나, PI라는 이름을 가지고 3.14라는 값을 저장하는 기호 상수를 정의하면 앞의 예제를 다음과 같이 작성할 수 있다.

             Circumference = PI * (2 * radius); 
             Area = PI * (radius) * (radius);

      이것은 더욱 이해하기가 쉽다. 3.14라는 값이 왜 사용되었는지 의문을 가졌던 사람도 상수 PI를 보고 프로그램의 내용을 더욱 명확히 알 수 있을 것이다. 기호 상수의 다른 한 가지 장점은 상수의 값을 변경할 필요가 있을 때 더욱 중요한 것이다. 앞에서 사용된 예제를 다시 살펴보자. 계산 결과를 더욱 정확하게 하게 하기 위해서 3.14라는 값 대신에 더욱 정확하게 3.14159의 값을 사용하기 원한다고 하자. 만약 π의 값을 실제 상수의 형태로 입력했다면, 프로그래머는 전체 프로그램에서 3.14를 3.14159로 변경해야 할 것이다. 그러나 기호 상수를 사용했다면 단지 상수가 정의된 부분에서만 값을 변경해주면 된다. C는 기호 상수를 정의하기 위한 두 가지 방법으로 #define 지시어와 const 키워드를 제공한다.
#define 지시어는 다음과 같이 사용된다.

             #define CONSTNAME literal

이 문장은 literal이라는 값을 가지는 CONSTNAME라는 이름의 기호 상수를 정의한다. literal은 앞에서 설명했듯이 실제 상수를 나타낸다. CONSTNAME은 변수의 이름에 대해서 설명했던 것과 같은 규칙을 따른다. 일반적으로, 기호 상수의 이름에는 대문자가 사용된다. 이런 특징은 소문자를 주로 사용하는 변수의 이름과 분명하게 구분할 수 있도록 해준다. 앞에서 사용된 예제에서 필요한 #define 지시어는 다음과 같은 내용이 될 것이다.

             #define PI 3.14159

#define문은 세미콜론(;)으로 끝나지 않는다는 것을 기억하기 바람. #define은 소스 코드 내의 어느 위치에서든 사용할 수 있지만, 실제로는 #define 지시어 다음에 있는 코드에만 영향을 준다. 대부분의 프로그래머는 모든 #define문을 파일의 시작 부분과 main() 함수의 시작 사이에 위치시킨다.

▶ #define의 적용 범위
 : #define 지시어가 실제로 수행하는 것은 컴퓨터에게 ‘소스 코드 내의 CONSTNAME을 literal로 대치하여 사용하라’는 것을 지시하는 것이다. 결과는 에디터에서 소스 코드를 입력하고 수동으로 직접 변경하는 것과 동일하다. #define은 큰 따옴표 내의 문장에서 일부분으로 나타나는 것이나 또는 프로그램 주석문의 내부에서 사용되는 내용을 대치하지 않는다는 것을 기억하기 바란다. 예를 들어, 다음 코드에서 두 번째 줄과 세 번째 줄의 PI는 바뀌지 않을 것이다.

             #define PI 3.14159
             #define PIPETTE 100

▶ const 키워드로 상수 정의하기
 : 기호 상수를 정의하는 다른 한 가지 방법은 const 키워드를 사용하는 것이다. const는 어떤 변수 선언에도 사용할 수 있는 키워드이다. const를 사용하여 선언한 변수는 프로그램이 실행되는 동안 변경할 수 없고, 단지 변수를 초기화하는 것만 가능하다. 다음은 몇 가지 예이다.

             Const int   count = 100;
             Const long debt = 12000000, float tax_rate = 0.21;

const는 선언문에 포함되어 있는 모든 변수에 영향을 준다. 두 번째 중에 있는 debt와 tax_rate는 기호 상수이다. 만약 프로그램에서 const로 선언된 변수의 값을 변경하려고 한다면, 컴파일러는 에러 메시지를 나타낼 것다. 예를 들어, 다음과 같은 결과가 나타난다.

             Const int count = 100;
             Count = 200;   ‘ 이것은 컴파일되지 않는다. 
          상수형으로 정의된 변수의 값을 변경하지 않도록 주의해야 한다.

#define 지시어로 생성되는 기호 상수와 const키워드를 통해서 정의되는 기호 상수의 차이점은 무엇일까? 차이점은 포인터와 변수의 범위에 관련된 것이다. 포인터와 변수의 범위는 C 프로그래밍에서 중요한 두 가지 사항으로 "포인터에 대해서"와 "변수의 범위"에서 상세히 설명할 것이다.  이제 변수를 선언하고 실제 상수와 기호 상수를 사용하는 프로그램의 예제를 살펴보도록 하겠다. <리스트 3.2>에있는 프로그램은 사용자에게 파운드 단위의 몸무게와 생일을 입력하도록 요구할 것이다. 그리고 나서 몸무게를 그램(g)단위로 환산하고, 2002년에는 나이가 어떻게 되는지 계산하여 결과를 출력한다.

<리스트 3.2> 변수화 상수의 사용 예를 보여주는 프로그램

 

-> 입력 / 출력

          Enter your weight in pounds: 175

          Enter your year of birth: 1975

 

          Your weight in grams = 79450

          In 2002 you will be 27 years old

'pc관련 > C언어' 카테고리의 다른 글

숫자배열 사용하기  (0) 2019.03.20
C언어-프로그램제어문  (0) 2019.03.17
함수의 기본  (0) 2019.03.16
C 프로그램의 구성 요소  (0) 2019.03.10
c프로그램밍 기초  (0) 2019.03.09
Posted by 둥이파파^^
etc.2019. 3. 10. 22:31

슈퍼푸드는 인체 노화 분야의 세계적 권위자인 스티븐 프랫 박사가 2004년에 쓴 ‘난 슈퍼푸드를 먹는다’라는 책의 제목에서 유래된 단어입니다. 슈퍼푸드의 종류와 범위는 명확하게 정해져 있지는 않으나, 열량과 지방함량이 낮고 비타민, 무기질, 항산화 영양소, 섬유소를 포함한 생리활성물질인 "파이토케미컬"을 함유하고 있는 식품들을 의미합니다. 2002년 미국의 <타임>지에서 선정한 세계 10대 슈퍼푸드는 귀리, 블루베리, 녹차, 마늘, 연어, 브로콜리, 아몬드, 적포도주, 시금치, 토마토가 있는데요. 이러한 식품은 심혈관 질환, 고혈압, 당뇨 등의 만성질환과 암 발생을 예방하는데 도움을 주고, 면역력을 강화시키는 등 건강한 몸을 유지하는데 도움이 되는 약과 같은 좋은 식품입니다.

■ 콜레스테롤 쭉쭉 내리는 심장건강 파수꾼, 귀리

귀리는 6종 아미노산을 골고루 함유해 근육형성과 신진대사에 중요한 역할을 합니다. 귀리에 풍부한 불포화지방산과 리놀렌산은 심장순환계 질환을 예방하고 혈액 속의 콜레스테롤을 낮추어줍니다. 양질의 지방산 이외에도 귀리에 풍부한 수용성 식이섬유소인 ‘베타-글루칸’은 콜레스테롤 수치를 낮추어 심장병, 당뇨병 환자에게 도움을 줍니다. 오트밀의 혈당지수(GI)는 다른 곡류에 비해 낮은 편으로 탄수화물이 체내에서 당으로 바뀌어 피로 들어가는 속도가 느리기 때문에 인슐린 분비가 적어 다이어트에 도움이 되고 변비 예방식품으로도 좋습니다.

■ 청춘을 되돌리는 검푸른색의 보석, 블루베리

신이 내린 보랏빛 선물이라 불리는 블루베리는 질병과 노화를 일으키는 유해한 활성산소를 중화시키는 역할을 하는 보라색 수용성 색소인 ‘안토시아닌’이 풍부합니다. 안토시아닌은 동맥 혈관에 침전물 생성을 방지함으로써 심장병과 뇌졸중을 방지하고, 시력에 관여하는 ‘로돕신’이라는 색소체의 재합성을 활성화하여 시력보호에도 효과가 있습니다. 뿐만 아니라 비타민 C, 비타민 E 등 천연 항산화 성분이 풍부해 지방의 연소를 돕고 면역력을 증진시키며 콜레스테롤을 감소시켜 복부비만에 좋은 식품입니다. 또한 풍부하게 들어있는 칼륨은 체내 나트륨의 양을 조절해줍니다.

■ 녹차

녹차 특유의 쌉싸름한 맛을 나타내는 ‘카테킨’이라 불리는 탄닌 성분은 몸속의 유해 활성산소를 제거하는 항산화 효과가 비타민 E의 50배, 비타민 C보다 100배가 높습니다. 카테킨은 위암, 폐암 등을 예방하고 콜레스테롤 흡수를 저해하여 체내 지질 축적을 방지합니다. 또한 혈압을 낮추고 심장을 강화하고 감기 바이러스의 활동을 저지시킴으로써 면역력 향상에도 도움이 됩니다. 녹차의 또 다른 성분 중 아미노산의 일종인 ‘테아닌’은 몸과 마음을 이완시키고 혈압을 낮추며 학습능력과 집중력을 높여줍니다.

■ 면역력 쑥쑥~ 세균 무찌르는 매운 향기, 마늘

마늘의 향 성분인 ‘알리신’은 비타민 B1의 흡수율을 높여 피로회복, 스태미나 향상에 도움이 됩니다. 강력한 살균, 항균 작용도 뛰어나 식중독균과 위궤양을 유발하는 헬리코박터 파일로리균을 죽이는 역할을 합니다. 뿐만 아니라 몸 속에 유해 물질인 활성산소를 제거하는 항산화 기능이 있어 면역력을 증진시키고 질병에 강한 몸을 만들어주며 동맥경화와 심장질환을 예방합니다. 알리신 외에도 유황 화합물질은 간암, 대장암 등을 예방에 도움이 되는데 미국의 한 연구 결과에 따르면 하루에 마늘 반쪽을 지속적으로 섭취했을 때 위암 발생 위험도가 50%, 대장암은 30%로 감소한다는 보고도 있습니다.

■ 붉을수록, 익힐수록, 세포에 생기를 불어넣는 토마토

토마토에는 생리 활성 물질과 비타민 C, 비타민 K 등이 풍부하고, 빨간색을 나타내는 ‘라이코펜’은 동맥경화를 유발하는 나쁜 콜레스테롤(LDL-콜레스테롤)이 혈액에 과잉으로 축적되는 것을 방지하고 혈관을 부드럽게 하여 혈류를 개선하고 심혈관 질환을 예방합니다. 또한 토마토의 칼륨은 몸 속의 염분을 몸 밖으로 배출시켜 우리나라 사람들의 짜게 먹는 식습관으로 인한 고혈압 예방에 도움이 되고 ‘루틴’은 혈관을 튼튼하게 하고 혈압을 낮춰주어 고혈압 환자에게 도움이 됩니다.

■ 비타민C 덩어리로 만드는 반짝반짝 빛나는 얼굴, 브로콜리

브로콜리에는 비타민 C가 풍부해서 하루 100g을 먹으면 하루에 필요한 비타민 C를 대부분 섭취할 수 있습니다. 비타민 C는 기미와 주근깨에 좋아 아름다운 피부를 원하는 사람에게 좋은 식품입니다. 이렇게 비타민 C가 풍부한 브로콜리를 비타민 E가 풍부한 아몬드와 함께 먹으면 두뇌발달에 도움이 되고, 오렌지와 함께 먹으면 비타민 C가 강화되어 질병에 대한 저항력 또한 높아집니다. 뿐만 아니라 브로콜리를 매일 적정량 먹으면 위암, 폐암, 대장암, 유방암, 자궁암 등의 발병 위험을 감소시키는 것으로 보고되고 있습니다.

■ 항산화 비타민으로 건강 잡는 고소한 비결, 아몬드

아몬드는 항산화 물질인 비타민 E와 셀레늄의 주요 공급원입니다. 비타민 E는 알츠하이머병(치매) 예방에 도움을 주고, 뇌세포의 노폐물을 제거해 세포를 활성화시키는 강력한 항산화 물질로 뇌 건강 영양소로 주목받고 있습니다. 셀레늄은 체내에서 생성된 과산화수소를 분해하여 세포의 손상을 억제하는 항산화기능을 합니다. 아몬드에 풍부한 섬유소는 배변활동을 순조롭게 도와주고 지방 흡수를 방해하여 다이어트에 좋은 식품입니다. 하지만 견과류는 식물성지방이므로 과량으로 섭취하면 열량이 높으므로 빵, 과자 등 다른 고열량 간식을 피해야 다이어트에 도움이 됩니다.

■ 육류를 건강하게 즐기기 위한 신비의 과일주, 적포도주

적포도주의 떫은 맛을 나타내는 ‘카테킨’은 포도주 저장 중에 만들어지고 항산화 작용을 합니다. 적포도주에는 좋은 콜레스테롤(HDL-콜레스테롤)을 체내에 증가시키는 폴리페놀 물질이 백포도주의 약 10배가 들어있습니다. 폴리페놀은 심장질환, 뇌 질환, 암의 예방에 도움이 되고 혈압을 내리고 긴장감을 없애며 스트레스 해소에도 도움이 됩니다. ‘프렌치패러독스’라는 말이 있듯이 프랑스의 사람들은 고포화지방식이(육류, 치즈, 버터 등)를 하지만 심장질환 발병이 낮게 나타납니다. 이는 적포도주의 폴리페놀이 혈관의 산화를 방지해 혈관 건강을 지켜주는 것입니다.

■ 튼튼하고 뼈대 있는 초록 채소의 왕, 시금치

시금치는 베타카로틴을 풍부하게 함유하는 녹황색 채소의 대표 식품으로 비타민 B, C, 철분, 칼슘 등이 풍부해 허약체질이나 임산부, 어린이에게 추천하는 식품입니다. 베타카로틴은 항산화 작용을 하여 동맥경화, 폐암을 예방하고, 기름과 함께 섭취할 때 체내 흡수율이 좋아집니다. 잎 부분에 풍부한 비타민 C는 감기예방 및 피로회복에 도움이 됩니다. 뿌리의 붉은 부분에는 조혈성분인 구리와 망간이 풍부합니다. 시금치를 오랜 기간에 걸쳐 과잉으로 먹으면 수산으로 인한 신장, 방광에 결석이 생길 위험이 있으므로 많이 섭취하는 사람은 하루에 500g 이상 먹지 않도록 주의합니다.

■ 활기찬 붉은 빛, 안티에이징 생선, 연어

슈퍼푸드 중 유일한 동물성 식품인 연어는 혈관 건강을 지켜주는 불포화지방산인 오메가-3 지방산(DHA, EPA)을 함유하고 있습니다. 오메가-3 지방산은 연어뿐만 아니라 참치, 고등어, 꽁치 등의 등푸른 생선에도 풍부하게 들어있으나 연어가 요리하기 쉽고 통조림으로도 쉽게 구할 수 있어 슈퍼푸드로 선정되었습니다. 연어는 주 2회 섭취 시 고혈압, 동맥경화, 뇌졸중 등의 혈관 질환을 낮출 수 있습니다. 연어에는 골다공증을 예방하는 비타민 D와 강력한 항산화 성분 물질인 ‘아스타잔틴’이라는 붉은 색소 성분을 함유하고 있습니다.

 

 

'etc.' 카테고리의 다른 글

재미있는 심리학 지식에 대해~~  (0) 2019.04.16
많이쓰는 영어문장  (0) 2019.04.03
생활영어표현  (0) 2019.03.25
영어표현500문장  (0) 2019.03.17
다시마에 효능  (0) 2019.03.10
Posted by 둥이파파^^
etc.2019. 3. 10. 20:58

▶콜레스테롤 수치와 혈압을 내린다
다시마 속의 알긴산이라는 식이섬유는 콜레스테롤 수치와 혈압을 내리는 데 효과가 있다. 다시마의 미끈거리는 성분이 바로 알긴산인데 이 성분은 장 속에서 콜레스테롤, 염분 등과 결합해 변과 함께 배설된다. 또한 혈전이 생기거나 간장에서 콜레스테롤이 합성되는 것을 막는 등 고혈압과 동맥경화를 예방하는 효과가 있다.

당뇨를 예방한다
다시마는 칼로리가 거의 없어 당뇨 환자에게 특히 좋은 식품. 다시마의 식이섬유는 포도당이 혈액 속에 침투하는 것을 지연시키고 당질의 소화 흡수를 도와 혈당치를 내린다. 다시마는 다양한 미네랄이 풍부하게 들어 있어 알칼리성 식품으로도 손꼽힌다.

갑상선 질환을 예방한다
목 부위에 있는 갑상선에서 분비되는 갑상선호르몬이 부족하면 신진대사가 둔해져 기운이 없고 노화가 빠르게 진행된다. 다시마에는 갑상선호르몬의 중요한 성분인 요오드가 많이 들어 있어 갑상선 질환을 예방한다. 단, 요오드는 결핵균을 흩어지게 하므로 결핵 환자는 주의해야 한다.

변비를 없앤다
알긴산은 다른 식이섬유와 같이 몸 속에서 흡수되지 않고 장으로 보내진다. 소화되지 않은 알긴산은 장을 자극해 장운동을 촉진, 배변을 돕는다. 다시마를 먹을 때는 물을 많이 마시는 게 좋다. 알긴산은 몸 속에서 수분을 흡수해 최대 200배까지 팽창하는데 장은 내용물이 많을수록 활발하게 움직이기 때문.

대장암을 예방한다
다시마 속의 알긴산은 변비를 없애는 동시에 대장암을 예방한다. 소화되지 않은 채 대장으로 보내진 알긴산이 변 속에 섞이면서 변의 양이 늘어나게 되고, 변의 양이 늘면 먹은 식품에 들어 있거나 장 속에서 만들어진 발암물질의 농도가 묽어진다. 또한 알긴산이 발암물질을 흡착해 장막을 자극하지 않고 배설시키므로 대장암이나 직장암을 예방하는 것이다.

피부를 매끄럽게 한다
피부에 좋은 비타민C와 E가 풍부하게 들어 있는 다시마는 피부를 윤기 있고 탄력 있게 할 뿐 아니라 노화를 예방한다. 또한 나이가 들면서 피부를 지저분하게 만드는 기미나 주근깨, 노인성 반점 등의 잡티가 생기는 것을 막는다.

'etc.' 카테고리의 다른 글

재미있는 심리학 지식에 대해~~  (0) 2019.04.16
많이쓰는 영어문장  (0) 2019.04.03
생활영어표현  (0) 2019.03.25
영어표현500문장  (0) 2019.03.17
세계 10대 슈퍼푸드  (0) 2019.03.10
Posted by 둥이파파^^
pc관련/C언어2019. 3. 10. 20:41

main() 함수

  : 모든 C 프로그램에서 반드시 필요한 한 가지 구성 요소는 main() 함수이다. 가장 간단한 형식으로 사용될 경우 main() 함수는 main이라는 함수의 이름과 한 쌍의 괄호인 {, } 만으로 구성된다. 괄호 내에는 프로그램의 몸체를 구성하는 문장들이 포함된다. 일반적인 경우에, 프로그램은 main() 내의 첫번째 문장에서 시작하여 마지막 문장까지 실행된 후에 종료된다. 


#include 지시어

  : #include 지시어는 컴파일 과정에서 프로그램에 필요한 include 파일의 내용을 추가하도록 C 컴파일러에게 지시한다. Include 파일은 컴파일러가 실행될 때 필요한 자료를 저장하고 있는 디스크 상의 독립 된 파일이다. 이것은 헤더 파일(Header file)이라고도 하며, 컴파일러 와 함께 여러 개의 파일이 제공된다. Include 파일의 내용은 수정할 필요가 없기 때문에 소스코드와 별도로 관리된다. 또한 include 파일은 .H의 확장자를 사용해야 한다. 예를 들어, stdio.h와 같은 것이 있다. 



변수 정의문

  : 변수(variable)는 데이터가 저장되는 영역에 주어지는 이름이다. 프로그램이 실행되는 동안, 여러 가지 종류의 데이터를 저장하기 위해서 변수를 사용하게 된다. C에서는 변수를 사용하기 전에 정의해야 한다. 변수 정의문(variable definition)은 변수의 이름과 데이터 형을 컴파일러에게 알려주기 위해서 사용된다. 예를 들어, int a, b, c;등이 있다. 



함수 원형

  : 함수 원형(function prototype)은 프로그램내에 포함되어 있는 함수의 이름과 인수를 C 컴파일러에게 알려주는 것으로, 함수가 사용되기 전에 선언되어야 한다.

프로그램 문장

  : C프로그램은 실제로 문장(statements)에 의해 필요한 동작을 수행 한다. C의 프로그램 문장은 화면으로 결과를 출력하고, 키보드에서 입력을 받아들이고, 연산 동작을 수행하고, 함수를 호출하고, 디스크 파일을 읽어들이고, 그밖게 프로그램에서 요구되는 다른 여러 가지 동작을 수행한다. 



printf()

  : printf()문은 화면 상에 메시지나 결과를 출력하는 라이브러리 함수다. 



scanf()

  : scanf()문은 또 하나의 라이브러리 함수이다. 이 함수는 키보드에서 데이터를 읽어들이고, 하나 이상의 프로그램 변수에 저장한다. 



return

  : return문은 결과값을 돌려준다.

함수 정의 : 함수(function)는 특별한 동작을 수행하기 위해서 사용되는 독립적인 프로그램 문장의 집합으로, 내부에 독립된 프로그램 문장을 포함하고 있다. 모든 함수는 독특한 이름을 가지고 있으며, 각 함수 내에 포함 되어 있는 코드는 프로그램에서 해당 함수의 이름을 사용함으로써 실행할 수 있다. 이런 동작을 ‘함수 호출(calling)’이라고 한다. 



프로그램의 주석문

  : 프로그램 내에서 /*로 시작하고 */로 끝나는 문장을 주석문(comment)이라고 한다. 컴파일러는 주석문의 내용을 완전히 무시하므로 주석문은 프로그램의 동작 상태에 아무런 영향을 주지 않는다. 그러나 여러 개의 주석 문을 종속된 상태로 사용해서는 안된다. 즉, 하나의 주석 문을 다른 주석문 내에 포함시키면 안된다. 



괄호

  : main() 함수를 포함하여 C의 함수를 구성하는 모든 프로그램 문장을 구분하기 위해서는 괄호( {, } )를 사용한다. 괄호 내에 집단적으로 포함된 한 줄 이상의 문장을 블록(block)이라고 한다. 



참고 

-프로그램의 소스 코드에 많은 주석 문을 포함시키자. 특히, 나중에 소스 코드를 변경할 필요가 있는 사람이 함수나 프로그램 문장의 내용을 잘 이해할 수 없을 것이라고 생각되는 부분을 중심으로 해서 자세한 주석 문을 입력하자. 내용을 분명하게 알 수 있는 부분에 불필요한 주석 문을 추가하지 말자. 예를 들어, 다음과 같은 주석문은

/*다음 문장은 화면에 ‘Hello World!’를 출력한다. */ printf(“Hello World!); 

프로그래머가 printf() 함수의 사용에 익숙해지게 되면 불필요한 내용이 된다. 


-주석 문을 적절히 사용하기 위한 연습을 하자. 주석문이 없거나 또는 애매하게 포함된 프로그램은 이해하기 힘들고, 너무 많은 주석 문을 포함시키는 것도 프로그래밍보다 주석문의 추가에 더 많은 시간을 소모하게 한다.

'pc관련 > C언어' 카테고리의 다른 글

숫자배열 사용하기  (0) 2019.03.20
C언어-프로그램제어문  (0) 2019.03.17
함수의 기본  (0) 2019.03.16
데이터 저장하기 : 변수와 상수  (0) 2019.03.11
c프로그램밍 기초  (0) 2019.03.09
Posted by 둥이파파^^