본문 바로가기

컴퓨터 공학231

[ C ] 전처리기 이해하기5_매크로 연산자 #, ## 정의/예제 C언어 문법 매크로 연산자 #, ## 정의/예제 아래의 매크로 문장은 어떤 결과를 만들까요? 매크로 함수: #define STRING_NAME(A, B) "A의 이름은 B이다" 매크로 문장: STRING_NAME(하헤호후, 아무개) 예상 결과: 하헤호후의 이름은 아무개이다. 진짜 결과: X (문자열 안에서는 매크로의 매개변수의 치환이 발생하지 않기 때문) 이런 상황에서 매개변수 치환이 이루어지게 하는 연산자, #이 있습니다. ■ # 연산자: 치환 #는 치환의 결과를 문자열로 구성하는 연산자입니다. #define STRING_NAME(ABC) #ABC STRING_NAME(랄랄라)라는 문장은 선행처리기에 의해 문자열 "랄랄라"로 치환됩니다. 또한 나란히 선언하면 하나의 문자열로 간주됩니다. 그래서 아래 문.. 2020. 7. 28.

프로그래머를 위한 이산수학 총정리_수학으로 이해하는 디지털 논리: 이산수학(한빛미디어, 박주미지음) 논리적인 프로그래머를 위한 이산수학 총정리 수학으로 이해하는 디지털 논리: 이산수학(한빛미디어, 박주미지음)으로 공부하면서 정리한 내용입니다. 소제목별로 글을 작성하였으니 해당 링크로 들어가서 확인하면 됩니다. ※ 링크 연결이 되지 않은 글은 예약발행으로 아직 활성화가 되지 않은 상태입니다. 이 페이지를 즐겨찾기 해놓으면 편하게 활용할 수 있습니다. ------- 각 주제마다 개념을 이해했는지 확인할 수 있도록 빈 칸 채우기 식의 문제(PDF)를 준비했습니다. ------- 완성되는대로 하나씩 업로드하겠습니다. #명제와 논리 1 논리란? 프로그래머가 논리적이어야 하는 이유 2 명제와 진릿값이란? 3 논리연산자란?(부정, 논리곱, 논리합, 배타적 논리합)_진리표로 나타내기 4 불 대수와 연산우선순위란? 5.. 2020. 7. 27.

[이산수학]합성명제(Compound), 항진명제(Tautology), 모순명제(Contradicition)란? [이산수학]합성명제(Compound), 항진명제(Tautology), 모순명제(Contradicition)란? ■ 합성명제(Compound) 합성명제의 진릿값은 그 함성명제를 구성하고 있는 명제 각각의 진릿값과 그 명제를 결합하는 논리 연산자에 의해 결정됩니다. 따라서 연산의 우선순위를 정하는 것이 중요합니다. 아래 표를 따르면 됩니다. 합성명제는 진릿값에 따라 다음과 같이 세 종류로 나눌 수 있습니다. ■ 항진명제(Tautology) - 논리 연산을 통해 언제나 참인 명제 - 집합론에서 전체 집합과 같은 개념 ■ 모순명제(Contradicition) - 논리 연산을 통해 언제나 거짓인 명제 - 집합론에서 공집합과 같은 개념 ■ 사건명제(Contingency) 항진명제도 모순명제도 아닌 명제 ------.. 2020. 7. 27.

[이산수학]논리연산자란?(부정, 논리곱, 논리합, 배타적 논리합)_진리표로 나타내기 [이산수학]논리연산자란?(부정, 논리곱, 논리합, 배타적 논리합)_진리표로 나타내기 명제는 두 개 이상 결합하여 사용됩니다. 이 때 논리 연산자를 이용하는데 부정, 논리곱, 논리합, 배타적 논리합이 있습니다. 여러 명제를 합친 결과를 비교할 때 유용한 '진리표(Truth Table)'가 있습니다. 명제에서 나올 수 있는 참/거짓 판단의 모든 가능성을 표로 나열하였습니다. 예로 단순 명제 p의 진리표는 다음과 같습니다. ※ 단순 명제: 더 이상 나눌 수 없는 명제 p T(True, 참) F(False, 거짓) 이제 명제의 결합 중에 어떤 것이 있는지 보고, 이해를 위해 진리표와 밴다이어그램도 다루겠습니다. ■ 부정 (Negation) NOT 명제 p를 부정 예) 오늘 새로운 메뉴가 나온다. ->오늘 새로운.. 2020. 7. 27.

