본문 바로가기

Architecture for Software

(91)
Algorithm 이란 Algorithm은 반드시 확신할 수 있어야 하며, Algorithm의 작동 방식을 배우는 가장 좋은 방법은 실제로 수행하여 보는 것이다. Algorithm의 현대적인 의미는 조리법, 공정, 방법, 기법, 절차, 루틴 등과 상당히 비슷하다. 다만 Algorithm은 5가지 주요한 특징을 가진다. 1. 유한성(finiteness) Algorithm은 여러 단계들을 수행한 후 유한한 횟수 후 반드시 종료되어야 한다. 이러한 유한성이 만족되어야 Algorithm으로 인정받을 수 있다. 2. 명확성(definiteness) Algorithm의 각 단계는 반드시 명확하게 정의되어야 한다. 수행할 행동은 모든 경우에 대하여 모호함 없이 엄격하게 명시해야 한다. Algorithm은 컴퓨터도 따라할 수 있을 정도로 명..
The 3n+1 Problem 시간날때마다 Programming Challenges를 보고 있습니다. 그중에 한 문제를 올립니다. 문제는 http://acm.uva.es/p/v1/100.html를 보시면 정확하게 설명되어있습니다. 짧은 설명은 다음과 같습니다. 어떤 수열을 만들어내는 알고리즘이 있는데 n이 짝수이면 2로 나누고, n이 홀수이면 n * 3 + 1을 한다. n=1이 될때까지 같은 작업을 계속 반복한다. 아직 명확하게 증명되지 않았지만 모든 정수 n에 대하여 이 알고리즘을 적용시키면 결국에는 n=1이 된다고 추측된다. 이 가설은 적어도 1,000,000까지의 정수에 대해서는 참이다. n이라는 값이 입력되었을 때 1이 나올때까지 만들어진 수의 개수(1 포함)를 n의 사이클 길이(cycle-length)라고 한다. i와 j라는..
Pointer 의 선언 Pointer의 선언은 다음과 같은 방식을 통하여 이루어 진다. int *a; *a는 정수 타입이라는 결과를 나타낸다. * 연산자가 '간접지정 연산자'라는 것을 알고 있다면 a가 정수를 가리키는 포인터라는 것도 알 수 있을 것이다. 간접지정 연산자는 포인터 값에서만 유효하다. 포인터는 결과를 가리키고, 간접지정 연산자는 결과를 얻는 포인터를 '따라'간다. C언어의 형식이 자유롭기 때문에 다음과 같이 타입 바로 뒤에 *를 사용할 수 있다. int* a; 이런 형식의 선언은 위에서 보았던 선언과 동일한 의미이면서도 a가 int 타입이라는 것을 더욱 더 분명하게 나타내준다. 그러나 이런 스타일의 선언은 좋지 않다. 다음 예를 보면 그 이유를 더욱 분명하게 알 수 있다. int* b, c, d; 보통 이러한 선..
플랫폼(Platform)이란 컴퓨터와 관련하여 플랫폼이라는 용어는 응용프로그램이 실행될 수 있는 기초를 이루는 컴퓨터 시스템을 의미한다. PC에서는 두 개의 서로 다른 플랫폼의 예로서 윈도우95와 매킨토시를 들 수 있으며, 대형 서버나 메인프레임에서는 IBM의 System/390을 하나의 플랫폼 으로 볼 수 있다. 하나의 플랫폼은 운영체계, 컴퓨터 시스템의 보조 프로그램, 그리고 마이크로프로세서, 논리연산을 수행하고, 컴퓨터 내의 데이터 이동을 관장하는 마이크로칩 등으로 구성된다. 운영체계는 특정 마이크로프로세서의 명령어 집합과 함께 동작할 수 있도록 설계되어야 한다. 예를 들면, 마이크로소프트의 윈도우95는 같거나 비슷한 종류의 명령어 집합을 공유할 수 있는 인텔의 마이크로 프로세서군과 함께 동작할 수 있도록 만들어졌다. 마더보드..
스택(Stack) 최근 간간히 Programming Challenges를 보고 있습니다. 너무도 어려운 문제들이 많지만 나름 재미를 붙여가고 있습니다. 책의 내용 중 일부를 발췌하였습니다. 참고하세요. 스택(Stack)과 큐(Queue)는 각 항목을 내용과는 무관하게 삽입된 순서에 따라 꺼내도록 설계된 컨테이너이다. 스택은 후입선출(LIFO, last-in first-out) 규칙을 따르는 구조로서 마지막에 들어간 항목이 가장 먼저 나오는 자료구조이다. 스택의 연산에는 다음과 같은 것이 있다. Push(x, s) - x라는 항목을 s라는 스택 맨 위에 삽입Pop(s) - 스택 s의 맨 위에 있는 항목을 리턴하고 삭제Initialize(s) - 비어있는 스택을 생성Full(s), Empty(s) - 스택 s에 대하여 Pus..
C 언어의 문자열 리터럴(String Literal) 평소 C나 C++는 자주 사용하지 않지만 간혹 사용할 경우가 많아서 최근 개념을 다잡고자 "Pointers on C"라는 책을 읽고 있습니다. Java의 경우 String이 지원되지만 C에서는 문자열 타입은 존재하지 않는다. 하지만 문자열 리터럴(String Literal)은 존재한다. 리터럴(Literal)이란 소스코드를 컴파일 할 경우 정의되어 있는 내용을 그대로 정확하게 해석할 수 있어야 하는 값이다. 만약 소스코드에 int x = 12; 라고 정의하였다면 "x"는 변수이며 "12"가 리터럴이다. 중요한 것은 리터럴은 명칭이 아니고 값 그 자체를 의미한다. char *message = "Hello World"; 여기서 "Hello World"가 리터럴이 된다. 문자열이나 숫자와 같은 값들이 모두 리..
C / C++ 컴파일 과정(Compilation Process) 평소 C나 C++는 자주 사용하지 않지만 간혹 사용할 경우가 많아서 최근 개념을 다잡고자 "Pointers on C"라는 책을 읽고 있습니다. 컴파일 과정은 학부때 거의 다 배워서 잘 알고 있는 내용이긴 하지만 책을 보면서 다시한번 정리하고 싶었다. 일반적인 C나 C++의 컴파일 과정을 보여줍니다. 상기 그림은 Visual C++와 같이 Windows GUI를 포함하여야 하는 경우에 컴파일 과정입니다. 특이하게도 Resource Compiler가 같이 있는데, Resource Compiler는 아이콘이나 다이얼로그 박스 및 다른 그래픽 객체 등을 Compiled Resource Files로 Linker에 링킹시킵니다. 이를 통하여 각종 Event-Driven Model에 필요한 GUI를 사용자에게 제공할..
ANSI C 호환 컴파일러의 환경에 대하여 평소 C나 C++는 자주 사용하지 않지만 간혹 사용할 경우가 많아서 최근 개념을 다잡고자 "Pointers on C"라는 책을 읽고 있습니다. 책 내용중 기본 개념에 해당하는 ANSI C 호환 컴파일러의 환경에 대한 좋은 글이 있어서 올립니다. 모든 ANSI C 호환 컴파일러는 두개의 서로 다른 환경(Environment)이 존재한다. 1. 번역 환경 (Translation Environment): 소스코드를 실행 가능한 기계어로 번역하는 환경 2. 실행 환경 (Execution Environment): 코드를 실제로 실행하는 환경 이 두 환경은 모두 하나의 동일한 컴퓨터에 존재할 필요가 없다. 특히 다른 CPU나 운영체제를 사용하는 경우 번역환경과 실행 환경은 서로 상이할 수 있다. 예를 들어 Wind..