본문 바로가기

Lobo's study room/[혼공단]c언어스터디

[3주차]혼공 용어노트 정리

*모르는 용어 위주로 노트 내용 정리

#숏 서킷 룰

 

좌항만으로 &&와 || 연산 결괄르 판별하는 기능으로 

&&연산자는 좌항이 거짓이면 우항과 관계없이 결과는 거짓이므로 우항을 살펴볼 필요가 없다.

||연산자는 좌항이 참이면 우항과 관계없이 결과가 참이다.

 

따라서 &&연산때 좌항이 거짓이거나, ||연산때 좌항이 참이라면 우항은 아예 실행되지 않는다.

 

#ALU

CPU의 연산장치.

레지스터 - CPU의 저장장치

#로드

연산을 하기 위해 메모리에 있는 값을 CPU의 저장 공간인 레지스터에 복사하는 것으로 연산 명령 이전에 수행된다.

데이터가 레지스터에 저장되면 연산장치인 ALU에 의해 덧셈 연산이 수행되고 그 결괏값은 일단 레지스터에 저장된다.

 

#스토어

대입연산을 수행하면 메모리 공간에 복사되어 수식의 모든 과정이 완료된다.

 

연산할때는 메모리에 있는 변수의 값을 CPU로 복사해서 사용하므로 아무리 많은 연산을 수행해도 연산자 a, b의 값은 변하지 않지만

대입 연산을 수행한 후에는 연산장치 ALU에서 어떤 연산이 수행되느냐에 따라 값이 변할 수 있다.

 

#매달린 else 문제

매달린 else. 즉 Dangling else problem이라고도 한다.

if문을 중첩할때 뒤따르는 else의 위치가 모호해지면서 생기는 문제로

중괄호의 사용여부에 따라 전혀 다른 프로그램이 되므로 반드시 중괄호를 써서 구문구분을 철저히 하자.

 

#분할정복기법

재귀에 기반하여 큰 문제를 작게 쪼개 해결하여 결괄르 취합하는 문제 해결기법.

비교 항목이 많은 경우 여러 번 중첩해서 쓰면 실행 시간을 줄이는 데 도움이 된다.

선행조건이 필요하다고 오해할 수 있으며 코드가 읽기 어려워지므로 주의해서 사용하자.

 

#재귀호출함수

자기 자신을 호출하는 함수

함수가 모든 명령을 수행하면 자동으로 반환하는데 반환 전에 자신을 호출하므로 처음부터 다시 시작

재귀호출함수는 최초 호출한 곳이 아니라 이전에 호출했던 곳으로 돌아간다.

재귀호출은 실제로는 새로운 함수를 실행하는 것과 같다.

경우에 따라 복잡한 반복문을 간단히 표현할 수 있으나 코드 읽기가 쉽지 않고 반복 호출되면서 메모리를 사용하므로

제한적으로 사용하는 것이 좋다.

 

#gets함수

공백이나 탭 문자를 입력할 때 사용되는 gets함수

중간의 공백이나 탭 문자를 포함하여 문자열 한 줄을 입력합니다.

입력한 문자열을 포인터 연산으로 배열에 저장합니다.

배열의 크기보다 큰 문자열을 입력하면 배열에 할당된 메모리 공간을 벗어나 저장하므로 주의해야 합니다.

gets 함수는 문자열의 일부로 입력하므로 문자열 입력없이 바로 enter만 눌러도 입력을 끝냅니다.

이때 배열의 첫 번째 요소에는 개행문자대신 널 문자를 이용합니다.

 

#기억 부류

기억 부류는 변수를 사용 범위와 메모리에서의 존재 기간에 따라 나눈 것.

지역 변수도 기억 부류 중 하나인데 지역 변수의 경우 변수의 특성 중에 사용범위를 강조한 것입니다.

 

#동적할당

동적 할당은 프로그램 실행 중에 저장 공간을 할당한 것으로 주로 코드 실행 중에 배열을 저장할 값의 개수가 결정되는 경우에 사용됩니다.

프로그램 실행 중에 저장 공간을 할당하는 것을 동적할당이라고 합니다.

이렇게 사용한 저장 공간은 다시 실행 중에 재활용을 위해 반납해야 합니다.

프로그램 실행중에 메모리를 동적할당할때는 malloc함수를, 반환할때는 free함수를 사용합니다.

이 함수들을 사용할 때는 stdlib.h 파일을 인클루드해야 사용할 수 있습니다.

malloc함수는 주어진 인수의 바이트 크기만큼 메모리에서 연속된 저장 공간을 할당 한 후에 그 시작 주소를 반환합니다.

-malloc 함수의 반환값이 널 포인터인지 반드시 확인하고 사용한다.

-사용이 끝난 저장 공간은 재활용 할 수 있도록 반환해준다.

 

#패딩바이트와 바이트 얼라이먼트

모든 시스템은 데이터를 빠르게 읽고 쓰기 위해 일정한 크기 단위로 메모리에 접근합니다.

따라서 컴파일러는 구조체 멤버의 크기가 들쑥날쑥한 경우 멤버 사이에 패딩 바이트를 넣어 멤버들을 가지런하게 정렬하는데 이를 바이트 얼라이먼트라고 합니다.

크기가 가장 큰 멤버가 메모리를 할당하는 기준 단위가 됩니다.

멤버의 순서에 따라 구조체의 크기가 달라질 수 있으므로 패딩 바이트가 가장 작도록 구조체를 선언하면 메모리를 아낄 수 있습니다.

또는 컴파일러에 패딩 바이트를 넣지 않도록 지시할 수 도 있습니다.

#pagma pack(1);

등 으로 설정하면 : 구조체 선언 전에 include 다음에 적어준다.

데이터를 읽고 쓰는 시간은 더 걸릴 수 있지만 구조체의 크기는 모든 멤버의 크기를 더한 것과 같아지므로 사에ㅛㅇ하는 메모리의 크기는 최소화 할 수 있습니다.

 

 

#열거형

열거형은 변수에 저장할 수 있는 정수 값을 기호로 정의하여 나열하는 자료형이다.

열거형이 선언된 이후에는 열거형의 변수를 선언할 수 있다.

열거형 멤버는 정수로 바뀌므로 사실상 정수 상수를 써서 작성할 수 도 있지만

열거형을 정의하면 훨씬 읽기 쉬운 코드로 만들수 있다.

 

#매크로 함수

매크로 함수는 인수에 따라 서로 다른 결과값을 갖도록 치환되기 떄문에 비록 함수는 아니지만 인수를 주고 함수처럼 쓸 수 있는 것이다.

매크로 함수를 만들때는 매크로명에 괄호를 열고 인수를 나열합니다.

매크로 함수는 치환된 후의 부작용을 줄이기 위해 치환될 부분에 괄호를 써서 정의합니다.

매크로 함수는 함수처럼 쓰이지만 치환된 후 발생할 문제를 예측하기 어렵습니다.

또한 많은 기능을 매크로 함수로 구현하기 힘들고 수정하기도 쉽지 않습니다. 

그러나 매크로 함수는 호출한 함수로 이동할 때 필요한 준비작업이 없으므로 함수 호출보다 상대적으로 실행 속도가 빠릅니다. 

따라서 크기가 작은 함수를 자주 호출한다면 매크로 함수가 도움이 될 수 있습니다.

 

#정적함수

정적 전역 변수는 하나의 파일에서만 사용하고 다른 파일과는 공유를 차단하므로 다른 파일에서 같은 이름의 전역 변수를 사용할 수 있는 장점이 있습니다.

또한 사용 범위를 하나의 파일로 제한하므로 데이터를 보호할 떄 유용합니다.