[이산수학]불 대수와 연산우선순위란? [이산수학]불 대수와 연산우선순위란? ■ 불 대수(Boolean Algebra)란? Boolean Algebra의 Boolean은 C#의 Bool형, JAVA의 Boolean형 어원입니다. 이름이 불(Boolean)인 이유는 영국의 수학자 조지 불이 창안한 개념이기 때문입니다. - 대수학의 일부입니다. - 변수의 값으로 진릿값을 사용합니다. : 참(1) 또는 거짓(0) - 논리학을 형식화하기에 적합니다. ※ 대수학: 개개의 숫자 대신에 숫자를 대표하는 일반적인 문자를 사용하여 수의 관계, 성질, 계산 법칙 따위를 연구하는 학문(표준국어대사전) ■ 불 대수의 기초 연산 - 명제의 결합 글에서 다룬 내용에서 T가 1, F가 0이 됐을 뿐입니다. - 다른 기호를 쓰기도 합니다. ■ 연산 우선 순위 - 프로그래.. 2020. 7. 27.

[ C ] 전처리기 이해하기4_매크로 함수란? 장단점/활용 매크로 함수는 일반 함수를 정의하는 것보다 복잡합니다. 함수의 크기가 크면 매크로로 정의하는 것 자체가 불가능할 수 있습니다. 디버깅도 매우 어렵습니다. 그럼에도 불구하고 함수를 매크로로 정의하는 이유는 무엇일까요? 1 상대적으로 실행 속도가 빠르다 매크로 함수는 일반 함수에 비해 실행속도가 빠릅니다. 호출과 동시에 호출된 함수를 위한 "스택 메모리가 할당됨 + 실행 위치 이동 + 매개변수로 인자 전달 + retrun 문을 통한 값의 반환"이 실행되기 때문입니다. 또한 선행처리기가 매크로 함수 호출을 하기 때문에 빈번하게 호출되더라도 실행 속도에 영향을 주지 않습니다. 2 자료형에 따라서 별도로 함수를 정의하지 않아도 된다. 전달인자의 자료형에 상관없이 제대로 치환됩니다. 메크로 함수의 호출 문장이 매크.. 2020. 7. 27.

[ C ] 전처리기 이해하기1_전처리기(Preprocessor)란? 정의/용도, 지시문 종류 전처리기(Preprocessor)란? 정의/용도 소스 파일에서 실행 파일로 만들어지려면 다음과 같은 과정을 거쳐야 합니다. 선행처리 거친 소스 파일이란 무엇일까요? 사실 소스 파일의 형태가 그대로 유지되기 때문에 그냥 소스 파일입니다. 선행처리기가 하는 일은 선행처리 명령문대로 소스 코드의 일부를 수정합니다. 선행 처리 명령문은 #으로 시작하며, 세미콜론(;)을 붙이지 않습니다. #define PI 3.14 이런 명령문이 삽입되어 있다면 선행처리된 소스 파일에서는 PI를 3.14로 인식합니다. #include 이제껄 자주 작성했던 #include 도 # 문자로 시작하는 선행처리 명령문입니다. stdio.h 파일의 내용을 그 파일에 옮겨놓다는 의미입니다. ■ 전처리기 지시문 종류 #include #defi.. 2020. 7. 27.

[이산수학]명제와 진릿값이란? [이산수학]명제와 진릿값이란? ■ 명제(Proposition) 참이나 거짓으로 구분할 수 있는 문장이나 수식 영어 소문자로 p, q, r 등으로 표현 예) 명제 1 + 1 =2 정해인은 27세이다. 명제 아님 지금 몇 시죠? 제 말 좀 들어보세요. ■ 진릿값(Truth Value) 참이나 거짓을 가리키는 값 참 True T 0 거짓 False F 1 확인문제 Q 다음 명제의 진릿값을 구하시오. 1. 캐나나의 수도는 몬트리올이다. 2. 1+4= 5 A 답 확인 시 드래그하세요. False, True ----------------------------------- 이산수학 총정리 목록 보러가기 ----------------------------------- 2020. 7. 27.

[이산수학]논리란? 프로그래머가 논리적이어야 하는 이유 [이산수학]논리란? 프로그래머가 논리적이어야 하는 이유 컴퓨터는 감정이 없습니다. 그래서 전류의 높고, 낮음을 더 확장해서 논리적으로 표현해야 문제를 해결할 수 있습니다. 또한 다른 사람을 공감하고 협업할 때, 설득의 기반이 될 수 있는게 논리입니다. 따라서 프로그래머라면 논리적인 사고 방식을 키우기 위해서 노력해야합니다. 그 방법 중 하나가 수학을 배우는 것입니다. ■ 논리적인 사고방식이란? (정의) 논리적인 사고방식은 다양하게 해석할 수 있는데 다음과 같은 정의로 요약할 수 있습니다. - 어떤 관찰 결과의 진리값(참/거짓)을 판단할 수 있는 능력 - 연결된 여러 참/거짓 변수들로부터 최종 진릿값을 판단할 수 있는 능력 - 양립할 수 없는 모순된 주장을 찾아낼 수 있는 능력 - 사실(fact) 또는 확.. 2020. 7. 27.

[ C ] 파일 입출력 이해하기5_파일 위치 서식자란? fseek, ftell 함수 파일 위치 서식자란? fseek, ftell 함수 FILE 구조체의 멤버 중에는 파일의 위치 정보를 저장하고 있는 멤버가 있습니다. '파일 위치 지시자'라고 부르는 이 멤버는 파일이 처음 개방되면 파일의 맨 앞부분을 가리킵니다. 그래서 파일의 중간이나 마지막에서 데이터를 읽거나 쓰고 싶다면 이 '파일 위치 지시자'를 이동시켜야 합니다. fgets 함수 호출을 통해서 파일에서 20바이트의 문자열을 읽어 들었다면 '파일 위치 지시자'는 20바이트 뒤를 가리키게 됩니다. ■ 파일 위치 지시자의 이동 fseek #include int fseek(FILE * stream, long offset, int wherefrom); stream으로 전달된 파일 위치 지시사를 wherefrom부터 offset만큼 이동시킨다.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기3_파일복사 feof/바이너리 데이터 입출력 fread, fwrite C언어 문법 파일복사 feof/바이너리 데이터 입출력 fread, fwrite ■ 파일 복사하는 함수 feof 전체 파일을 복사해야 한다면 파일의 끝을 확인하는 작업이 필요합니다. 그 때 feof함수을 사용하면 됩니다. 파일의 끝까지 읽어들인 상태이면 0이 아닌 값을 반환합니다. #include int feof(FILE * stream); 매개변수로 FILE 형 포인터를 넣으면 됩니다. ■ 바이너리(Binary) 데이터 입출력하는 함수 fread, fwrite 이번에는 바이너리 데이터를 입력, 출력할 수 있는 함수를 알아보겠습니다. ( 참고할만한 글:텍스트 데이터와 바이너리 데이터의 차이점은?) - 입력 #include size_t fread(void * buffer, size_t size, size_t.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기2_파일의 개방모드(Mode) C언어 문법 파일의 개방모드(Mode) fopen 함수의 두 번째 인자로 "wt"와 "rt"를 전달하여 스트림을 형성했습니다. 사실 스트림의 종류는 더 다양합니다. 기본적으로 두 가지 기준이 있는데 하나씩 보겠습니다. 기준 1: 읽기 위한 스트림? vs 쓰기 위한 스트림? 모드(Mode) 스트림의 성격 파일이 없으면? r 읽기 에러 w 쓰기 생성 a 덧붙여 쓰기 생성 r+ 읽기/쓰기 가능 에러 w+ 읽기/쓰기 가능 생성 a+ 읽기/덧붙여 쓰기 가능 생성 위 표를 참조하여 만들고자 하는 스트림의 특성에 맞춰 '파일의 개방 모드'를 선택하면 됩니다. 그 조합이 fopen 함수의 두 번재 인자가 됩니다. 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성을 의미합니다. 더 좋은 모드라고 생각할 수 있지만 수.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기1_스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets 스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets 데이터의 이동 경로가 되는 다리를 스트림이라고 했습니다. 기본적인 스트림 개념은 아래 글에서 이미 다루었습니다. 스트림과 데이터의 이동 ■ 스트림 생성 함수 FILE * fopen(const char * filename, const char * mode); 위 함수의 첫 번째 인자로는 스트림을 형성할 파일의 이름, 두번째 인자로는 형성할 스트림 종류에 대한 정보를 문자열로 전달합니다. 그러면 이 함수는 해당 파일과의 스트림을 형성하고 스트림 정보를 FILE 구조체 변수에 담아서 그 변수의 주소 값을 반환합니다. 여기서 FILE 구조체의 포인터는 파일을 가리키기 위한 용도로만 사용되었습니다. 그래서 FILE 구조체 변수의 멤버에 .. 2020. 7. 25.

[ C ]커스텀 자료형 이해하기6_열거형(Enumerated Type)란? 개념/선언방법 C언어 열거형(Enumerated Type)란? ■ 열거형 개념, 선언방법 열겨형은 변수에 저장가능한 값을 열거하여 정의합니다. 그래서 열거형 변수명을 IndianBoy로 하고 다음과 같이 값을 넣을 수 있습니다. enum indianBoy { One=1, Two=2, Three=3, Four=4, Five=5 }; IndianBoy형 변수가 저장할 수 있는 값으로는 One, Two, Three.. 라는 상수가 있으며, 각각 1, 2, 3...으로 정의하였습니다. 이 열거형 변수를 선언하려면 구조체에 struct 키워드 붙이듯이 enum 키워드를 사용하면 됩니다. enum indianBoy song1; // indianBoy형 변수 song1선언 이제 위의 열거형을 typedef 선언을 추가해서 정의한 .. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기5_공용체(Union Type)이란? 정의/사용하는 이유 C언어 공용체(Union Type)이란? 정의/사용하는 이유 ■ 공용체 정의공용체(Union Type)을 뜻하는 Union은 조합, 통합을 의미합니다. 무엇에 관한 '통합'일까요? 구조체와 공용체의 차이를 보면 쉽게 이해할 수 있습니다. 아래 코드를 확인해보겠습니다. #include typedef struct structBox { int member1; int member2; double member3; } SBox; typedef union unionBox { int member1; int member2; double member3; } UBox; int main(void) { SBox sbox; UBox ubox; printf("%d \n", sizeof(SBox); // 결과 16 printf("%.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기4_함수 반환값으서의 구조체 C언어 문법 함수 반환값으서의 구조체 기본 자료형이랑 똑같습니다. int형 변수를 인자로 전달할 수 있고, 반환값으로도 설정할 수 있듯이 구조체 변수도 마찬가지입니다. 간단한 예제를 보겠습니다. date_t get_dday(void) // 반환값이 구조체 date_t형 { date_t date; date.year = 2043; date.month = 10; date.day = 1; return date; } //main 함수에서 date_t date; date = get_dday(); // 대입 가능 C언어에서 함수는 반환값 한 개입니다. 그래서 여러 값을 반환하고 싶으면 구조체를 반환하면 됩니다. 구조체를 반환하면 실질적으로 여러 개의 값을 반환하는 격이 되니까요. date = get_dday(); 이.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기3_구조체 배열, 포인터 C언어 문법 구조체 배열, 포인터 ■ 구조체 배열 정의 및 선언 구조체 변수를 여러개 사용해야 할 때는 구조체 배열을 선언하면 됩니다. 선언방법은 일반 배열과 동일합니다. struct point pointArr[3]; // 크기 3인 point형 구조체 배열 선언 그럼 다음과 구조로 배열이 할당됩니다. ■ 구조체 배열 초기화 구조체 배열을 선언과 동시에 초기화할 때는 배열의 길이만큼 중괄호를 통해서 초기화할 값을 명시합니다. struct point pointArr[3] // 크기 3인 point형 구조체 배열 선언 { {3, 4} // 첫 번째 요소의 초기화 {2, 1} // 두 번째 요소의 초기화 {5, 9) // 세 번째 요소의 초기화 }; ■ 구조체 변수와 포인터 포인터도 구조체의 멤버가 될 수 있.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기2_typedef이란? typedef사용법 C언어 문법 typedef이란? struct과 typedef의 차이점, 사용법 구조체 변수를 선언할 때는 struct 키워드를 일일히 붙여야합니다. 구조체 Person으로 변수를 선언한다고 하면 struct Person own; struct Person two; struct Person three; 이런 식으로 'struct [구조체명] [변수명]'을 반복해야 합니다. 이런 번거로움을 덜 수 있는 typedef 구조체를 정의할 수 있습니다. typedef Person PERSON; 이렇게 선언을 하면 struct Person에 PERSON이라는 별칭(alias)을 붙여진 것입니다. 그래서 간단히 [별칭][변수명]만 작성하면 됩니다. PERSON own; PERSON two; PERSON three; 이처.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기1_구조체란? 정의/선언/용도/초기화 C언어 구조체(struct)란? 정의/선언/용도/초기화 이제까지 기본 자료형을 써왔습니다. int(4바이트)나 short(2바이트) 등등 말이죠. 그런데 3바이트짜리 자료형을 사용하고 싶으면 어떻게 해야할까요? 3바이트짜리 기본 자료형은 없습니다. 그래서 기본 자료형으로는 그 크기를 할당받을 수 없습니다. 바로 이 때 커스텀(Custom) 자료형을 활용합니다. 사용자 정의 자료형(User efined data type)이라고도 하여 우리가 새로운 자료형을 정의할 수 있다는 뜻입니다. ■ 구조체 정의 그 중 하나인 구조체에 대해 알아보겠습니다. 구조체를 선언할 때 사용하는 키워드 struct은 '건축물'을 뜻하는 영어 단어 structure을 의미합니다. 말 그대로 여러 부품을 조립하여 하나의 건축물을 이.. 2020. 7. 24.

[ C ]메모리 이해하기12_메모리 정리 C언어 문법 메모리 정리 참고 자료: 포프 C 언매니지드 프로그래밍 강의 241 ※ 마무리 강의 241번 내용 그대로 딕테이션 했습니다. "섹션 9 레지스터, 스택&힙, 동적 메모리, 다중포인터 (강의 No. 224-240)" 에 해당하는 정리 강의이며, 저는 "메모리 이해하기" 시리즈에 그 내용을 실었습니다. 하지만 저는 강의의 모든 내용을 다루지 않았기 때문에 이번 글에는 제가 언급하지 않은 부분이 있습니다. ■ 메모리 종류 정리할께요. 여기까지가 C에서 반드시 배워야 하는 기술적 기타 등등 전부를 마무리 짓는거예요. 그 뒤에 이런거 응용해서 사용하는 법, 새로운 표준에서 몇 가지 것들을 배우긴 배울꺼에요. 여기서 배운거 가장 마지막에 메모리 관리 같은걸 남겨둔 이유는 포인터는 처음 들어가도 힘든데 .. 2020. 7. 23.

[ C ] 문자열 함수 이해하기8_C스타일 문자열 정리 C언어 문법 C스타일 문자열, 출력 마무리 정리 참고 자료: 포프 C 언매니지드 프로그래밍 강의 164 ※ 마무리 강의 164번 내용 그대로 딕테이션 했습니다. "섹션 5 C스타일 문자열, 출력 (강의 No. 141-163)" 에 해당하는 정리 강의이며, 저는 " C 스타일 문자열 이해하기" 시리즈에 그 내용을 실었습니다. 하지만 저는 강의의 모든 내용을 다루지 않았기 때문에 이번 글에는 제가 언급하지 않은 부분이 있습니다. ■ C 스타일 문자열 문자열의 표현 방법 C 스타일의 문자열, 면접에서 많이 나오는 내용이죠. 포인터, 배열, 간단한 알고리즘을 테스트하기에 굉장히 좋은 부분이죠. C에서는 문자열 자체가 없어요. 기본적으로 문자열 형 자체가 없어요. 그래서 C는 배열을 통해서 표현하는데. 마지막에 .. 2020. 7. 23.

[ C ] 문자열 함수 이해하기7_서식 지정 출력 / 서식 문자열 / 서식 지정자 모음 C언어 문법 서식 지정 출력(formatted) / 서식 문자열(format string) / 서식 지정자 모음 ■ 서식 지정(formatted) 출력이란 C언어 학습할 때 자주 사용했던 함수 printf()가 있습니다. 가장 기본 출력 함수인데, 맨 앞 글자 f는 formatted 입니다. 포맷에 맞춘다는 것은 데이터를 특정 서식에 맞춰 출력하는 것을 의미합니다. 그래서 C언어에서는 '서식 지정 출력'이라고 합니다. 서식 지정 출력 중에서 가장 자주 사용되는 3가지를 보겠습니다. 1 printf() 콘솔창(stdout) 에 출력 2 fprintf() 스트림에 출력 3 sprintf() 문자열에 출력 1 stdout이라는게 우리가 알고 있는 커맨드창 콘솔입니다. 2 fprintf 에서 맨 앞 글자 f는 .. 2020. 7. 23.

[ C ] 문자열 함수 이해하기6_입출력 이외의 문자열 관련 함수_strlen, strcpy, strcat, strcmp C언어 입출력 이외의 문자열 관련 함수_strlen, strcpy, strcat, strcmp C언어는 문자열을 담을 수 있는 자료형이 없습니다. 그래서 char로 배열을 만들어 사용합니다. 하지만 배열만으로 전체 길이 알아내는 등 데이터를 처리하는데 번거로움이 있기 때문에 유용한 함수를 잘 활용하면 좋습니다 참고할만 한 글: C 스타일 문자열 개념 참고할만 한 글: 문자열 길이를 알 수 있는 함수 strlen ■ 문자열을 복사하는 함수: strcpy, strncpy char* strcpy(char * dest, const char * src); char* strncpy(char * dest, const char * src, size_t n); strcpy 함수는 아래와 같이 호출하면 됩니다. int m.. 2020. 7. 22.

[ C ] 문자열 함수 이해하기5_표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기 C언어 표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기 ■ 입출력 버퍼(buffer)의 개념 우리가 이제껏 공부해 온 입출력 함수들은 ANSI C의 표준에서 정의된 함수입니다. 이런 표준 입출력 함수를 통해서 데이터를 입출력하는 경우, 해당 데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 됩니다. 여기서 말하는 '메모리 버퍼'는 데이터를 임시로 모아두는(저장하는) 메모리 공간입니다. 위 그림을 보면 키보드를 통해 입력되는 데이터는 일단 입력버퍼에 저장된 다음에(= 버퍼링 된 다음에) 프로그램에서 읽혀지는 것을 알 수 있습니다. 즉 fgets 함수가 읽어 들이는 문자열은 입력 버퍼에 저장된 문자입니다. 그럼 언제 입력 버퍼에 데이터가 들어가는 걸까요? 바로 엔터 키.. 2020. 7. 22.

[ C ] 문자열 함수 이해하기4_문자열 단위 입출력 함수_puts, fputs, gets, fgets C언어 문자열 단위 입출력 함수 puts, fputs, gets, fgets ■ 문자열 출력 함수: puts, fputs 문자열을 출력할 때 일반적으로 두 함수를 사용합니다. #include int puts(const char * s); int fputs(const char * s, FILE * stream); // 실패 시 EOF 반환 다음 코드를 통해서 두 함수의 차이를 찾아봅시다. int main(void) { puts("How are you?"); fputs("Good,Thanks", stdout); printf("\n"); return 0; } puts 함수는 출력의 대상이 stdout으로 결정되어 있기 때문에 매개변수로 출력할 문자열만 넣으면 됩니다. fputs 함수는 두 번째 인자를 통해서 .. 2020. 7. 21.