internationalization ("I18N") ; 국제화

국제화는 때로 줄여서 그저 "I18N"이라고도 표기하는데, 그 의미는 이 용어의 영어 표기에서 첫 글자인 "I"자와 마지막 글자인 "N"의 사이에 18글자가 들어가 있다는 의미이다. 국제화는 제품이나 서비스를 특정지역의 언어나 문화에 맞추는, 즉 현지화라고 불리는 과정을 쉽게 할 수 있도록 계획하거나 이행하는 과정을 말한다. 국제화는 때로 번역 및 현지화 능력부여 작업이라고도 불리는데, 여기에는 다음과 같은 것들이 포함된다.

  • 하드웨어 레이블이나, 도움말 페이지, 그리고 온라인 메뉴 등 사용자 인터페이스를 설계할 때, 더 많은 수의 글자가 들어갈 때를 대비하여 여유를 둔다.
  • 웹에디터나 저작도구 등과 같은 제품을 개발할 때 국제 문자셋, 즉 유니코드를 지원할 수 있게 한다.
  • 인쇄용 그래픽 이미지나, 웹사이트를 만들어서 텍스트 레이블을 번역할 때 비용이 많이 들지 않게 한다.
  • 전세계적으로 통용될 수 있는 예시를 사용한다.
  • 소프트웨어의 경우에는, 메시지들이 영어와 같은 단일 바이트 문자 코드에서, 한글과 같은 다중 바이트 문자 코드로 변환될 수 있도록 데이터 공간을 확보한다.

'old > 용어정리' 카테고리의 다른 글

interoperability ; 상호 운용성  (0) 2010.11.18
instruction ; 명령어  (0) 2010.11.16
I/O (input/output) ; 입출력  (0) 2010.11.16
heterogeneous ; 이종  (0) 2010.11.15
header ; 헤더  (0) 2010.11.15
Posted by jazzlife
,

I/O (input/output) ; 입출력

I/O[아이오]컴퓨터와 데이터를 주고받는 연산이나, 프로그램 또는 장치를 가리킨다. 대표적인 I/O 장치로는 프린터, 하드디스크, 키보드, 마우스 등이 있다. 실제로 I/O 장치는, 기본적으로 입력만 할 수 있는 장치 (키보드와 마우스가 이에 해당), 주로 출력만을 하는 장치 (프린터), 그리고 입력과 출력을 모두 할 수 있는 장치 (하드디스크, 디스켓 등) 등으로 나뉘어진다.

'old > 용어정리' 카테고리의 다른 글

instruction ; 명령어  (0) 2010.11.16
internationalization ("I18N") ; 국제화  (0) 2010.11.16
heterogeneous ; 이종  (0) 2010.11.15
header ; 헤더  (0) 2010.11.15
hardware ; 하드웨어  (0) 2010.11.15
Posted by jazzlife
,

연산자

old/C Grammer 2010. 11. 16. 17:13

프로그램은 데이터와 코드로 구성되는데 데이터는 프로그램이 처리하는 재료이고 코드는 데이터를 가공하는 수단이다. 데이터(Data)를 우리말로 번역하면 자료이며 이 데이터를 처리하여 인간에게 유용한 형태로 가공하면 이것이 정보(Information)가 된다. 자료와 정보는 비슷한 것 같지만 많이 다르다. 자료는 불규칙하게 널려 있는 여러 가지 형태의 수치나 문자열이며 정보는 인간이 곧바로 사용할 수 있도록 정리된 유용한 것이다.

예를 들어 성적 처리 프로그램의 경우 각 학생의 과목별 성적은 데이터인데 이 자체로는 별로 유용한 정보를 얻을 수 없다. 이 자료를 가공하여 총점, 평균, 석차를 내면 비로소 학력 평가를 알 수 있는 유용한 정보가 된다. 또한 인터넷에 널려있는 웹 문서들은 그 자체로서는 가치가 없으며 검색 엔진 등에 의해 필요한 것을 추출, 정리해야 비로소 가치있는 정보가 된다. 프로그램이란 사람을 대신해서 이런 일을 하는 소프트웨어이며 프로그램이 자료를 가공하여 정보를 만드는 주된 수단이 바로 이 장의 주제인 연산자다.

연산자(Operator)가 무엇인가는 굳이 문장화하여 정의를 내리지 않더라도 이미 이해하고 있을 것이다. 더하고 빼고 곱하고 나누는 동작을 하는 것들이 바로 연산자이며 실생활에도 늘상 사용하고 있는 것들이다. 물론 소프트웨어 공학적인 측면에서 정의를 내린다면 좀 더 복잡해지겠지만 일단은 여러분들이 상식적으로 이해하고 있는 연산자와 같다고 생각하면 된다.

C는 아주 많은 종류의 연산자를 제공하는데 이런 풍부한 연산자 지원이 C의 큰 장점이기도 하다. 제공하는 연산자가 많다는 것은 그만큼 데이터를 가공할 수 있는 능력이 탁월하다는 뜻이며 이런 연산자들을 자유 자재로 사용할 수 있으면 복잡한 연산을 간단하게 처리할 수 있다. 수가 많으므로 연산자를 종류별로 분류해 보도록 하자. 분류 방법에는 여러 가지가 있지만 일단 연산자의 기능별로 분류하는 것이 가장 일반적이다.

기능별 종류

연산자

산술 연산자

+ - * / %

부호 연산자

+ -

대입 연산자

= 복합 대입 연산자

관계 연산자

== != <= < >= >

증감 연산자

++ --

포인터 연산자

* & []

구조체 연산자

. ->

논리 연산자

|| && !

비트 연산자

| & ~ >> <<

삼항 조건 연산자

? :

쉼표 연산자

,

sizeof 연산자

sizeof

캐스트 연산자

(type) type()

괄호 연산자

()

C++ 연산자

new delete :: .* ->*

도표를 보면 이 많은 연산자들을 언제 다 익히나 싶을 정도로 양이 많다. 양만 많을 뿐이지 어렵지는 않으므로 이 장을 통해 하나씩 익혀 나가도록 하자. 솔직히 연산자 자체는 결코 어렵다고 할 수 없으나 적재 적소에 상황에 맞는 최적의 연산자를 선정하여 요긴하게 사용하는 응용력을 키우는 것이 어렵다. 연산자 하나를 배울 때마다 데이터를 다룰 수 있는 능력이 향상된다고 생각하면 즐거운 마음으로 공부할 수 있을 것이다. 프로그래머를 무사에 비유한다면 연산자는 칼, 활 같은 무기라고 할 수 있다.

이 도표는 연산자의 기능별로 분류한 것이고 이 외에 피연산자의 개수에 따라 분류하기도 한다. 피연산자란 연산 대상을 말하는데 몇 개의 피연산자를 요구하는가에 따라 단항 연산자(Unary Operator), 이항 연산자(Binary Operator)로 분류한다. a=1+2; 라는 문장에서 +연산자는 1과 2의 합을 계산한다. 양쪽에 두 개의 피 연산자가 있으므로 + 연산자는 이항 연산자이다. = 대입 연산자도 a와 1+2의 결과인 3을 피연산자로 요구하므로 이항 연산자이다. 반면 -3 같은 부호 연산자나 a++같은 연산자는 피연산자가 하나밖에 없으므로 단항 연산자이다. 앞에서 포인터를 소개할 때 잠시 구경해 본 *, & 연산자도 단항 연산자이다.


1. 산술 연산자

산술(Arithmetic) 연산자는 더하고 곱하고 빼고 나누는 가장 기본적이고 또한 가장 많이 사용되는 연산자이다. 초등학교때부터 배웠고 일상 생활에서도 늘상 사용하는 연산자이므로 더 이상의 상세한 설명이 필요치는 않을 것 같다. 연산자는 기호로 표시하는데 더하기와 빼기는 수학에서와 마찬가지로 +, - 기호를 사용한다. 곱하기는 보통 ´ 기호를 사용하지만 알파벳 X와 모양이 동일해서 *를 대신 사용한다. 그리고 나누기는 보통 ¸기호를 사용하는데 이 문자가 키보드에 없기 때문에 / 기호를 사용하여 분수 형태로 표현한다.

기호가 조금 다른 것 빼고는 학교에서 배운 것과 동일하되 다만 나눗셈을 하는 / 연산자에 대해서만 약간의 주의를 하면 된다. 이 연산자는 피연산자의 타입에 따라 연산의 결과가 달라지는 특징이 있다. 피연산자가 모두 정수형이면 결과도 정수형이 되고 피연산자중에 실수형이 있으면 결과도 실수형이 된다.

6/3                   // 결과는 2
3.0/2.0              // 결과는 1.5

출력 문자열 앞쪽에 공백이 하나 더 있음을 유의하도록 하자. 이 공백은 이전의 달팽이 꼬리를 지우는 역할을 하는데 없을 경우 잔상이 남게 된다.

산술 연산자에 대해서는 다 알아보았고 산술 연산자와 모양이 똑같은 부호 연산자에 대해 알아보자. 부호 연산자는 피연산자의 부호를 바꾼다. score 변수에 23이라는 값이 들어 있다면 -score는 부호를 바꾸어 -23이 된다. 산술 연산자의 -와 부호 연산자의 -는 모양은 같지만 기능은 다르다. 뺄셈 연산자 -는 피연산자를 두 개 취하는 이항 연산자이고 부호 연산자 -는 피연산자 하나만 취하는 단항 연산자이다. 다음 식을 보자.

a*-b+c-d;

b앞의 -는 부호 연산자이고 d앞의 -는 산술 연산자이다. 어렵지 않게 구분될 것이다. 그럼 다음 대입문에서 -는 어떤 연산자일까?

a=-1;

여기서 사용된 -기호는 언뜻 보기에 부호 연산자인 것 같지만 사실은 연산자가 아니다. -1이라는 상수의 한 부분일 뿐이며 부호를 바꾸는 동작을 하지는 않는다. 부호 연산자 -를 사용하면 변수에 저장되어 있는 값의 음수값을 얻을 수 있다. 다음은 두 개의 정수형 변수 a와 b에 대한 연산예이다.

a+b         // a와 b를 더한다.
a+-b;       // a와 b의 음수값을 더한다.
a-b;        // a에서 b를 뺀다.
a--b;       // a에서 b의 음수값을 뺀다.

이 연산문중 앞쪽 세 개는 모두 합법적이다. 그러나 4번째 연산문은 에러로 처리되는데 왜냐하면 --는 감소 연산자라는 단항 연산자로 별도로 정의되어 있기 때문이다. 수학에서 --는 +와 같아지므로 a--b는 사실 a+b와 같지만 C에서는 그렇지 않다. 만약 정 이런 연산을 할 필요가 있다면 a- -b와 같이 공백을 하나 넣어 주든가 아니면 a-(-b)같이 괄호를 싸야 한다.


대입 연산자

대입(Assignment)이란 변수에 어떤 값을 집어 넣는 동작이며 대입 연산자는 변수의 값을 변경할 때 사용한다. = 기호를 사용하며 다음이 가장 간단한 대입문의 예이다.

i=1;

i라는 변수에 1이라는 값을 대입한다. = 연산자는 우변에 있는 값을 좌측으로 대입하는데 위와같이 우변이 상수일 경우는 계산할 것도 없이 상수를 바로 좌변에 대입한다. 우변이 다음과 같은 수식일 경우는 이 수식을 계산한 결과가 좌변으로 대입된다.

i=2+3;
i=j+k*m;

i에 2+3을 더한 5가 대입될 것이다. 이런 상수 수식은 계산 결과가 상수이기 때문에 실행시에 계산되지 않으며 컴파일할 때 컴파일러에 의해 미리 계산된다. 즉 i=2+3;이라고 대입하면 컴파일러는 이 명령을 i=5;로 고쳐서 써 넣으므로 2+3이라고 쓰나 5라고 쓰나 전혀 차이가 없다. 변수가 들어가 있는 수식은 변수의 값에 따라 결과가 달라지므로 실행할 때 계산되어 i로 대입될 것이다.

복합 대입 연산자

복합 대입 연산자는 대입 연산자와 다른 연산자가 결합된 연산자이다. 간단한 사용예를 보자.

a=a+3;

이 수식은 원래 a값에 3을 더해 a에 다시 대입하라는 뜻이며 a를 3만큼 증가시킨다. 변수의 현재값을 기준으로 상대적으로 값을 증감시킬 때 아주 많이 사용하는 식이다. 이처럼 좌변의 변수가 우변의 수식에 포함되어 있을 때는 이것을 복합 대입 연산자로 바꿀 수 있다.

a+=3;

여기서 사용된 +=이라는 연산자가 바로 복합 대입 연산자이며 좌변의 값을 우변만큼 증가시킨다. a=a+3과 a+=3은 완전히 같은 식이되 변수명이 다음과 같이 아주 길다면 이 변수를 두 번 쓰는 것보다는 복합 대입 연산자로 한 번만 쓰는 것이 편리하다. 

+=  -=  *=  /=  %=  <<=  >>=  &=  |=  ^=

 그러나 아무 연산자나 다 복합 대입 연산자로 만들 수는 없으며 위에 보인 10개가 전부이다. 이런 복합 대입 연산자를 만나면 원래 수식을 떠올려 보면 된다. 복합 대입 연산자를 쓰면 식이 좀 더 간단해지는 반면 몇 가지 부작용이 있기 때문에 복잡한 수식에서는 사용하지 않는 것이 좋다. a+=n 정도의 간단한 수식에만 사용하는 것이 바람직하다.

증감 연산자

증감 연산자는 피연산자를 1씩 증가시키거나 감소시킨다. 루프의 제어 변수처럼 순서대로 어떤 작업을 할 때는 변수값을 하나씩 증감시키는 경우가 많기 때문에 별도의 연산자가 마련되어 있다. 증가 연산자는 ++로 쓰며 감소 연산자는 --를 쓴다. 둘 다 사용 방법은 비슷하므로 ++연산자에 대해서만 집중적으로 연구해 보자. 다음 세 식은 모두 동일하며 a를 1 증가시킨다.

전위형(Prefix) : 증감연산자가 피연산자 앞에 위치한다. ++a, --a
후위형(Postfix) : 증감연산자가 피연산자 뒤에 위치한다. a++, a--


2. 논리 연산자


관계 연산자

관계 연사잔는 피연산자 두개를 취하는 이항연산자이며 좌변과 우변을 비교할 때 쓰이는 연산자이다.

==, !=, >, <, >=, <=

논리 연산자

논리 연산자는 주로 관계 연산자와 함께 사용되며 두 개 이상의 조건식을 결합하여 하나의 진리값을 만들어 낸다. 다음 세 가지 종류가 있다.

연산자

설명

!

논리 부정(Not)

논리식의 진위를 반대로 만든다.

&&

논리곱(And)

논리식이 모두 참이어야 참이다.

||

논리합(Or)

논리식 하나만 참이면 참이다.


if ((a > 5 && a < 10) || (b >= 20 && b <= 100) && c != 7) 명령;


비트 연산자

비트 연산자는 논리 연산자와 비슷하지만 비트를 연산 대상으로 한다는 점이 조금 다르다.

연산자

설명

~

비트를 반전시킨다.

&

대응되는 비트가 모두 1 1이다.

|

대응되는 비트가 모두 0 0이다.

^

개의 비트가 달라야 1이다.

<<

지정한 수만큼 왼쪽으로 비트들을 이동시킨다.

>>

지정한 수만큼 오른쪽으로 비트들을 이동시킨다.



쉬프트 연산자

쉬프트(Shift) 연산자는 비트들을 지정한 수만큼 좌우로 이동시킨다. >> 연산자는 오른쪽으로 비트를 이동시키며 << 연산자는 왼쪽으로 비트를 이동시킨다. 연산자의 모양이 이동 방향의 화살표와 비슷하게 되어 있어 직관적이다. a << 1은 a를 1비트 왼쪽으로 이동시키며 a << 3은 3비트 왼쪽으로 이동시킨다. 두 개의 피연산자를 취하는 이항 연산자인데 좌변은 보통 정수형 변수가 오고 우변은 정수 상수가 온다. 물론 양변이 모두 변수(a << b)일 수도 있고 양변이 모두 상수(1 << 3)일 수도 있다.

if (((a & 0x7c00) >> 10) == 2)

a를 0x7c00과 & 연산하여 마스크 오프시키고 10번 오른쪽으로 민 후 이 값이 ㄱ의 코드인 2인지 비교했다. 반대로 초성만 특정한 값으로 바꿀 때는 어떻게 할지 생각해 보기 바란다. 쉬프트 연산은 고속의 그래픽 처리가 필요할 때 비디오 램을 직접 액세스하기 위해서도 많이 사용된다. 비디오 램에 들어 있는 이미지를 쉬프트하면 스크롤될 것이다.

쉬프트 연산의 피연산자는 주로 부호없는 정수형이다. 실수형은 당연히 안된다. 부호있는 정수형은 가능은 하지만 이 경우 동작이 조금 달라진다. 최상위에 있는 부호 비트는 쉬프트 대상에서 제외되는데 부호는 값이 아니기 때문에 유지하는 것이 옳다. 부호있는 정수에 대한 쉬프트 연산은 권장되지 않으며 실제로 의미를 가지는 경우도 드물다.

쉬프트 연산이 곱셈에 비해 불리한 점은 2의 거듭승에 대해서만 곱셈이 가능하다는 점이다. 2배, 4배, 8배, 16배 등만 할 수 있으며 3배, 17배 이런 연산은 할 수 없다. 그러나 쉬프트 연산과 덧셈, 뺄셈을 잘 조합하면 이런 연산이 가능해지기도 한다.

3배 : a << 1 + a;
9배 : a << 3 + a;
15배 : a << 4 - a;
60배 : a << 6 - a << 2;

특히 제일 마지막의 쉬프트 연산으로 60배를 하는 코드는 아주 기발한 응용예이며 감탄을 금하기 어려운 예술 코드라고 할 수 있다. 정밀하게 측정해 보면 이런 연산들이 곱셈보다 수배~수십배 더 빠르다. 보통의 경우라면 일반적인 곱셈을 하는 것이 소스를 유지하기에 편리하지만 속도가 지극히 중요하다면 곱셈보다는 가급적이면 쉬프트 연산을 사용하는 것이 좋다.

회전 연산자

회전(Rotate) 연산은 쉬프트 연산과 유사한 비트 조작 명령이다. 쉬프트는 비트를 선형으로 이동시키는데 비해 회전 연산은 원형으로 이동시킨다. 비트 이동에 의해 밀려나는 비트는 버려지지 않고 반대쪽으로 다시 이동된다는 것이 특징이다. 회전 연산은 쉬프트 연산에 비해 많이 사용되지 않기 때문에 연산자 형태로는 제공되지 않으며 _rotl, _rotr 함수로 제공된다. C 수준에서는 사용할 일이 그리 많지 않다. 과거 도트 프린터나 잉크젯 프린터의 경우 헤더가 수직으로 배열되어 있으므로 한 비트씩 추출하여 한 줄을 만들었는데 이럴 때 회전 연산이 사용되었다.

3. 기타 연산자

삼항조건 연산자

삼항 조건 연산자는 특이하게도 피연산자를 세 개나 가지는데 다른 언어에는 없는 C언어의 독특한 연산자이다. 기본 형식은 다음과 같다.

(조건식) ? 1:2

 ? 앞에 조건식이 있고 ? 뒤에 :을 사이에 두고 두 개의 값이 온다. ?와 :은 한 연산자를 구성하는 짝이기 때문에 반드시 같이 와야 하며 단독으로 사용할 수는 없다. if else, do while처럼 짝을 이루어 사용되는 연산자이다. 이 연산자는 조건식을 평가해 보고 참이면 값1을 리턴하고 거짓이면 값2를 리턴한다. 조건식 자리에는 보통 변수의 값을 비교하는 관계 연산문이 오지만 조건식으로 사용될 수 있는 식이면 어떤 것이든지 가능하다. 변수나 상수, 함수호출문 등 논리값을 리턴하는 모든 식이 올 수 있다. 조건식을 감싸는 괄호는 반드시 필요한 것은 아니나 괄호가 있는 것이 보기에 좋고 안정감이 있어 보인다.

printf("%d는 %s수입니다.\n",i,i%2==0 ? "짝":"홀");

쉼표 연산자

쉼표 연산자는 쉼표 기호(,)를 사용하는데 모양만으로 보면 구두점같이 생겨서 연산자가 아닌 것처럼 보이기도 한다. 하지만 분명히 연산자이다. 피연산자로 양쪽에 두 개의 표현식을 취하며 좌변을 먼저 평가하고 우변을 평가한 후 우변의 연산 결과를 리턴한다. 쉼표 연산자는 어떤 연산을 한다기보다는 두 연산식을 하나로 묶는 역할만 한다. 이 연산자를 사용하면 두 개의 표현식을 하나로 합칠 수 있다.

j=i=3,i+2;
for ({ i=1;j=2; };i<5;{ i++;j+=2; }) {

sizeof 연산자

다른 연산자들은 모두 +, -, && 같은 기호로 표현하는데 sizeof 연산자는 단어로 되어 있어 조금 특이해 보인다. 이 연산자는 피연산자로 주어진 타입 또는 변수의 크기를 계산한다. 기본 형식은 다음과 같다.

sizeof(타입 또는 변수)

피연산자로 int, double같은 타입을 쓸 수도 있고 변수를 쓸 수도 있으며 상수를 사용할 수도 있다. 아뭏든 괄호안에 있는 대상이 메모리를 얼마나 차지하고 있는지 계산한다.

캐스트 연산자

캐스트 연산자는 수식내에서 변수의 타입을 강제로 다른 타입으로 바꾼다. 별다른 지정이 없으면 변수의 고유한 타입대로 연산이 수행되는데 가끔 타입을 바꿔서 연산해야 할 경우가 있다. 캐스트 연산자의 형식은 다음 두 가지가 있다.

(타입)변수
타입(변수) 

전자는 C언어의 캐스트 연산자 형식이며 후자는 C++언어에서 새로 추가된 캐스트 연산자 형식이다. C++ 컴파일러에서는 두 형식 모두 사용할 수 있는데 C++ 형식이 함수 호출문과 유사해서 더 명시적이고 가독성이 좋다. 하지만 C 형식도 기능상 특별한 문제가 없고 오랫동안 사용해 왔기 때문에 아직까지도 C++형식보다는 C형식이 더 많이 사용된다. 둘 중 어떤 형식을 사용할 것인가는 쓰는 사람의 자유이다.

r=(double)i/j;


4. 연산 규칙 


연산 순서

순위

연산자

결합순서

1

( ) [ ] -> .

왼쪽 우선

2

! ~ ++ -- + -(부호) *(포인터) & sizeof 캐스트

오른쪽 우선

3

*(곱셈) / %

왼쪽 우선

4

+ -(덧셈, 뺄셈)

왼쪽 우선

5

<< >>

왼쪽 우선

6

< <= > >=

왼쪽 우선

7

== !=

왼쪽 우선

8

&

왼쪽 우선

9

^

왼쪽 우선

10

|

왼쪽 우선

11

&&

왼쪽 우선

12

||

왼쪽 우선

13

? :

오른쪽 우선

14

= 복합대입

오른쪽 우선

15

,

왼쪽 우선

 
결합 순서

결합 순서는 수식내에 같은 종류의 연산자가 있을 때 어떤 방향의 연산을 먼저 수행할 것인가를 지정한다. 연산 순위는 다른 종류의 연산자에 대한 실행 순서인 반면 결합 순서는 같은 연산자(또는 같은 순위내의 다른 연산자)의 실행 순서를 지정한다.

대부분의 이항 연산자들은 왼쪽 우선 순위를 가지기 때문에 수식에 등장하는 순서대로 실행된다. a=b+c+d; 연산문은 b와 c를 먼저 더하고 그 결과와 d를 다시 더하는데 덧셈은 교환 법칙이 성립하므로 사실 결합 순서가 큰 의미가 없다. 앞서 실습한 바 있는 다음 대입문을 보자.

 a=b=c=3;

 이 대입문은 a, b, c 모두 3을 대입하는데 대입 연산자는 오른쪽 우선이다. 즉 제일 오른쪽에 있는 c=3이 가장 먼저 실행되고 차례대로 b=c, a=b가 대입된다. 만약 대입 연산자가 왼쪽 우선 순위를 가지게 되면 a=b, b=c, c=3 순서대로 실행되어 a는 b의 쓰레기값을 가질 것이고 b는 c의 쓰레기값을 가지며 결국 3이 되는 것은 c밖에 없을 것이다.

대입 연산자가 오른쪽 우선의 결합 순서를 가지므로 복합 대입 연산자들도 모두 오른쪽 우선으로 되어 있다. 그외 단항 연산자들은 모두 오른쪽 우선 순위를 가진다. 다음 캐스트 연산문을 보자.

 (double)(unsigned)i;

(unsigned)가 먼저 실행되어 i의 부호를 없앤 후 (double)이 실행되어 실수 타입으로 바꾼다.

출처: http://winapi.co.kr/

'old > C Grammer' 카테고리의 다른 글

기억 부류  (0) 2010.11.18
함수  (0) 2010.11.17
제어문  (0) 2010.11.15
변수  (0) 2010.11.12
현정누나 요약 C/C++  (0) 2010.08.17
Posted by jazzlife
,

Observer Pattern

old/Pattern 2010. 11. 15. 16:17
Observer Pattern(옵저버 패턴)은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 (one-to-many)의존성을 정의한다.

'old > Pattern' 카테고리의 다른 글

Strategy Pattern  (0) 2010.11.08
Posted by jazzlife
,

제어문

old/C Grammer 2010. 11. 15. 12:06

1) if문

조건문이란 주어진 조건에 따라 명령의 실행 여부를 결정하는 문장이다. 프로그램이란 항상 동일한 결과만 출력하는 것이 아니라 다양한 상황을 판단하여 다르게 동작하기도 한다. 이런 판단의 상황은 우리의 실생활에도 흔히 만나게 되는데 다음은 어느 백수의 일일 생활 순서도이다.

순서도에서 사각형은 동작을 나타내며 마름모는 조건 판단을 나타낸다. 마름모 안에 있는 문장이 조건인데 조건에 따라 특정 동작을 할 것인지 말것인지를 결정할 수 있다. 프로그램도 이와 마찬가지로 여러 가지 조건에 따라 상황을 판단하여 명령의 수행 여부를 결정한다. C언어의 조건문은 키워드 if를 사용하며 다음과 같은 형식을 가진다.

if (조건) 명령;

괄호안에 조건을 쓰고 이 조건이 만족할 때 실행할 명령을 괄호 뒤에 작성한다. 괄호는 조건과 명령문을 구분하기 위해 존재하며 생략할 수 없다. 베이직 언어의 조건문은 "if 조건 then 명령"으로 조건과 명령 사이에 키워드 then이 있는데 괄호나 then이나 모두 어디까지가 조건이고 어디부터 명령인지를 구분하는 역할을 한다. 조건은 주로 변수의 값을 비교하는 연산식인데 이때 다음과 같은 비교 연산자가 사용된다.

연산자

조건

==

좌변과 우변이 같다.

!=

좌변과 우변이 다르다.

>

좌변이 우변보다 크다.

<

좌변이 우변보다 작다

>=

좌변이 우변보다 크거나 같다.

<=

좌변이 우변보다 작거나 같다.

 수학에서 쓰는 등호, 부등호와 거의 유사하다. 단, 같다라는 조건은 =를 쓰지 않고 = 기호를 두 번 써서 ==로 표현한다. 그리고 다르다는 표현은 !=이라는 점을 주의하도록 하자. 부등 비교 연산자는 수학에서 ,≥로 표기하지만 이런 문자가 키보드에 없기 때문에 >=, <=로 표기하는데 =>, =<가 아님도 주의하도록 하자. "크거나 같다"라고 하지 "같거나 크다"라고는 하지 않으므로 자연어의 순서에 맞게 부등호가 먼저 온다고 외워 두면 헷갈리지 않을 것이다. 다음은 비교 연산자를 사용한 조건문의 예이다.

if (i == 5)           // i가 5이면
if (i != 5)            // i가 5가 아니면
if (i > 5)            // i가 5보다 크면

블록 안에 하나의 명령만 들어 있지만 { } 괄호로 묶었으므로 형태상 복문이다. 이 조건에 포함되는 다른 명령이 추가될 경우 { } 괄호안에 명령만 써 넣으면 된다. 명령을 미리 { }안에 작성해 놓으면 명령이 추가될 때 실수를 줄일 수 있고 소스를 읽기도 편해진다. 미리 { } 괄호를 싸 두지 않으면 명령만 추가하고 { } 괄호로 묶는 것을 깜박 잊어 버리는 경우가 많다. 아예 if 문의 기본 형식을 다음과 같이 암기하고 있는 것이 좋다.

if (조건) { 명령들 }

if 문의 기본 형식에 원래부터 { }가 포함된 것으로 생각하는 것이 바람직하며 if문을 입력할 때도 조건 다음에 아예 { }를 먼저 입력해 놓고 이 안에 명령을 작성하는 습관을 들여야 한다. 설사 if 조건에 걸리는 명령이 하나밖에 없어 { } 괄호가 불필요하더라도 이 괄호 때문에 프로그램이 더 커지거나 느려지거나 하지는 않는다. 블록은 하나의 문장으로 취급되므로 문장이 들어갈 수 있는 위치라면 블록도 언제나 들어갈 수 있다.

다음은 if문을 한 단계 더 확장해 보자.

if (조건) 명령1; else 명령2;

기본 if문은 조건이 만족할 때 특정 명령을 실행할 것인가 아닌가만 지정하는데 비해 else 문은 조건이 만족되지 않을 때의 동작까지도 같이 지정한다. else는 말 그대로 "그 외에"라는 뜻이며 조건이 만족되지 않을 때 실행할 명령을 지정한다. else가 있는 if문은 괄호안의 조건을 평가해 보고 이 조건이 참이면 명령1을 실행하고 거짓이면 명령2를 실행한다.

if (조건1) 명령1; else if (조건2) 명령2; else 명령3;

if (조건1) 명령1; else { if (조건2) 명령2; else 명령3 };


2) for 반복문

반복문은 비슷한 명령들을 여러 번 실행하는 제어 구조이다. 컴퓨터가 처리하는 데이터가 원래 반복적인 성격을 가지고 있기 때문에 반복문은 아주 많이 사용된다. 사실 컴퓨터가 제일 잘 하는 일이 아무 생각없이 주어진 명령을 계속 반복해 대는 것이다. 생각이 없다보니 속도도 빠르고 같은 일을 계속 시켜도 불평이 없다.

1번 학생부터 60번 학생까지 총점과 평균을 구하는 프로그램을 작성해야 한다면 똑같은 과정을 60번 반복해야 한다. 각 계산에서 달라지는 것은 학생의 번호뿐이며 총점을 구하는 방법이나 평균을 구하는 공식이 달라지는 것은 아니다. 이럴 때는 똑같은 처리를 60번 나열하는 것보다 한 번만 작성해 놓고 이 처리를 60번 반복하도록 하는 것이 훨씬 더 간단하다.

프로그램에서 이렇게 반복되는 부분을 루프(loop)라고 한다. 루프를 구성하는 방법에는 여러 가지가 있는데 C언어의 기본적인 반복문은 for문이다. for문의 형식은 다음과 같다.

for (초기식;조건식;증감식) 명령;

초기식 : 반복문은 보통 특정 변수가 일정한 범위에 있는 동안에 실행된다. 이때 반복문을 통제하는 변수를 제어 변수라고 한다. 초기식은 제어 변수의 초기값을 지정하며 루프가 시작될 때 한 번만 수행된다. i=0 이나 count=3 같은 대입문의 형식을 가지는 것이 보통이다.

조건식 : 반복문이 언제까지 실행될 것인가를 지정하며 이 조건이 참인동안 계속 루프를 돈다. 루프 실행을 계속할 계속 조건(탈출 조건이 아니라)이므로 조건이 거짓이 되면 루프를 탈출한다. 조건을 나타내므로 i < 10 또는 count < 100와 같은 제어 변수에 대한 비교 연산문이 온다. 조건문은 루프가 실행될 때마다 계속 평가된다.

증감식 : 한 번 루프를 돌 때 제어 변수를 얼마나 증감시킬 것인가를 지정한다. i=i+1 같이 제어 변수의 값을 변화시키는 연산문이 온다. 루프가 한 번 실행될 때 증감식도 한 번 실행된다.

명령 : 반복 실행될 명령이다. 하나의 명령이 올 수도 있고 { } 로 둘러싸인 복문이 올 수도 있는데 반복적인 처리는 보통 복문인 경우가 많다. 설사 루프에 포함된 명령이 하나뿐이더라도 실수 방지와 확장 편의성을 위해 가급적이면 { } 괄호를 싸 복문을 구성하는 것이 좋다.

for (i=1;i<=100;i=i+2)               // 1~100사이의 모든 홀수에 대해 반복
for (i=100;i>0;i=i-1)                 // 100~1까지 1씩 감소하며 역순으로 반복
for (f=0.1;f<=10.0;f=f+0.1)              // 0.1~10.0까지 0.1씩 증가하며 반복

(무한루프)

무한 루프란 반복 횟수가 미리 정해져 있지 않고 무한히 반복되는 루프이다. 제어 변수를 사용하는 루프는 제어 변수가 일정한 범위에 있을 때만 반복하므로 실행 회수가 미리 정해져 있는데 비해 무한 루프는 실행 회수를 미리 알 수 없다. 무한 루프를 만드는 방법은 아주 간단하다.

for (;;) {
           
명령;
}
 

조건식을 명시하지 않으면 이 조건은 항상 참으로 평가되기 때문에 루프가 끝나지 않게 된다. 그렇다면 무한 루프는 정말 무한히 반복되는가 하면 그렇지는 않다. 만약 정말로 무한히 반복된다면 루프 바깥의 코드가 실행될 수 없으므로 시스템 다운 상태가 되고 말 것이다. 무한 루프의 정확한 정의는 반복 회수가 가변적인 루프를 의미한다.

루프 자체에는 종료 조건이 포함되어 있지 않으며 명령을 실행하다가 일정한 조건이 되면 루프를 탈출한다. 즉 무한 루프란 형식상 무한히 반복되도록 해 놓고 루프 내부에서 끝낼 시점을 결정하도록 하는 루프이다. 그래서 무한 루프의 명령 블록에는 루프 탈출 처리가 반드시 포함되어 있어야 한다. 루프를 탈출할 때는 break문을 사용하는데 break는 조건식을 무시하고 강제로 루프를 종료하는 명령이다. 무한 루프의 일반적인 형태는 다음과 같다.

for (;;) {
     명령;
     if (탈출조건)
          break;
}

(다중루프)

다중 루프란 두 개 이상의 루프가 겹쳐 있는 제어 구조이다. 루프 안에는 반복의 대상이 되는 명령이 들어가는데 이 명령이 또 루프라면 이중 루프가 된다. 어떤 명령을 반복하는 동작을 또 반복하는 것이다. 그만큼 반복이란 흔한 동작이다. 다중 루프의 전형적인 예인 구구단 프로그램을 만들어 보자.

 다중 루프란 루프가 중첩(Nesting)되어 있는 것이다. 즉, 루프안에 루프가 완전하게 포함되어 있을 때 이를 다중 루프라 한다. 단순히 루프가 계속 이어진다고 해서 다중 루프가 아니다. 다음 예를 보자.

 

for (i=...) {
}
for (j=...) {
}

i루프와 j루프가 있지만 j가 i에 포함되어 있지 않고 i루프 바깥에 있다. 그래서 i루프가 완전히 종료되면 j루프가 시작된다. 이것은 단순 루프가 두 개 있는 것이지 다중 루프가 아니다.

for (i=...) {
    for (j=...) {
    }
}


3) while 반복문

while문은 for 문과 유사한 반복문이되 성격이 조금 다르다. 기본 형식은 다음과 같으며 키워드 while을 사용한다는 것 외에는 if문과 동일하다. if문은 딱 한 번만 조건을 판단하여 명령의 실행 여부를 결정하는데 비해 while문은 조건이 만족하는동안 명령을 계속 실행한다는 점이 다르다.

while (조건) 명령;

명령 자리에는 물론 여러 개의 명령을 묶어 놓은 복문이 올 수 있으므로 while (조건) {명령들} 이라고 외워두는 것도 좋다. while의 영어 뜻 그대로 조건이 참인 "동안" 명령을 계속 반복한다. 초기식이나 증감식 같은 것은 따로 없으므로 명령 블록에서 루프를 끝낼 수 있도록 해야 한다.

while문으로도 while (TRUE) 명령; 형식으로 무한 루프를 만들 수 있다. 조건이 TRUE로 고정되어 있으므로 while의 조건은 항상 참이 되어 명령을 무한히 반복할 것이다. 물론 정상적인 코드가 되기 위해서는 명령 블록 내에 일정한 조건이 되면 이 루프를 탈출(break)하는 문장이 포함되어 있어야 한다. 다음은 while문의 변형인 do while 문을 보자. 기본 형식은 다음과 같으며 do와 while이 짝을 이루어 사용된다. do만 있고 뒤에 while이 없으면 에러로 처리된다.

do 명령; while (조건);

 do 다음의 명령을 while의 조건이 만족하는 동안 반복적으로 실행하는데 파스칼의 repeat until 제어문과 동일하다. 명령은 보통 복문이 오므로 { } 괄호를 싸 주어야 한다.

for문 : 가장 큰 특징은 제어 변수를 사용한다는 점이다. 루프를 통제하는 변수를 선언하고 이 변수가 일정한 범위의 값을 가지는 동안 명령을 계속 반복한다. 그래서 통상 for문은 반복 횟수가 이미 정해져 있고 루프 중간에서 탈출하는 경우가 별로 없다. 물론 break문으로 강제로 탈출할 수도 있지만 일반적으로 반복 횟수가 정해져 있다. 그래서 for문은 1~100까지, 1번 학생~60번 학생까지의 경우처럼 미리 정해진 횟수만큼 반복할 때 가장 편리하다. 또한 문장안에 초기식, 조건식, 증감식이 포함되어 있어서 루프의 선두만 봐도 변수의 변화를 쉽게 파악하고 변경할 수 있다.

while문 : 루프를 계속할 조건만 있고 초기식이나 증감식이 없다. 아예 제어 변수라는 개념이 없으며 루프 내부에서 조건식의 진위 여부를 변경해야 한다. 그래서 while문은 반복 횟수가 가변적이다. 사용자의 입력이나 네트워크의 변화, 특정 신호의 입력 등 언제 발생할지 모르는 조건에 대해 반복할 때는 while문을 쓰는 것이 적합하다.

do~while : while문과 마찬가지로 제어 변수가 없고 반복 횟수가 가변적이지만 조건을 점검하는 시기가 다르다. while문은 루프로 들어가기 전에 조건을 점검하지만 do~while문은 일단 명령을 실행한 후 루프 계속 여부를 점검한다. 그래서 while문은 조건에 따라 한 번도 실행되지 않을 수도 있지만 do~while문은 최소한 한 번은 실행된다는 차이점이 있다. 요약하자면 while문은 선평가 후실행문이며 do~while문은 선실행 후평가문이다.

 

세가지 반복문은 상호 대체성이 있어서 for문 대신 while문을 쓸 수도 있고 while문 대신 do~while을 쓰는 것도 가능하다. 다음은 for문을 동일한 while문으로 변환하는 공식이다.

for (초기식;조건식;증감식) {

     명령;

}

초기식;

while(조건식) {

     명령;

     증감식;

}

 초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 while문으로도 for문과 똑같은 구조를 만들 수 있다. 물론 완전히 같지는 않아서 루프 내부에서 continue명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령;도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 없으므로 실행 속도는 제어문을 선택하는 기준이 아니다.

하지만 어느 쪽이 더 효율적이고 코드의 가독성이 높은지, 부작용은 없는지를 비교해 보면 세가지 반복문 중 가장 적절한 것이 있을 것이다. 세가지 제어 구조의 특징을 잘 파악해야 상황에 가장 적절한 반복문을 선택할 수 있다. 1~100까지 숫자의 합계를 구하는 루프는 for문이 가장 적당하다. 반복 범위가 미리 정해져 있고 이 값이 루프내에서 사용되어야 하므로 제어 변수를 쓰는 것이 효율적이며 코드도 훨씬 더 짧고 명료하다.

정수를 입력받고 홀짝을 판별해서 메시지를 출력하는 일련의 코드를 do~while 루프로 감싸고 while의 조건문에 (i != 0)이라고 적으면 된다. 프롬프트를 출력하고 정수를 입력받은 후 홀짝 판별을 하는 코드 전체가 반복 단위임을 잘 파악해야 한다. 다음과 같이 반복 대상을 잘못 선택하면 엉터리로 동작하거나 차칫하면 무한 루프에 빠져 버릴 위험이 있다.

printf("정수를 입력하세요(끝낼 때는 0) : ");

do {

     scanf("%d",&i);

     if (i % 2 == 0) {

          printf("%d는 짝수입니다.\n",i);

     } else {

          printf("%d는 홀수입니다.\n",i);

     }

} while (i != 0);


printf("정수를 입력하세요(끝낼 때는 0) : ");

scanf("%d",&i);

do {

     if (i % 2 == 0) {

          printf("%d는 짝수입니다.\n",i);

     } else {

          printf("%d는 홀수입니다.\n",i);

     }

} while (i != 0);

 do~while문은 정수 하나를 입력받아 이 값의 홀짝을 판별한 후 i값을 평가해 보고 이 과정을 계속할 것인지 그만 둘 것인지를 결정한다. i가 0이 아니면 루프를 계속 실행하고 0이면 루프를 탈출한다. 따라서 0이 입력될 때까지 이 과정을 계속 반복할 것이다.


4) switch 문


다중 선택문이란 하나의 변수값을 평가하여 각 값에 대해 개별적인 처리를 지정할 수 있는 문장이다. 예를 들어 사용자가 입력한 숫자가 1일 때는 이렇게 하고, 2일 때는 저렇게 하고, 3일 때는 요렇게 하고 각각의 값에 대한 처리를 다르게 지정하고자 할 때 다중 선택문을 사용한다. 키워드 switch를 사용하며 기본 형식은 다음과 같다.

switch (변수) {

case 값1: break;

case 값2;

     // 값2에 대한 처리

     break;

}

switch문 다음의 괄호안에 평가할 변수를 적고 case문에 이 변수가 가질 수 있는 값과 이 값에 대한 처리 코드를 작성한다. case를 끝낼 때는 break문으로 switch 블록을 강제로 탈출해야 한다. case는 원하는만큼 얼마든지 작성할 수 있다. default는 case의 특별한 경우로 변수가 앞쪽 case에 있는 값 이외의 값을 가질 때의 처리를 지정한다.


5) 그 외 제어문

가) goto

goto문은 지정한 곳으로 무조건 점프하는 제어문이다. goto라는 말이 의미하듯이 조건없이 무조건 제어를 옮겨 버리기 때문에 사실 가장 사용하기 쉬운 제어문이다. goto로 제어를 옮길 지점은 레이블(label)이라는 것으로 표식을 단다. 블록의 끝만 제외하고 프로그램의 어느 곳에나 레이블을 배치해 놓고 goto 레이블명; 이라는 명령을 내리면 레이블 위치로 즉시 이동한다. 레이블보다 앞에서 뒤로 이동할 수도 있고 뒤에서 앞으로 이동할 수도 있되 단 함수 내에서만 이동할 수 있으며 다른 함수로는 점프할 수 없다.

레이블은 일종의 명칭이므로 명칭 규칙에만 맞으면 자유롭게 작성할 수 있다. 레이블 다음에 콜론(:)을 붙여 점프할 위치에 삽입해 놓기만 하면 된다. 다음이 goto문의 사용예이다.

here:
.....
.....
goto here;

점프하기를 원하는 곳에 here라는 이름으로 레이블을 붙여 놓고 goto here; 명령을 내리면 즉시 here 다음의 문장으로 이동한다. 다른 순환문과는 달리 복잡한 형식을 필요로 하지 않기 때문에 처음부터 제어 구조를 설계할 필요도 없고 언제든지 어느 곳으로나 제어를 옮길 수 있는 무척 간편한 명령이다.


나) break

break문은 이미 앞에서 여러 번 사용해 본 바 있다. 이 명령은 반복문이나 switch문 내에서 사용되며 루프를 강제로 벗어날 때 사용한다. for문이나 while문 내에서 break가 사용되면 조건식의 진위 여부에 상관없이 즉시 루프를 탈출하는데 우리말로 번역하자면 "당장 튀어 나와"라고 할 수 있다. 보통 if 조건문과 함께 사용되며 무한 루프에서 루프를 끝낼 조건이 되었을 때 break를 사용한다.

여러 개의 루프가 중첩되어 있는 다중 루프에서 break문이 사용되면 현재 루프 하나만 탈출한다. 다음은 이중 루프의 예이다.

for (i=...) {
     for (j=...) {
          break;
     }
}

다) continue

continue는 루프의 나머지 부분을 무시하고 조건 점검부로 점프하여 루프의 다음 값을 실행하도록 하는 명령이다. 루프를 돌던 중에 특정 조건에 대해서는 처리를 제외시키고자 할 때 이 명령을 사용한다. 루프의 조건을 다시 점검하도록 할 뿐이지 루프를 처음부터 다시 시작하는 것은 아니므로 제어 변수의 값은 그대로 유지되며 다음 증감문으로 이동한다.

for (i=...) {
     for (j=...) {
          continue;
     }
}

continue는 실전에서 그다지 자주 사용되지는 않으며 비교적 정밀한 제어 구조를 만들 때 가끔씩 사용된다.

출처: http://winapi.co.kr/

'old > C Grammer' 카테고리의 다른 글

기억 부류  (0) 2010.11.18
함수  (0) 2010.11.17
연산자  (0) 2010.11.16
변수  (0) 2010.11.12
현정누나 요약 C/C++  (0) 2010.08.17
Posted by jazzlife
,

heterogeneous ; 이종

Heterogeneous는 서로 다른 종류라는 뜻을 가지는 "이종(異種)"으로 번역될 수 있는데, 구성요소들이 서로 비슷하지 않은 특성을 지칭한다. 정보기술에서 이러한 용어는 서로 다른 제작사에서 만들어졌지만, 네트웍의 일부가 되거나 또는 포함되어 상호 동작될 수 있는 제품들을 표현하기 위해 주로 사용된다. 이종망은 여러 제품들 공통으로 사용된 하드웨어소프트웨어 인터페이스가 표준을 만족하여 서로 통신할 수 있도록 함으로써 구현이 가능하다. 인터넷이 바로 이종망의 대표적인 예이다.

'old > 용어정리' 카테고리의 다른 글

internationalization ("I18N") ; 국제화  (0) 2010.11.16
I/O (input/output) ; 입출력  (0) 2010.11.16
header ; 헤더  (0) 2010.11.15
hardware ; 하드웨어  (0) 2010.11.15
HCI (human-computer interaction)  (0) 2010.11.15
Posted by jazzlife
,

header ; 헤더

old/용어정리 2010. 11. 15. 11:37

header ; 헤더

정보기술에서 헤더란, 일반적으로 어떤 것의 앞에 나오는 것으로서, 보통 어떤 단위들이 표준적으로 반복되는 부분에 사용된다. 헤더는 각각 고유의 값을 가지고 있는 여러 개의 필드로 구성될 수 있다. 여기에 4가지 일반적인 용례를 나열하였다.

  1. 문서에서 헤더는 각 페이지의 맨 위에 출력되도록 만든 텍스트나 이미지 등의 조합이다.
  2. 전자우편에서 헤더는 발신자, 수신인 주소, 수신자, 메시지 우선 순위 등이 적힌 메시지의 한 부분을 말한다.
  3. 컴퓨터 파일에서 헤더는 파일의 본 내용에 앞서 맨 앞에 붙어 있어서, 내용의 길이라든가 파일의 다른 특성들을 기술하고 있는 필드이다.
  4. 네트웍 전송 단위에서 헤더는 데이터나 제어신호 등에 앞서서 파일 또는 전송단위에 대해, 그것의 길이, 논리적이나 물리적으로 그것과 관계 있는 다른 파일이나 전송단위의 존재여부 등을 나타낸다.

'old > 용어정리' 카테고리의 다른 글

I/O (input/output) ; 입출력  (0) 2010.11.16
heterogeneous ; 이종  (0) 2010.11.15
hardware ; 하드웨어  (0) 2010.11.15
HCI (human-computer interaction)  (0) 2010.11.15
GUI (graphical user interface) ; 그래픽 사용자 인터페이스  (0) 2010.11.15
Posted by jazzlife
,

hardware ; 하드웨어

하드웨어는 컴퓨터, 통신 및 기타 정보기술이 이용되는 장치들에 있어 물리적인 측면을 의미한다. 이 용어는 컴퓨터 본체, 전자회로 및 컴퓨터의 부품 등을 '프로그램'과 구분하기 위한 방편으로 나왔다. 프로그램은 보통 소프트웨어로 분류된다.

하드웨어라는 용어는 내구성과 불변성이 있음을 은연중에 암시한다. 소프트웨어와 마찬가지로, 하드웨어도 집합명사로서, 컴퓨터 그 자체뿐 아니라, 케이블, 커넥터, 전원공급장치와 함께 키보드, 마우스, 스피커, 프린터 등 주변장치를 모두 포함할 수 있다.

하드웨어는 때로 전화와 통신 네트웍 기반시설의 물리적인 측면을 나타내기 위한 집합적 의미로도 사용된다.

'old > 용어정리' 카테고리의 다른 글

heterogeneous ; 이종  (0) 2010.11.15
header ; 헤더  (0) 2010.11.15
HCI (human-computer interaction)  (0) 2010.11.15
GUI (graphical user interface) ; 그래픽 사용자 인터페이스  (0) 2010.11.15
gigabit ; 기가비트  (0) 2010.11.15
Posted by jazzlife
,

HCI (human-computer interaction)

[참고] 그래픽 사용자 인터페이스도 함께 볼 것

HCI[에치씨아이]는 사람이 컴퓨터와 어떻게 상호작용을 하는지, 또 컴퓨터가 사람들과 성공적인 대화를 나눌 수 있기 위해 어느 정도까지 개발되어질 수 있는지에 관한 연구이다. 많은 수의 대기업이나 학교 연구소에서 현재 HCI에 관한 연구가 진행중이다. 약간의 예외는 있지만, 과거에는 컴퓨터 시스템 개발자들이 컴퓨터를 사용하기 쉽게 하는데 별로 관심을 두지 않았었다. 오늘날의 많은 컴퓨터 사용자들은, 아직도 컴퓨터 제작자들이 자신들의 제품을 쓰기 편리하게 만드는데 충분한 관심과 배려를 하지 않고 있다고 주장한다. 그러나, 컴퓨터 시스템 개발자들은, 컴퓨터의 설계와 제작은 지극히 복잡한 것이며, 컴퓨터가 제공할 수 있는 서비스에 대한 요구가, 쉬운 사용법에 대한 요구보다 항상 더 많았다고 주장할지 모른다.

HCI 요소 중 중요한 하나는, 사용자들마다 그들의 대화에 관해 다른 생각이나 지적 모델을 형성하고 있으며, 각기 다른 학습방법과 지식 및 기술에 대한 보존방법을 가지고 있다는 것이다. 그 외에 문화적이고 국가적인 차이도 한 부분을 형성한다. HCI를 연구하고 설계하는데 있어 또다른 고려사항은, 이전의 연구결과에서는 적용될 수 없었던 새로운 대화방법의 가능성이 제공되는 등 사용자 인터페이스 기술이 빠르게 변화한다는 것이다. 마지막으로, 새로운 인터페이스에 숙달되면서 점차 사용자 선호도가 변한다는 것이다.

Posted by jazzlife
,

GUI (graphical user interface) ; 그래픽 사용자 인터페이스

[참고] HCI (human-computer interaction) 항목도 함께 볼 것

GUI[지유아이 또는 구-이]는 순전한 텍스트보다는 오히려 그래픽을 통해 사용자와 컴퓨터간 인터페이스를 구현하는 것이다. 이 용어는 컴퓨터와의 사용자 인터페이스가 처음에는 그래픽이 아니고, 텍스트와 키보드 중심이며, 보통 사용자가 외워야하는 명령들로 구성되어 있고, 컴퓨터는 지나치게 간단하게 응답하는 등의 이유 때문에 생겨났다. DOS의 명령어 인터페이스가 GUI가 나타나기 이전의 대표적인 사용자 인터페이스의 예이다 (윈도우95나 98에서도 여전히 DOS 모드로 들어가서 그것이 어떤 것인지 볼 수 있다). 명령 중심의 인터페이스와 GUI 사이의 중간단계의 사용자 인터페이스는, 키보드로 명령어를 치는 대신에 마우스로 동작시킬 수 있는 메뉴 기반의 인터페이스였다.

오늘날의 주요 운영체계는 그래픽 사용자 인터페이스를 지원한다. 응용프로그램들도 대부분 운영체계와 함께 따라 오거나 또는 자신들만의 GUI 요소와 아이디어를 가미해서 사용한다. GUI는 실제 생활에서 잘 알려진 하나 또는 그 이상의 객체들을 비유적으로 사용하는데, 그 예로는 바탕화면이라든가, 창(윈도우)을 통해 보는 것 또는 건물 내에 물리적인 배치 등이 있다. GUI의 요소들은 윈도우, 풀다운 메뉴, 단추들, 스크롤바, 아이콘 이미지, 위저드, 마우스 같은 것들을 포함하며, 필시 아직 발명되지 않는 많은 것들까지도 포함한다. GUI의 일부로서 멀티미디어의 사용이 증가함에 따라, 많은 응용프로그램에서 소리, 음성, 동영상 및 가상현실 인터페이스 등도 GUI의 일부가 될 것으로 보인다. 어떤 한 시스템의 그래픽 사용자 인터페이스는 그것의 입력장치들과 함께, 그것의 "look-and-feel"이라고 불린다.

'old > 용어정리' 카테고리의 다른 글

hardware ; 하드웨어  (0) 2010.11.15
HCI (human-computer interaction)  (0) 2010.11.15
gigabit ; 기가비트  (0) 2010.11.15
garbage and garbage-collecting ; 가배지 또는 자투리 모으기  (0) 2010.11.15
freeware ; 프리웨어  (0) 2010.11.11
Posted by jazzlife
,

gigabit ; 기가비트

데이터 통신에서, 기가비트는 109 비트 즉 1,000,000,000 비트를 의미한다. 이것은 두 지점간에 초당 전송되는 데이터 량을 측정하기 위해 보편적으로 사용된다. 예를 들어, 이더넷의 고속형인 기가비트 이더넷은, 대략 초당 1 기가비트의 데이터 전송속도를 제공한다. 1초에 기가비트가 전송되는 속도를 줄여서, Gbps라고 표기한다.

일부 자료에서는 기가비트를 230비트인 1,073,741,824 비트라고 설명하기도 한다. 그러나, 비트가 비록 2진수 체계의 단위이긴 해도, 데이터 통신에서의 비트는 이산 신호 펄스이며, 전통적으로 10진수 체계를 사용하여 세어 왔다. 예를 들어, 28.8 Kbps는 초당 28,800 비트를 전송하는 속도이다. 바이트의 경우에는 컴퓨터 구조와 메모리 주소의 한계 때문에 항상 2의 지수를 사용한다.

Posted by jazzlife
,

garbage and garbage-collecting ; 가배지 또는 자투리 모으기


컴퓨터 분야에서 가배지란, 다음과 같이 두 가지의 의미가 있다.

  1. 사용자의 지각적인 측면에서의 가배지란 종종 컴퓨터 화면상에 나타나있지만 정상적으로 읽거나 볼 수 없는, 즉 쓰레기와 같은 정보들을 말한다. 이것은 GIF 그림 파일과 같은 그래픽 파일이나 바이너리 파일들을 텍스트 전용의 검색 프로그램으로 읽어보려는 시도를 할때 자주 생긴다. 이 경우는 단지 내용면에서 문제가 없는 완벽한 하나의 파일을 엉뚱한 프로그램을 이용하여 읽어보려는 경우지만, 검색하는 사람의 입장에서 화면에 나타나 있는 것들은 마치 "쓰레기"나 다름없다고 생각할 수도 있기 때문이다.
  2. 프로그래밍의 관점에서의 가배지는, 메모리 공간 내에서 더 이상 필요치 않다고 판단되어 운영체계에 의해 회수된 데이터 저장공간을 말한다. 이런 메모리 공간을 다른 프로그램들이 효율적으로 재사용할 수 있도록 풀어주는 것을 가배지 컬렉션, 즉 '자투리 모으기'라고 말한다.
    '자투리 모으기'라는 용어는 LISP 이라는 프로그램 언어에서 처음으로 사용된 것으로 보인다. 과거에는 프로그래머들이 필요한 저장공간을 명시적으로 선언하고, 그 공간들이 더 이상 필요치 않을 때에는 시스템에 반환하도록 프로그램을 작성해야만 했다 (사용치 않는 저장공간들을 반환하는 것을 소홀히 하는 프로그램들은 운영체계에 의해 강제로 종료될 수도 있다). 자바는 최근의 프로그램 언어이지만, LISP과 같이 자투리 모으기를 지원함으로써 프로그래머들이 그러한 것으로부터 신경 쓰지 않아도 되도록 지원한다.

'old > 용어정리' 카테고리의 다른 글

GUI (graphical user interface) ; 그래픽 사용자 인터페이스  (0) 2010.11.15
gigabit ; 기가비트  (0) 2010.11.15
freeware ; 프리웨어  (0) 2010.11.11
format ; 포맷  (0) 2010.11.11
footprint  (0) 2010.11.11
Posted by jazzlife
,

변수

old/C Grammer 2010. 11. 12. 16:22

1-1. 변수의 정의

변수는 고정되어 있지 않은 수라는 뜻이며 1이나 45 또는 3.14같은 상수의 반대 개념이다. 이름은 변수이지만 반드시 수치값만 저장되는 것은 아니며 문자열이나 포인터같은 좀 더 복잡한 값도 저장될 수 있다. 변수에서 말하는 수(數)를 좀 더 일반적으로 표현하면 데이터(data)이며 한국말로 알아듣기 쉽게 설명하면 값이다.

80386이상의 CPU는 최대 4G까지의 메모리를 장착할 수 있다. 40억개나 되는 이런 기억 소자들에 대해 이놈, 저놈, 개똥이, 말똥이 같은 이름을 일일이 붙여줄 수는 없다. 그래서 컴퓨터는 연산 대상 메모리의 위치를 구분하기 위해 숫자로 된 번지(Address)라는 개념을 사용한다. 메모리를 구성하는 각 바이트들은 0부터 시작해서 40억까지의 고유한 번지를 가지고 있으며 이 번지를 대상으로 값을 읽거나 쓴다. 예를 들어 "1234번지에서 1237번지까지의 4바이트에 56을 기록한다" 는 식으로 동작한다.

그런데 번지라는 것은 사람의 입장에서 보면 굉장히 다루기 힘든 형태로 되어 있다. 번지는 값이 크기 때문에 통상 8자리의 16진수로 표현하는데 사람들이 흔히 쓰는 10진수를 쓰면 자리수가 가변적이어서 오히려 더 혼란스럽다. 16진수는 각 자리수의 형태가 비슷 비슷하기 때문에 사람이 그 위치를 정확하게 기억하기 힘들다. 예를 들어 어떤 값이 0x183c7eda번지에 저장되어 있다면 사람이 이 위치를 암기하여 사용하는 것은 거의 불가능하다. 이런 값을 10개만 사용해도 사람의 머리로는 각 값을 구분할 수 없다. 즉 번지라는 것은 전혀 인간적이지 않은 기계의 값이다.

그래서 번지를 직접 사용하는 대신 좀 더 기억하기 쉬운 변수를 사용한다. 숫자로 된 번지에 별도의 이름을 붙여 놓은 것이 바로 변수이다.



이렇게 이름을 붙여 놓으면 Num=56같이 간단하게 값을 기록할 수 있고 Result=Num같이 값을 읽기도 쉬워진다. 만약 변수라는 것이 없다면 두 값을 더해 다른 변수에 대입하고자 할 때 다음과 같은 식을 사용해야 할 것이다. 다음 표현식에서 [ ] 기호는 이 번지에 들어있는 값을 의미한다.

 

[0x3e98234a] = [0x3eff81a0] + [0x3d00aef6]

 

이런 숫자, 그것도 16진수의 나열보다는 salary=pay+bonus가 사람에게 훨씬 더 쉬우며 변수의 이름이 대상을 잘 표현할수록 더욱 쉬워진다. 컴파일러는 변수가 실제 어떤 번지를 가리키는지를 기억하고 있다가 이 변수를 사용하면 실제 번지에 값을 읽거나 쓰는 코드를 대신 작성해 준다. 흔히 변수는 값을 저장하는 상자에 비유되곤 한다. 상자에 물건을 넣어 두듯이 변수를 하나 만들어 놓으면 여기에 값을 저장하거나 다시 꺼내올 수 있다.

변수는 C언어의 구성 요소 중에 명칭으로 분류된다. 그래서 명칭을 작성하는 일반적인 규칙대로 자유롭게 작성할 수 있다. 키워드는 쓸 수 없고 영문, 숫자, 밑줄 문자로만 구성되어야 하며 대소문자를 구분한다. 이런 문법적인 제약 외에도 변수명을 작성하는 일반적인 몇 가지 법칙이 있다.

 

 의미를 잘 설명할 수 있는 이름을 주는 것이 좋다. 사람의 이름을 기억한다면 Name이라는 이름을 쓰는 것이 좋고 평균값을 기억하는 변수에는 Average, 위치를 기억한다면 Position 같은 이름을 준다. a, b, ttt 같은 의미없는 이름을 쓰는 것도 물론 가능은 하지만 변수의 수가 많아지면 변수끼리 구분하기 어려워진다.

 변수명의 길이에는 제약이 없지만 3~10자 내외로 작성하는 것이 좋다. Num, TotalScore, NowStage 등이 좋은 예이다. Highest_Score_Of_Today와 같이 변수명을 길게 쓰면 의미를 분명하게 나타낼 수는 있지만 변수명을 기억하기 어려워지고 오타를 입력할 가능성이 많아져 바람직하지 않다.

 대소문자 구성을 일관되게 하는 것이 좋다. C언어는 대소문자를 구분하므로 Score와 score는 다른 변수이다. 모두 소문자로 쓰든지 아니면 첫 문자만 대문자로 쓰든지 자신만의 규칙을 정하고 그대로 따르는 것이 좋다. 선언할 때는 Score라고 해 놓고 쓸 때는 score라고 쓰면 이 변수는 선언되지 않은 것으로 에러 처리된다.

 변수명은 보통 짧은 영어 단어를 활용한다. 한글 변수명은 사용할 수 없지만 원한다면 한글같은 변수명을 사용할 수는 있다. JumSoo, Saram, Juso 같은 식으로 작성해도 된다. 좀 어색하기는 하지만 영어 실력이 부족해서 이런 변수명이 더 기억하기 쉽다면 그렇게 하는 편이 좋다. 다른 변수와 구분 가능하고 의미를 쉽게 알 수 있으므로 명칭의 요건은 제대로 만족하는 것이다.

 

처음 실습을 할 때는 편의상 a, b, i같은 짧은 변수명을 즐겨 사용하지만 실무에서는 적절한 변수명을 붙이는 것이 아주 중요하다. 좀 쓸만한 프로그램을 만들어 볼려면 수백개나 되는 변수가 필요한데 이 변수들에 아무렇게나 이름을 붙여 놓으면 정말 힘들어진다. 더구나 여럿이 같이 하는 팀 프로젝트의 경우 내맘대로 성의없이 이름을 붙이면 팀원들에게 왕따를 당하는 수가 있으며 시간이 지난 후 자기 스스로도 코드를 파악하기 어려워진다. 간단 명료한 이름을 붙이는 것은 생각보다 훨씬 더 중요하며 또한 어려운 기술이기도 하다. 



1-2. 변수의 종

변수는 메모리의 위치를 기억한다고 했다. 그러나 실제로 컴파일러가 변수를 참조할 때는 메모리 번지를 참조하는 것이 아니라 번지에 기억된 값을 참조한다. 예를 들어 Num=56이라는 대입문이 있다고 하자. 컴파일러는 이 명령을 다음 둘 중 어떤 것으로 해석할까?

 

 Num이 가리키는 번지를 56으로 바꾸어라.

 Num이 가리키는 번지에 들어있는 값을 56으로 바꾸어라.

 

상식적으로 생각해 봐도 후자가 맞다. 변수는 내부적으로 번지에 대한 위치를 가리키지만 컴파일러는 변수를 번지에 기억된 값으로 참조한다. 즉, 변수의 실체는 번지가 아니라 그 번지에 기록된 값이다. 컴파일러가 변수를 통해 값을 참조하기 위해서는 단순히 메모리 위치만 알아서는 안된다. Num이 1234번지를 가리키고 있다고 할 때 "Num을 읽어라"는 명령을 내리면 1234번지부터 어디까지를 읽어야 하는 것인지를 알아야 하므로Num의 길이가 필요하다.

또한 읽은 값을 어떻게 해석할 것인가도 알아야 한다. 메모리에는 0과 1만 나열되어 있으므로 위치와 길이 정보만으로는 값의 형태를 파악할 수 없다. 1234번지에 들어있는 값이 정수인지 실수인지 또는 구조체인지 등의 정보가 있어야 컴파일러가 이 값을 정확하게 해석할 수 있다. 정수와 실수는 값의 형태가 다르며 메모리에 기록되는 방식도 당연히 다르다. 그래서 변수로부터 값을 정확하게 읽으려면 변수의 형태에 대해서도 알아야 한다.


변수는 저장된 메모리 위치와 함께 길이와 형태에 대한 정보를 가지는데 이런 변수의 특성을 타입(Type)이라고 한다. 타입이란 컴파일러가 변수를 읽고 쓰는 방법에 대한 정보이며 타입에 따라 Num은 정수형 변수이고 Average는 실수형 변수임을 알 수 있게 된다. C언어는 아주 많은 타입을 지원한다. 일단 어떤 타입들이 있는지 정리해 보자. 크게 기본형과 유도형으로 나누어진다.

 

구분

타입

설명

기본형

정수형

정수

문자형

문자

실수형

실수

열거형

가능한 값들에 대한 나열형

void

타입이 정해지지 않은 자료형

유도형

배열

같은 타입의 자료 집합

구조체

다른 타입의 자료 집합

공용체

메모리를 공유하는 자료 집합

포인터

대상체의 번지를 가리키는 타입

함수형

함수의 번지를 가리키는 타입

 

기본형이란 하나의 단일 값을 기억하는 단순한 타입이다. 정수값 하나를 기억하는 정수형이 가장 직관적으로 이해하기 쉽고 사용 빈도도 높다. 정수형 변수는 1234나 38같은 정수값 하나를 저장할 수 있고 실수형 변수는 3.14나 1.5 같은 실수값 하나를 저장할 수 있다. 기본형은 전부 수치를 저장한다는 점에서 공통적이다.

유도형은 기본형으로부터 만들어지는 타입이다. 같은 종류의 변수 여러 개를 모으면 배열이 되고 다른 종류의 변수 여러 개를 모으면 구조체가 된다. 유도형은 다소 복잡하기 때문에 이 장에서는 소개만 하고 관련 장에서 다시 상세하게 다룰 것이다. 각 타입별로 한 장 이상씩을 차지할 정도로 유도형은 복잡하다.


1-2. 변수의 선언
 

변수를 사용하려면 먼저 선언해야 한다. 선언(Declaration)이란 컴파일러에게 앞으로 이런 이런 이름을 가진 어떤 타입의 변수를 사용하겠으니 준비해 달라고 부탁하는 것이다. 예를 들어 Num이라는 이름으로 정수형 변수를 선언하면 컴파일러는 이 변수를 위해 정수형 하나를 저장할 수 있는 메모리 4바이트를 할당한다. 앞으로 이 메모리에 들어있는 값은Num이라는 변수 이름으로 참조하면 된다. 변수를 선언하는 기본 형식은 다음과 같다.

 

타입 변수명[=초기값][,변수명변수명, ...];

 

기본 형식에서 [ ] 괄호안에 있는 것은 모두 생략 가능하다는 뜻이며 ... 표기는 임의 개수만큼 반복될 수 있다는 뜻이다. 반드시 필요한 것은 타입과 변수명, 그리고 제일 끝에 있는 세미콜론밖에 없다. 변수 선언문도 문장이므로 끝에 세미콜론은 반드시 있어야 한다. 정수형 변수 Num을 선언하고 싶다면 다음과 같이 선언문을 작성한다.

 

int Num;

 

잠시 후에 다시 배우겠지만 정수형 타입은 int키워드로 표현한다. 이렇게 선언만 하면 Num을 위해 메모리가 할당된다. 그러나 할당만 되며 값은 초기화되지 않는데 C는 속도를 위해 특별한 지정이 없으면 변수값을 초기화하지 않는다. 성능을 최우선으로 하는 C의 특징을 잘 보여주는 대목이다. 이렇게 되면 변수는 할당된 번지에 원래부터 들어 있던 의미없는 값을 가지게 되며 이 값을 쓰레기값(Garbage)이라고 한다. 만약 선언과 동시에 어떤 값으로 초기화하고 싶다면 변수명 다음에 = 구두점을 쓰고 원하는 초기값을 뒤에 쓰면 된다.

 

int Num=12;

 

Num 변수가 선언됨과 동시에 이 변수가 12라는 값을 가지도록 초기화된다. C는 성능을 최우선으로 하기 때문에 명시적인 지정이 없으면 별다른 동작을 하지 않는다. 초기값이 필요없으면 선언만 하고 필요할 때만 초기값을 지정한다. 여러 개의 변수를 같은 타입으로 한꺼번에 선언할 수도 있는데 콤마로 구분된 변수명을 계속 나열하면 된다. 이때도 = 구분자로 그 중 일부를 초기화할 수 있다.

 

int a,b=3,c,d;

 

4개의 정수형 변수가 선언되며 이 중 b는 3으로 초기화된다. 물론 다음처럼 각각의 변수 선언을 별도의 명령으로 따로 선언해도 상관없다. 효과는 동일하지만 줄 수가 길어진다.

 

int a;

int b=3;

int c;

int d;

 

다른 타입의 변수는 한꺼번에 같이 선언할 수 없으며 각각 따로 선언해야 한다. 다음은 정수형 변수 두 개와 실수형 변수 하나를 선언한 것이다.

 

int angle, radius;

double ratio;

 

변수는 필요한만큼 얼마든지 선언할 수 있다. 앞장에서 실습했던 삼각형 그리기 예제를 보면 두 개의 정수형 변수 i와 j를 선언하고 있다.






3. 정수형

2-1. 정의

정수(Integer)란 부호는 있지만 소수점 이하를 표현하지 못하는 수이다. 0, -23, 156 이런 값들은 정수이며 1.28, 25.4 이런 값은 소수점 이하가 있으므로 정수가 아니다. 정수의 정의는 중학교 수학 수준에서 설명되는 것이므로 더 상세한 설명이 필요하지는 않을 것이다. 단, 컴퓨터의 메모리는 유한하기 때문에 수학적 정의와 같은 무한대의 범위를 지원하지 않는다는 정도만 다르다.

정수형이란 이런 정수값을 저장할 수 있는 타입이다. 컴퓨터라는 존재가 원래 정수적인 존재이고 실생활에서 가장 많이 사용되는 수이기 때문에 정수형 타입이 가장 흔하게 사용된다. 정수형 변수의 타입 이름은 Integer의 앞 세 자를 딴 int이다. 따라서 정수형 변수 i를 선언하려면 다음과 같은 선언문을 사용한다.

 

int i;

 

키워드 int 다음에 원하는 변수 이름 그리고 세미콜론으로 구성되어 있다. 컴파일러는 이 선언문을 만났을 때 정수값을 저장할만한 4바이트의 공간을 할당하고 이 공간에 대해 i라는 이름을 붙여줄 것이다. 이후 i라는 변수명을 통해 이 메모리에 정수값을 저장할 수 있고 또 값을 읽을 수도 있다. 정수형은 최대 표현 가능한 값의 크기와 부호의 존재 유무에 따라 여러 가지 종류로 나누어진다.

먼저 변수의 크기와 표현 가지수의 관계에 대해 알아보자. 값 하나를 표현하기 위해 몇 비트를 사용할 것인가에 따라 표현 가능한 수의 개수가 달라진다. 예를 들어 1비트로만 구성된 정수형이 있다면 이 정수로는 0과 1의 두 가지 상태밖에 기억하지 못한다. 이런 비트가 두 개 모이면 00, 01, 10, 11 네 가지 각각 다른 상태를 표현할 수 있다. 비트 세 개가 모인다면 각 비트값의 조합에 따라 다음 8가지 상태를 표현할 수 있다.

 

이진수

십진수

000

0

001

1

010

2

011

3

100

4

101

5

110

6

111

7

 

같은 원리로 비트가 4개 모이면 16가지 상태를 표현할 수 있을 것이다. 일반적으로 n개의 비트가 모이면 2n가지의 수를 표현할 수 있으며 0부터 시작하므로 최대 표현 가능한 수는 2n-1이 된다. 8비트로 구성되는 1바이트는 총 256가지 종류의 수를 표현할 수 있고 표현 가능한 최대 수는 255가 되어 0~255까지의 정수를 기억할 수 있다. 2바이트(16비트)라면 216종류의 값을 기억할 수 있고 4바이트(32비트)라면 232 종류의 값을 기억할 수 있을 것이다.

다음은 부호 여부에 따른 표현 범위의 차이를 보자. 부호가 있는 정수(signed)는 제일 왼쪽의 비트(MSB라고 한다)를 부호 비트로 사용하며 이 비트가 0이면 양수이고 1이면 음수가 된다. MSB를 부호 비트로 사용하면 값을 기억하는 비트 하나가 줄어들게 되므로 표현할 수 있는 최대값은 절반으로 줄어드는 대신 음의 값을 표현할 수 있다. 값의 범위가 음수 영역으로 평행이동하는 것이다.

8비트 정수의 경우 총 256가지의 수를 표현할 수 있는데 부호가 없으면 0~255까지의 표현 범위를 가진다. 부호가 있다면 음수 범위로 절반이 이동하여 -128 ~ 127까지의 수를 표현할 수 있을 것이다. 16비트 정수는 부호가 없을 때 0~65535까지, 부호가 있으면 -32768~32767까지를 표현한다. 결국 표현할 수 있는 가지수는 같지만 부호 여부에 따라 범위만 달라지는 것이다.

int라는 정수형의 타입앞에 크기를 나타내는 short, long같은 수식어와 부호를 나타내는 signed, unsigned같은 수식어가 붙어 다음과 같은 다양한 정수형 타입을 선언할 수 있다.

 

타입

크기(바이트)

부호

범위

int

4

있음

-2147483648~2147483647

short int

2

있음

-32768~32767

long int

4

있음

-2147483648~2147483647

unsigned int

4

없음

0~4294967295

unsigned short int

2

없음

0~65535

 

도표를 보면 각 타입별로 할당된 바이트 수와 부호 여부가 다른데 이 크기와 부호 여부에 따라 표현 가능한 수의 범위가 달라진다. 4바이트 크기의 unsigned int는 최대 42억이라는 큰 값을 기억할 수 있는데 비해 2바이트 크기의 unsigned short int는 65535까지만 기억할 수 있다. int형은 부호가 있고 4바이트의 크기를 가지므로 -231~231-1까지의 범위를 가지는데 비해 unsigned형은 같은 4바이트이지만 부호가 없기 때문에 음수를 표현할 수 없는 대신 0~232-1까지 표현할 수 있다. 타입의 이름이 좀 긴데 다음 두 가지 규칙에 의해 좀 더 간략하게 표현할 수도 있다.

 

① 부호에 대한 수식어가 생략되면 signed가 적용되어 부호가 있는 것으로 선언된다. signed int는 int와 같고 signed short int는 short int와 같다. 그래서 signed는 보통 붙이지 않는다.

② int앞에 수식어가 있을 경우 int는 생략할 수 있다. 그래서 unsigned int는 unsigned로 간단하게 쓸 수 있으며 long int는 long과 같다. 부호있는 4바이트 정수형은 signed int라고 쓰는 것이 원칙이나 signed를 생략하고 int로 쓸 수도 있고 int를 생략하고 signed로 쓸 수도 있다. 그러나 통상 signed라고 쓰지 않고 int라고 간략하게 쓰는 것이 보통이다.

 

똑같은 정수형에 대해서도 다양한 타입이 준비되어 있는데 이는 상황에 따라 가장 적절한 타입을 선택해서 쓸 수 있도록 하기 위해서이다. 년도나 온도를 기억한다면 2바이트의 short형으로도 충분하므로 굳이 기억 장소를 낭비해 가면서 4바이트나 차지하는 int형을 쓸 필요가 없다. 또한 나이나 성적같이 음수값이 존재하지 않는다면 부호가 없어도 상관없으므로 unsigned형을 쓰는 것이 더 좋다.

 

2-2. 정수형의 길이

C의 정수형, 더 정확하게 말해서 컴퓨터가 표현하는 정수라는 개념은 수학에서 말하는 정수와는 의미가 약간 다르다. 수학의 정수는 음양으로 무한대의 값을 표현할 수 있지만 유한한 메모리를 가진 컴퓨터는 이런 무한한 값을 표현하지 못하며 자신에게 할당된 메모리 양만큼의 값만 기억할 수 있다. 그래서 가끔 연산 결과가 용량을 넘어서는 경우가 발생하기도 하는데 다음 예제를 실행해 보자.

[overflow]

정수형 변수로 간단한 덧셈, 뺄셈을 해 보았는데 실행 결과는 다음과 같다.

 

20000+30000=-15536

20000-30000=55536

 

세 개의 2바이트 정수(short) a, b, c를 선언하고 a에 20000, b에 30000을 대입한 후 이 두값을 + 연산자로 더해 c에 대입했다. 그러면 c는 당연히 50000이라는 값을 가져야겠지만 실제 결과는 엉뚱하게도 -15536으로 출력된다. 왜냐하면 a, b, c 변수는 부호있는 2바이트의 정수형인 short형으로 선언되었고 최대 32767이상의 수를 저장할 수 없기 때문이다. 50000이라는 값이 대입되기는 하지만 short형은 최상위 비트를 부호 비트로 해석하기 때문에 음수가 되어 버리는 것이다. 이런 식으로 변수의 저장 용량을 넘어서는 현상을 오버플로우(Overflow)라고 한다.

이런 문제가 발생한 근본적인 원인은 만단위의 수치를 저장하는데 short형을 사용했다는데 있다. a,b,c를 unsigned short형으로만 바꾸어도 위 예제는 제대로 실행된다. 그러나 그렇게 하더라도 65535이상의 수를 저장할 수는 없다. 더 큰 수를 다루려면 int나 unsigned같은 4바이트의 더 큰 타입을 사용해야 한다. int는 20억 정도의 큰 수치를 저장할 수 있으므로 일반적으로 오버플로우 걱정을 하지 않아도 된다.

변수의 표현 범위를 초과하는 현상과 반대로 최소 표현수에 미치지 못하는 경우도 발생할 수 있다. s, t, u는 모두 부호를 표현하지 못하는 unsigned short로 선언되었으며 20000이라는 값을 가지는 s에서 30000이라는 값을 가지는 t를 빼서 u에 대입했다. u에 대입되는 값은 -10000이 아니라 55536이라는 양수값이 되어 버린다. unsigned short형이 표현할 수 있는 최소수는 0인데 이 값보다 더 작은 값을 대입했으므로 계산 결과가 틀려지는 것이다.

수학적인 연산을 할 때는 항상 이 점을 주의해야 한다. 아주 간단할 것 같은 연산도 정확한 타입과 함께 사용해야만 결과가 제대로 나온다. 메모리가 지극히 부족한 상황이 아닌 한은 정수가 필요할 때 부호 있는 4바이트 정수인 int를 사용하면 별 문제가 없다. int는 음양으로 20억이라는 실생활에서 거의 부족하지 않는 정도의 표현 범위를 가지고 있기 때문이다.

정수형 타입의 도표를 보면 int와 long은 크기나 부호 여부가 동일하며 따라서 표현할 수 있는 수의 범위도 완전히 동일하다. 왜 똑같은 타입을 둘 씩이나 정의해 놓았는지 의아하겠지만 이 둘은 엄밀하게 말하면 다른 타입이다. 아니, 다른 타입이라기 보다는 달라질 수 있는 타입이라고 하는 편이 옳을 것 같다.

C 언어의 타입 정의에 int 형은 "CPU의 레지스터와 동일한 크기를 가지는 타입"으로 정의되어 있다. 레지스터란 CPU내의 임시 기억 장소이며 레지스터의 크기에 따라 CPU의 비트 수를 정의한다. 즉, 레지스터가 16비트이면 16비트 컴퓨터, 32비트이면 32비트 컴퓨터라고 부른다. 비트 수가 높으면 높을수록 CPU가 한 번에 처리할 수 있는 자료양이 많아지므로 더 성능이 높다고 할 수 있다.

, int형은 CPU가 가장 효율적으로 다룰 수 있는 정수형으로 정의되어 있으며 그래서 int형의 실제 크기는 플랫폼에 따라 달라진다. 다음에 알아볼 포인터형도 마찬가지이다. 과거 8086이나 80286같은 16비트 CPU 시절, 윈도우즈 3.1같은 16비트 운영체제에서 int는 16비트였었다. 그러나 386이후의 CPU와 윈도우즈 95이후의 32비트 운영체제에서 int는 32비트이다. 64비트 CPU가 나오면(이미 나와 있다) 그때는 int형이 64비트(8바이트)가 될 것이다.

반면 long형은 그 크기가 4바이트로 고정되어 있어 어떤 플랫폼에서나 4바이트이다. int와 long이 동일한 크기를 가지는 것은 32비트 플랫폼에서 뿐이며 16비트에서는 서로 다른 타입이고 64비트에서도 달라질 것이다. 꼭 4바이트를 쓰고 싶으면 long형으로 선언하고 플랫폼의 환경에 따라 적절한 크기를 자동으로 선택하고 싶다면 int형으로 선언하면 된다.

최근 64비트 CPU가 발표되고 점점 더 큰 수를 다룰 일들이 많아지면서부터 C언어도 64비트의 정수를 지원하기 시작했다. 비주얼 C++과 Dev-C++은 __int64라는 타입을 지원하며 이 타입을 사용하면 무려 1800경(264)이라는 엄청난 수를 표현할 수 있다. 다음은 64비트 정수를 사용하여 억단위의 정수끼리 곱해본 것이다.

[int64]

흔히 전자 계산기를 테스트하기 위해 일련의 1을 곱해보는데 12345678987654321이라는 결과가 나오면 제대로 동작하는 것이다. printf로 64비트 정수를 출력하려면 %I64d라는 서식을 사용한다.


2-3. 정수형 상수

정수형 상수를 표기하는 방법은 아주 쉽고 상식적이다. 아라비아 숫자와 부호로 직접 그 값을 표기하면 된다. 다음이 정수형 상수의 예이다.

 

123

8906299

-86400

 

이렇게 값을 바로 표기하면 그 크기와 형태를 보고 적당한 타입으로 메모리에 저장된다. 위 예의 경우 차례대로 short, int, int의 타입을 가진다. 123은 2바이트로 표현할 수 있으므로 short형이면 충분하고 8906299는 2바이트의 범위를 넘으므로 int형이 되어야 한다. 만약 크기를 강제로 지정하고 싶으면 상수 뒤에 L(Long, 소문자로 써도 됨)을 붙이고, 부호없는 타입으로 지정하고 싶으면 U(Unsigned, 소문자로 써도 됨)을 붙인다.

예를 들어 28은 short형이지만 28L로 표기하면 4바이트의 long형 상수가 되고 123U는 부호없는 2바이트의 정수인 unsigned short가 된다. 만약 부호없는 4바이트의 상수로 표기하고 싶으면 순서나 대소문자에 상관없이 UL, LU, ul, lu 중 하나를 붙이면 된다. C/C++언어는 타입을 중요하게 생각하므로 상수에도 정확한 타입을 지정할 수 있도록 되어 있다. 정수형 상수를 별도의 표기없이 그냥 쓰면 10진수로 해석된다. 그러나 진법에 따라 다음 두가지 형식으로 상수를 표현할 수도 있다.

 

 8진수 : 0으로 시작하면 8진수로 인식되며 027, 032등과 같이 표현한다. 09같은 상수는 에러로 처리되는데 9라는 숫자는 8진수에서 쓸 수 없는 숫자다.

 16진수 : 0x 또는 0X로 시작하면 16진수이다. 0x12ab, 0x3f와 같이 표현한다. 16진수에서 10 이상의 값을 표현하는 A~F는 대소문자에 상관없이 아무 문자나 사용할 수 있다. 접두로 붙는 0x는 알파벳의 "오엑스"가 아니라 숫자 0과 알파벳 x이므로 "영엑스" 또는 "공엑스"로 읽는다.

 

보편적으로 10진수를 사용하지만 어셈블리와 관계있는 값이나 비트별로 의미가 다른 상수는 16진수로 표기하면 더 편리한 경우가 많다. 아쉽게도 C는 2진 상수 표기법은 제공하지 않으므로 2진수는 16진수로 바꾸어 표기해야 한다. 예를 들어 2진수 10100110은 16진수 0xa6으로 표기한다. 사실 8진 표기보다는 2진 표기법이 더 많이 사용되는데 베이직도 지원하는 2진 표기법이 C문법에 빠진 것은 데니스 리치의 실수가 아닌가 생각된다. 실제로 표준 위원회에 2진 표기법을 도입하자는 건의가 여러 차례 있었으나 익숙해지면 16진수로 암산 가능하다는 이유로 표준에서 제외됐다.

C에서 0으로 시작하는 상수는 8진수라는 것은 잘 알아 두어야 한다. 그렇지 않으면 다음과 같은 엉뚱한 실수를 할 수도 있다. HPNum에 10진수로 17을 대입하고자 했는데 전혀 문제가 없는 문장이기 때문에 컴파일러는 어떠한 에러 메시지도 출력하지 않는다.

 

int HPNum;

HPNum=017;

 

이렇게 하면 상수 017이 8진수로 해석되어 Num에 17이 대입되는 것이 아니라 15가 대입될 것이다. C 컴파일러는 017과 17을 엄연히 다른 상수로 취급하는데 0으로 시작하는 상수는 8진수라는 것을 잘 기억해 두도록 하자.

참고로 진법이란 수치값을 표기하는 다른 방법일 뿐이지 표현하는 값 자체가 다른 것은 아니다. 012나 10이나 0xa나 모두 십진수로 10(이진수로는 1010)을 나타내며 메모리에 기록될 때는 똑같은 값이다. 따라서 "10진수 값을 어떻게 16진수로 바꾸나요?" 이런 질문은 잘못된 것이다. 10진수를 16진수 형태로 출력한다거나 문자열 형태로 저장된 16진수를 10진값으로 구하는 방법을 질문하는 것은 옳지만 말이다.



4. 실수형

4-1. 종류
 

실수(Real Number)란 소수점 이하를 가지는 수이며 정수보다는 한 단계 더 확장된 범위를 포괄한다. 3.14나 57.4같이 정수부 다음에 소수점과 소수 이하의 소수부가 있다. 실수형 타입은 이런 실수를 저장하는 타입이며 C에서는 크기별로 다음 세 가지 종류가 제공된다. 실수 타입은 모두 부호를 가지고 있다.

 

타입

바이트 

범위

유효자리수(십진)

float

4

3.4*10-38~3.4*1038

7

double

8

1.7*10-308~1.7*10308

15

long double

10~16

1.2*10-4932~3.4*104932

19

 

float는 4바이트의 작은 실수형이며 double은 8바이트의 큰 실수형이다. 실수형의 값을 기억할 변수가 필요하다면 double d; 형식으로 선언하면 된다. long double형은 C언어 표준에는 있지만 비주얼 C++은 6.0과 7.0 모두 이 타입을 지원하지 않으며 double형과 동일하게 취급한다. gcc는 12바이트 크기의 long double형을 지원한다. 정수와 마찬가지로 실수도 수학에서의 실수와는 달리 무한대의 크기와 정밀도를 제공하지는 않으며 할당된 메모리 크기만큼의 크기와 정밀도만 표현한다.

컴퓨터는 원래 정수만 다룰 수 있기 때문에 실수를 기억하는 방법이 아주 독특하다. 만약 4바이트를 2바이트씩 나누어 정수부와 소수부를 따로 저장한다고 해 보자. 이렇게 단순한 방법을 사용하면 32767.00000 보다 더 큰 수를 표현하지도 못할 뿐더러 소수부도 기껏해야 소수점 이하 다섯 자리도 채 표현하지 못할 것이다. 그래서 실수는 부동 소수점이라는 좀 특이한 방법으로 저장한다. 부동(浮動) 소수점이란 실수를 정수부와 소수부로 나누는 것이 아니라 지수부와 가수부로 나누어 기억하는 방식이다.

가수부는 값의 모양을 표현하며 지수부는 10의 거듭승으로 값의 크기를 표현한다. 실수 123.456을 부동 소수점 형식으로 표현하면 1.23456*102으로 표현할 수 있으며 이를 공학적 표기법으로 바꾸어 1.23456E2로 표현하기도 한다. 이 예에서 가수는 123456이고 지수는 2이다. 정수부와 소수부를 기억하는 방식보다 부동 소수점 방식으로 실수를 기억하면 훨씬 더 큰 수를 표현할 수 있고 정밀도도 높아진다.

제일 왼쪽 비트(MSB)는 항상 부호 비트이며 이 비트가 0이면 양수, 1이면 음수이다. 지수부와 가수부의 크기는 float의 경우 8비트, 23비트이며 double형의 경우 11비트 52비트이다. 그래서 float보다는 double이 두 배의 크기를 가지는 대신 훨씬 더 큰 수를 정확하게 표현할 수 있다.

이런 실수 표현법은 C언어의 고유한 방식이 아니라 IEEE에서 제정한 국제 표준이며 이 표준은 모든 언어가 공통적으로 따르고 있다. 부동 소수점 수의 정확한 구조는 위에서 대충 설명한 것보다 조금 더 복잡한데 필요하다면 별도의 자료를 찾아 보기 바란다. 이 책의 18장에서 실수의 구조에 대해 대략적인 설명을 하고 있다.


4-2. 실수형 상수

소수부를 가지면 실수형 상수로 인식된다. 다음이 실수형 상수의 예이며 실생활에서 직접 사용하는 표기법이므로 전혀 어렵지 않을 것이다.

 

-3.14

123.456

5.0

 

5.0의 경우 같은 값이라도 5라고 적으면 정수형 상수가 된다. 실수형 상수임을 명확히 나타내려면 5.0이라고 적든가 아니면 0은 생략하고 5.이라고 적어야 한다. 이런 식으로 소수점을 기준으로 왼쪽에 정수부 오른쪽에 소수부를 적는 방법을 고정 소수점 표기법이라 한다. 실수형 상수 표기에 부동 소수점 표기법을 사용할 수도 있다.

 

3.14e-1

1.23456e2

 

e를 기준으로 왼쪽에 가수 오른쪽에 지수를 적는다. 실수는 내부적으로 모두 부동 소수점 방식으로 기억되지만 상수를 표현할 때는 고정 소수점, 부동 소수점 표기법을 모두 사용할 수 있다. 정수 상수 뒤에 크기와 부호를 나타내는 U, L 등의 접미사를 붙일 수 있듯이 실수형 상수 뒤에도 정확한 크기를 명시하는 F 접미사(소문자도 가능)를 붙일 수 있다. 접미사가 없으면 double형 상수로 인식되며 F를 붙이면 float형으로 인식되고 L을 붙이면 long double형이 된다. 다음 예제는 실수형 값을 출력하는 여러 가지 방법을 보여준다.


[float]

실수형 변수 d를 선언하고 이 변수에 123.456이라는 실수 상수를 대입했다. d=1.23456e2;와 같이 부동 소수점 표기법으로 대입해도 결과는 같다. 실수를 표현하는 방법이 여러 가지가 있기 때문에 printf의 실수에 대응되는 서식도 여러 가지가 있다. %f 서식은 고정 소수점으로 실수를 출력하며 %e 서식은 부동 소수점으로 출력한다. %g 서식은 %f와 %e 중 더 짧고 간단한 방법을 자동으로 선택한다. 실행 결과는 다음과 같다.

 

고정 소수점 : 123.456000

부동 소수점 : 1.234560e+002

일반형 : 123.456

 

앞 절에서 배운대로 %와 서식 사이에 총 자리수나 소수점 이하 자리수를 지정할 수도 있다. 소수점 이후 두 자리까지만 출력하고 싶다면 %f 대신 %.2f 서식을 사용하면 된다. 이 경우 소수점 이하 3번째 자리에서 반올림되어 123.46이 출력될 것이다.

실수는 정수에 비해 소수점 이하를 표현할 수 있고 천문학적인 큰 수를 다룰 수 있는 장점이 있지만 구조가 복잡하기 때문에 굉장히 느리다. 요즘 CPU는 부동 소수점을 보조 프로세서가 직접 처리하므로 훨씬 더 빨라졌지만 그렇지 못한 시스템에서는 정수에 비해 대략 10배 정도 느리다. 그래서 꼭 필요한 경우가 아니면 잘 사용되지 않으며 불가피한 경우라도 정수형으로 바꾸어서 다루는 경우가 많다. 예를 들어 소수점 이하 두 자리까지의 정확도를 가지는 백분율이 필요하다면 아예 100을 곱해 만분율을 사용하는 것이 더 유리하다.



5.  문자형
 

5-1. 문자

문자형이란 문자 하나를 표현하는 자료형이다. 컴퓨터는 원래 숫자밖에 모르기 때문에 문자도 숫자로 기억한다. 이때 어떤 숫자와 어떤 문자를 대응시키는가에 따라 여러 가지 인코딩 방식이 있는데 통상 아스키(ASCII) 코드 방식을 많이 사용한다. 아스키 코드는 0~255사이의 숫자에 문자를 대응시켜 놓았는데 이 표를 보면 대문자 A는 문자 코드 65(0x41)로 표현하며 숫자 1은 49(0x31)로 표현한다.

 

10

16

문자

10

16

문자

10

16

문자

10

16

문자

10

16

문자

0

0

Null

47

2F

/

68

44

D

89

59

Y

110

6E

n

7

7

Bell

48

30

0

69

45

E

90

5A

Z

111

6F

o

8

8

BS

49

31

1

70

46

F

91

5B

[

112

70

p

9

9

Tab

50

32

2

71

47

G

92

5C

\

113

71

q

10

A

LF

51

33

3

72

48

H

93

5D

]

114

72

r

13

D

CR

52

34

4

73

49

I

94

5E

^

115

73

s

32

20

공백

53

35

5

74

4A

J

95

5F

_

116

74

t

33

21

!

54

36

6

75

4B

K

96

60

`

117

75

u

34

22

"

55

37

7

76

4C

L

97

61

a

118

76

v

35

23

#

56

38

8

77

4D

M

98

62

b

119

77

w

36

24

$

57

39

9

78

4E

N

99

63

c

120

78

x

37

25

%

58

3A

:

79

4F

O

100

64

d

121

79

y

38

26

&

59

3B

;

80

50

P

101

65

e

122

7A

z

39

27

'

60

3C

<

81

51

Q

102

66

f

123

7B

{

40

28

(

61

3D

=

82

52

R

103

67

g

124

7C

|

41

29

)

62

3E

>

83

53

S

104

68

h

125

7D

}

42

2A

*

63

3F

?

84

54

T

105

69

i

126

7E

~

43

2B

+

64

40

@

85

55

U

106

6A

j

127

7F

Del

44

2C

,

65

41

A

86

56

V

107

6B

k

 

 

 

45

2D

-

66

42

B

87

57

W

108

6C

l

 

 

 

46

2E

.

67

43

C

88

58

X

109

6D

m

 

 

 

 

255개의 서로 다른 문자를 기억하기 위해서는 단지 1 바이트만 있으면 된다. 문자형 타입은 char인데 정수형과 마찬가지로 char형도 앞에 수식어를 붙일 수 있다. 길이는 1바이트로 고정되어 있으므로 long이나 short같은 크기에 대한 수식어는 붙일 수 없고 부호의 여부에 따라 unsigned, signed 수식어만 붙일 수 있다. unsigned char형은 8비트 길이를 가지므로 0~255까지를 표현할 수 있고 signed char 형은 1바이트의 좁은 공간에도 음수 표현을 위해 MSB를 부호 비트로 사용하므로 최대 표현 수가 절반으로 줄어든다.

 

타입

크기(바이트)

부호

범위

signed char

1

있음

-128 ~ 127

unsigned char

1

없음

0 ~ 255

 

부호 수식어없이 char라고만 쓰면 컴파일러와 설정 옵션에 따라 부호가 있을 수도 있고 없을 수도 있다. 대부분의 컴파일러들은 char형을 부호있는 타입으로 인식하므로 signed수식어는 생략할 수 있으며 signed char는 char 타입과 일단 동일하다. 컴파일러의 설정에 상관없이 부호 여부를 정확하게 지정하려면 signed, unsigned 수식어를 명시적으로 붙여야 한다. 문자 상수는 다음과 같이 표기한다.

 

'A', 'Z', '1', '&'

 

홑따옴표로 문자 하나를 감싸 주면 된다. 문자 상수는 아스키 코드값으로 해석되는데 'A'는 A문자의 아스키 코드값인 65와 같다. 다음 예제는 문자형 변수 ch를 선언하고 이 변수에 대문자 A를 대입한 후 출력해 본 것이다.


[char]

ch 변수는 char형으로 선언되었으므로 문자 하나를 저장할 수 있는 1바이트가 할당될 것이다. 이 변수에 'A', 'B' 같은 문자형 상수를 대입할 수 있는데 예제에서는 'A'를 대입하여 ch 변수에 'A' 문자를 기억시켰다. 문자형 상수를 쓰는 대신 ch=65(또는 ch=0x41)와 같이 아스키 코드값을 직접 대입해도 결과는 동일하다. 하지만 누가 보더라도 ch=65; 보다는 ch='A'가 훨씬 더 읽기 쉽다.

문자형 변수를 출력할 때는 putch 함수를 사용한다. 또는 printf 함수의 %c 서식을 사용하여 printf("%c",ch); 로 출력할 수 있다. 예제를 실행해 보면 화면에 A 문자만 하나 출력될 것이다. 한글은 한 음절이 2바이트로 구성되기 때문에 문자형 변수에는 저장할 수 없으며 잠시 후에 배울 문자열을 사용해야 한다.

문자형은 문자 하나를 저장할 수 있는 적당한 길이를 가진다는 뜻으로 붙여진 이름이지 오로지 문자만 저장할 수 있다는 뜻은 아니다. char 타입은 실제로 8비트의 정수형이므로 크기가 작은 정수를 저장하는 용도로도 사용할 수 있다. 예를 들어 0~100까지의 범위를 가지는 점수라면 Score라는 이름으로 char형 변수를 선언한 후 여기에 저장하면 적당하다. 문자형이 일종의 정수형이라면 이 변수에 들어 있는 값은 과연 어떻게 해석될까? 다음 예제를 보자.


[charcontext]

문자열 변수가 문자로 해석될 것인가 정수로 해석될 것인가는 이 변수가 사용되는 위치에 따라 달라지는데 문자가 올 수 있는 곳이면 문자로, 정수가 올 수 있는 곳이면 정수로 해석된다. printf 함수의 %c 서식과 대응되면 문자가 출력될 것이고 %d와 대응되면 정수값이 출력될 것이다. putch(ch)는 ch값을 문자로 해석하며 gotoxh(ch, 8)은 ch를 x 좌표를 나타내는 정수로 해석한다.


5-2. 확장열

문자 상수는 홑따옴표안에 문자를 써서 표기한다. 문자 Y에 대한 문자 상수는 'Y'다. 이 상수를 키보드로 입력하려면 키보드에서 '를 치고 Y를 치고 '를 치면 된다. 그런데 따옴표안에 직접 입력할 수 없는 문자가 있다. 대표적으로 개행 코드를 들 수 있는데 Enter키를 누르는 즉시 정말로 다음 줄로 내려가 버리기 때문에 따옴표안에 개행 코드를 담아서 표현하는 것은 불가능하다.

또한 문자 상수를 표현할 때 사용하는 홑 따옴표 구두점도 문자 상수로 바로 표현할 수 없다. ''' 이렇게 쓰면 두 번째 '가 닫는 따옴표인지 문자 '를 나타내는지 컴파일러가 구분할 수 없다. 그래서 키보드로 직접 입력할 수 없는 문자들은 좀 특수한 방법으로 표현하는데 이를 확장열(Escape Sequence)이라고 한다. 확장열은 백슬레쉬(\) 문자 다음에 기호 하나를 써서 표현한다.

 

확장열

코드

설명

\a

0x07

 소리

\b

0x08

 스페이스

\t

0x09

\n

0x0a

개행

\x##

0x##

16 코드

\###

0###

8 코드

\\

0x5c

백슬레쉬

\'

0x27

홑따옴표

\"

0x22

겹따옴표

\?

0x3f

물음표

 

개행 코드는 \n으로 표현하는데 이 코드는 First예제에서 이미 실습해 보았다. 탭이나 백 스페이스 같은 문자도 직접 키보드로 입력해서는 따옴표안에 표기할 수 없기 때문에 확장열로 표기해야 한다. 홑따옴표 문자 하나는 '''와 같이 표기할 수 없고 확장열을 사용해서 '\''와 같이 표기해야 한다.

확장열 표기에 \문자를 사용하기 때문에 \문자 자체도 확장열이 될 수밖에 없다. 16진 코드는 키보드에 없는 문자에 대해 코드를 직접 쓸 때 사용한다. 'A'는 '\x41'과 동일하다. 16진 코드를 확장열로 표기할 때 \다음의 x는 반드시 소문자로 써야 하며 대문자는 인정하지 않는다. 문자열 상수내에 16진 코드를 직접 쓸 경우 16진수로 인식되는 모든 문자를 확장열로 취급한다는 점을 주의하자. '\x53trike"는 \x53이 s이므로 "strike"이지만 "\53econd"는 \다음의 53ec까지를 16진수로 해석해 버리므로 "second"가 되지 않고 에러로 처리된다. 왜냐하면 53ec는 문자 코드 범위 바깥이므로 하나의 문자가 아니기 때문이다. 이런 경우는 16진 코드를 쓰지 않거나 다른 방법으로 문자열을 표기해야 한다.

확장열을 쓰는 이유는 꼭 키보드로 표현하지 못해서뿐만 아니라 환경에 따라 달라질 수 있는 코드를 논리적으로 표현하기 위해서이다. 개행을 하는 방식은 시스템마다 다른데 윈도우즈에서는 CR, LF의 조합으로, 유닉스는 LF만으로, 매킨토시는 CR만으로 개행 문자를 표현한다. C는 이런 방식에 상관없이 개행을 표현할 수 있는 확장열을 제공하고 프로그래머는 개행이 필요할 때 \n이라고만 적으면 된다.

탭의 경우 일정한 자리를 띄우는 것이 아니라 현재 위치에서 다음 탭 위치로 이동하는 기능을 하므로 소스상에 입력된 탭에 의해 띄워진 빈칸과 실제 출력될 위치의 탭 크기가 다를 수 있다. 그래서 탭키를 문자열 상수에 직접 쓰지 않고 \t 확장열로 표기하여 출력되는 상황에 맞게 탭을 적용하도록 한다.



5-3. 문자열

문자열(String)은 일련의 문자가 연속되어 있는 것이며 문자의 집합이 곧 문자열이다. 사람의 이름이나 에러 메시지 등과 같은 일반적인 문장을 문자열이라고 한다. 문자열 상수는 문자 상수와 달리 겹따옴표로 감싸서 표현한다.

 

"Korea", "문자열"

 

문자 상수는 홑따옴표로 표현하는데 비해 문자열 상수는 겹따옴표를 사용함을 분명히 구분해야 한다. 'S'와 "S"는 비슷해 보여도 내부적으로 엄청난 차이가 있다. 'S'는 S라는 문자 하나만을 표현하지만 "S"는 한 글자로만 된 문자열이다.

문자열 상수는 있지만 이런 문자열을 저장할 수 있는 문자열 타입이라는 것은 없다. 베이직이나 파스칼, 자바같은 언어는 별도의 문자열 타입을 제공하지만 C언어는 별도의 문자열 타입을 제공하지 않는다. 왜냐하면 문자열이란 문자형 변수의 배열로 표현할 수 있고 포인터와 함께 사용하면 훨씬 더 유연하게 활용할 수 있기 때문이다.

그러나 처음 배우는 사람에게 문자열 변수가 없다는 것은 상당히 불편한 점이다. 그래서 C보다 상위 언어인 C++은 string이라는 클래스를 제공하며 MFC 라이브러리에도 CString이라는 문자열 클래스가 정의되어 있다. 다음 코드는 str이라는 이름으로 문자 배열을 선언하고 이 배열에 "Korea"라는 문자열 상수를 저장한다.

 

char str[6]="Korea";

 

이 선언문에 의해 메모리에 다음과 같은 기억 공간이 할당되고 초기화된다.

배열이란 같은 타입의 변수를 모아 놓은 것이며 문자 배열이란 문자형 변수 여러 개가 연속적으로 배치되어 있는 것이다. 그림에서 각 격자는 1바이트의 문자들이며 각 격자에 문자 하나씩이 들어있다. 제일 끝에 있는 \0는 여기가 문자열의 끝임을 알리는 역할을 하며 널 종료 문자라고 한다. 메모리는 연속적인 공간이기 때문에 그 끝을 명확히 표시해야 한다.

문자열 상수를 쓰면 컴파일러가 상수의 끝에 널 종료 문자를 자동으로 붙여 준다. 그래서 "Korea"라는 다섯 글자를 저장하기 위해서는 널 종료 문자의 길이까지 고려하여 배열 크기를 6으로 선언해야 한다. 문자열을 화면으로 출력할 때는 printf 함수의 %s 서식을 사용하거나 아니면 puts같은 좀 더 간단한 함수를 사용한다.

문자열 상수내에서도 확장열을 모두 사용할 수 있다. 단, 문자 상수와는 다른 차이점이 한가지 있는데 홑따옴표는 그대로 써도 되나 겹따옴표는 반드시 확장열로 표기해야 한다는 점이다. "Let's go" 이런 문자열 상수를 쓸 수 있지만 "say "go" now" 이런 문자열 상수는 쓸 수 없다. 문자열 상수 표기에 겹따옴표를 사용하기 때문에 "say \"go\" now"와 같이 문자열 내의 겹 따옴표는 확장열로 표기해야 한다. 마찬가지 이유로 홑따옴표를 사용하는 문자 상수의 경우는 ' ' '가 안되며 ' " '는 가능하다.

문자열은 굉장히 기본적인 타입이지만 C언어는 별도의 문자열 타입을 제공하지 않고 배열로 문자열을 표현하도록 되어 있다. 그래서 문자열을 자유 자재로 다루려면 배열에 대해 익숙해져야 한다. 배열과 문자열의 관계는 다음에 배우기로 하고 여기서는 문자열은 문자 배열로 기억한다는 것과 문자열 상수의 표기법 정도만 알아 두고 넘어가도록 하자.


5-4. 3중 문자

3중 문자(Trigraph)란 세 개의 연속된 문자를 하나의 문자로 대체하는 표현이다. 잘 알다시피 C 언어는 미국에 의해 만들어졌고 그러다보니 자기네 나라의 문자 코드인 ASCII표에 정의되어 있는 { } [ ] 문자들을 별 생각없이 구두점으로 정의하고 있다. 그런데 유럽의 몇 개 국가들은 영어에 없는 자신의 고유한 글자(움라우트 등)를 표현하기 위해 이 문자 코드에 다른 문자를 할당해서 사용하고 있으며 그러다 보니 이런 나라의 키보드에는 ASCII표에 있는 9개의 문자들이 없을 수도 있다. 우리 나라의 경우도 \ 문자를 원화 표시인 \로 다르게 표시하고 있지 않은가?

그래서 C표준은 C에서 사용할 수 있는 문자들을 모든 나라에 공통적인 영문자, 숫자와 몇 가지 기호만으로 제한하고 있으며 나머지 문자들은 표준에 있는 문자들의 조합으로 입력할 수 있는 방법을 제공해야 할 필요가 생긴 것이다. 이런 이유로 C 표준은 3중 문자를 정의하고 있다. 물론 키보드에 이런 문자들이 있다면 굳이 3중 문자를 쓰지 않아도 된다. 3중 문자의 종류는 다음과 같다.

 

3 문자

대체 문자

3 문자

대체 문자

??=

#

??/

\

??'

^

??!

|

??(

[

??)

]

??<

{

??<

}

??-

~

 

 

 

??로 시작하는 세 개의 문자를 연속으로 사용하면 이 문자는 컴파일러가 토큰을 분석하는 과정에서 대체 문자로 바뀐다. 다음 예제는 3중 문자로 작성한 것이다. 굉장히 이상해 보이지만 잘 컴파일되며 Trigraph Test #1. num is 2를 출력한다. 

[Trigraph]

{ } 괄호 대신 ??< ??>괄호를 사용할 수 있고 배열을 표기할 때도 [ ] 대신 ??( ??)를 사용할 수 있다. 다소 혼란스러워 보이기도 하고 가독성이 심하게 떨어지기는 하지만 C표준에 의해 정상적인 소스로 인정된다. 재미있는 것은 3중 문자 치환은 구문 해석(Parsing) 전에 일어나므로 문자열 상수에 있는 3중 문자까지도 치환된다는 점이다. 그래서 문자열 내에서 부작용이 발생할 수 있으며 이 부작용을 해결하기 위해 확장열에 3중 문자의 선두로 사용되는 ?를 표기할 수 있는 \?가 따로 정의되어 있는 것이다.

이 외에도 C++ 표준은 연산자나 구두점을 위한 대체 토큰인 이중 문자(Alternative token)라는 것도 정의하고 있다. 예를 들어 <%는 {로 대체되며 %>는 }로 대체되는 식인데 비주얼 C++과 Dev-C++은 2중 문자를 지원하지 않는다. 키보드에 { } 문자가 없는 나라들은 3중 문자가 필요하겠지만 우리나라 키보드에는 이 문자들이 모두 있으므로 우리가 3중 문자에 관심을 가져야 할 이유는 전혀 없는 셈이다.



  
6. 열거형


6-1. 정의

열거형(Enumeration)이란 변수가 가질 수 있는 가능한 값들을 나열해 놓은 타입이다. 어떤 변수가 가질 수 있는 값의 종류가 일정한 범위로 정해져 있다면 정수형 대신 열거형을 쓰는 것이 더 편리하다. 열거형 변수를 선언할 때는 enum 키워드를 사용한다.

 

enum { 멤버멤버, ... } 변수;

 

열거형으로 가능한 값들을 열거 멤버라고 하는데 { } 괄호안에 값의 이름을 나열하면 된다. 구체적인 예를 들어 보자.

 

enum { EAST, WEST, SOUTH, NORTH } mark;

 

mark라는 변수는 방향값을 기억하는데 가능한 값은 동서남북 넷 중 하나이다. mark에 값을 대입하거나 비교할 때는 열거 멤버를 사용한다.

 

mark=EAST;           // mark에 EAST를 대입

if (mark==WEST)          // mark가 WEST이면

 

열거형은 내부적으로 정수로 처리되며 각 열거 멤버는 0부터 1씩 증가하는 정수값을 가진다. 위 예에서 EAST는 0이고 WEST는 1이고 SOUTH, NORTH는 각각 2와 3이다. 컴파일러는 열거형의 멤버들이 어떤 정수값을 가지는지 기억해 두었다가 열거 멤버를 만나면 실제값을 적용한다. 열거형은 정수를 직접 사용하는 방식에 비해 다음과 같은 장점이 있다.

 

① 기억이 용이하다. 열거형 대신 정수형 변수를 대신 사용할 수도 있으나 이렇게 되면 각 정수의 의미가 무엇인지 사람이 일일이 기억해야 하는 불편함이 있다. 값이 10개 정도 된다면 무척 혼란스러울 것이다. 부서를 기억하는 변수 part가 있다고 하자. 이 변수를 정수형으로 선언한다면 각 부서에 대해 0은 총무부, 1은 영업부, 2는 인사부, 3은 경리부, .... 10은 관리부 등으로 의미를 정하고 외워야 하지만 열거형을 사용하면 그럴 필요가 없다. 사람은 숫자보다 문자를 더 잘 기억한다. 10개 정도가 아니라도 LEFT, RIGHT 두 개만 있어도 사람은 무척 혼란스러워한다.

② 소스의 가독성(Readability)이 높아진다. 즉, 읽기만 하면 어떤 의도로 작성된 소스인지 쉽게 파악할 수 있다. mark=3이라고 되어 있으면 3이 무슨 뜻인지 바로 알기 어렵지만 mark=NORTH라고 되어 있으면 북쪽을 대입했다는 것을 분명히 알 수 있다. 팀 작업을 할 때는 이런 가독성이 아주 중요하다.

③ 열거형은 정수형보다 안전하다. mark에 대입될 수 있는 값은 4가지중 하나로 제한되며 동서남북중 하나만 대입될 수 있다. mark를 정수형으로 선언한다면 이 변수에 5를 대입할 수도 있지만 열거형은 가능한 값 중 하나만 대입할 수 있기 때문에 이런 어처구니없는 실수를 컴파일러가 허락하지 않는다.

 

열거 멤버는 별도의 지정이 없으면 0부터 시작하는 정수값으로 정의되며 이어지는 멤버는 앞 멤버의 값+1이 된다. 만약 열거 멤버의 값을 특정한 값으로 분명히 지정하고 싶다면 =다음에 원하는 값을 직접 적어준다.

 

enum { EAST=5, WEST=10, SOUTH, NORTH} mark;

 

이렇게 하면 EAST는 5의 값을 가지면 WEST는 10의 값을 가진다. SOUTH, NORTH는 별도의 값 지정이 없으므로 WEST다음의 정수인 11, 12의 값을 가진다. 다음 열거형은 요일 타입을 정의한다. 요일의 가능한 값은 월요일~일요일까지 일곱가지밖에 없으므로 열거형으로 선언하기에 적당하다.

 

enum { mon, tue, wed, thr, fri, sat, sun } day;

 

이렇게 선언하면 mon이 0이 되고 tue부터 차례대로 1~6까지의 값을 가질 것이다. C는 항상 0부터 수를 세지만 사람은 1부터 세는 것에 더 익숙하기 때문에 첫 번째 멤버의 값을 1로 바꾸는 것이 더 합리적인 경우가 많다. 이럴 때 enum {mon=1, ... 으로 선언하면 월요일부터 일요일까지 1~7의 값을 가지게 된다.

열거 멤버는 일종의 명칭이므로 다른 변수명과 중복되어서는 안되며 유일한 이름을 가져야 한다. 한 열거형내에서 열거 멤버끼리 중복되는 것도 물론 허용되지 않는다. 따라서 다음과 같이 열거형을 선언하는 것은 잘못된 것이다.

 

enum { man, woman, man } human;

 

man이라는 멤버가 두 번 중복되어 있는데 이렇게 되면 human=man이라는 대입문이 0을 대입하라는 것인지 2를 대입하라는 것인지 애매해지게 된다. 언어는 애매해서는 안되므로 이런 식의 열거형 선언은 허용되지 않는다. 하지만 열거 멤버의 값은 중복되어도 상관없다.

 

enum { man=1, woman=2, girl=2 } human;

 

woman과 girl이 똑같은 값을 가지고 있지만 애매하지는 않으므로 이것이 문제가 되지는 않는다. 이 경우 woman과 girl은 일종의 동의어로 처리되며 human=woman 대입문과 human=girl 대입문은 둘 다 똑같이 human에 2를 대입하게 된다. 열거 멤버는 내부적으로 정수형으로 처리되므로 음수를 사용하는 것도 물론 가능하다.






7. 유도형의 소개
 

유도형은 기본형의 조합에 의해 만들어지는 타입들이며 기본형 변수 여러 개를 모아서 또는 기본형을 약간 변형하여 만들어지는 타입들이다. 이절의 제목을 보면 알겠지만 상세한 이론은 다루지 않고 간단한 소개만 하기로 한다. 각각의 유도형들에 대한 문법은 분량도 방대하거니와 복잡하기 때문에 여기서 한꺼번에 다 알기는 어렵다. 각 주제들은 개별 장에서 다시 상세하게 다룰 것이므로 여기서는 개념 위주로만 알아보도록 하자.


7-1. 배열 

배열(Array)은 가장 흔한 자료 구조이면서 또한 가장 실용적이다. 돌(silicon)로 만든 돌머리인 컴퓨터는 판단이나 인식같은 것은 할 수 없으며 오로지 주어진 명령을 아무 생각없이 반복하는 것을 제일 잘한다. 배열은 이런 반복적인 작업과 아주 잘 어울린다. 구조가 단순하기 때문에 속도가 빠르며 이해하기 쉽고 사용하기도 쉽다.

우선 배열의 정의부터 문장화해 보면 동일한 타입을 가지는 자료들의 집합으로 정의된다. 동일한 타입이라는 뜻은 정수형이면 정수형끼리만, 문자형이면 문자형끼리만 모여야 배열이 된다는 뜻이다. 다른 타입들이 모이면 배열이 될 수 없으며 다음에 배울 구조체가 되어야 한다. 동일한 타입의 자료 여러 개가 집합을 이루어야만 배열이 될 수 있다.

정수형 변수 하나는 정수값 하나만 기억할 수 있고 실수형 변수 하나는 실수값 하나만 기억할 수 있다. 배열은 이런 개별 변수들을 여러 개 묶어서 하나의 이름으로 선언한 것이며 동종 자료의 집합을 표현할 수 있다. 배열을 구성하는 각 개별 변수들을 요소(Element)라고 한다. 배열은 다음과 같이 선언한다.

 

타입 배열명[크기][크기]...;

 

 타입 : 배열의 요소가 어떠한 값을 담는지를 지정한다. 즉, 배열이 어떤 값들의 집합인가를 지정한다. int, char, double 등의 기본 타입은 물론이고 유도형이나 사용자가 만든 타입도 가능하다.

 배열명 : 배열도 변수이므로 이름이 있어야 한다. 명칭 규칙에 합당하게 마음대로 이름을 작성할 수 있다.

 크기 : 요소의 개수가 몇개인가를 [ ] 괄호안에 정수 상수로 지정한다. 크기 지정이 하나만 있으면 1차원 배열이라고 하며 두 개 이상이면 다차원 배열이라고 한다.

 

다음은 배열을 선언한 예이다.

 

int array[5];           // 정수형 변수 5개의 집합인 배열 array를 선언

double rate[10];      // 실수형 변수 10개의 집합인 배열 rate를 선언

 

컴파일러는 배열 선언문을 만나면 요소의 크기만한 메모리를 개수만큼 연속적으로 할당한다. array는 정수형이므로 4바이트의 메모리 5개, 즉 20바이트가 할당될 것이며 rate는 80바이트가 할당될 것이다. 메모리에는 다음과 같이 array가 생성되며 이 그림에서 각 격자는 정수 하나의 크기인 4바이트이다.

이렇게 할당된 배열에서 요소를 참조할 때는 [ ] 괄호와 첨자(Index)를 사용한다. 첨자란 요소가 그 배열의 몇 번째에 있는지를 나타내는 순서값이다. C는 항상 0부터 수를 세기 때문에(Zero Base) 첫 번째 요소의 첨자는 0이 되며 마지막 요소의 첨자는 배열 크기보다 항상 하나 더 작다. int array[5]의 마지막 요소는 array[5]가 아니라 array[4]가 된다. 배열 요소를 이렇게 첨자로 참조할 수 있는 이유는 같은 배열에 속한 요소들은 모두 연속적인 메모리에 이웃하게 배치되기 때문이다. 그래서 첨자에 타입의 크기를 곱한 위치를 읽으면 쉽게 요소의 메모리를 액세스할 수 있다.

배열의 각 요소는 배열이라는 큰 집합의 일부분이라는 것 외에는 같은 타입의 변수와 완전히 동일한 자격을 가진다. array[3]이라는 요소는 정수형 변수이며 정수형 변수와 똑같이 사용한다. array[3]=123;과 같이 정수를 대입할 수도 있고 printf("%d",array[3]); 과 같이 값을 읽을 수도 있다. array가 정수형 변수를 모아 놓은 것이고 array[3]은 그 중 하나를 떼어 놓은 것이므로 완전한 정수형 변수인 것이다.

배열의 사용예를 보도록 하자. 학생 30명의 성적을 처리하는 프로그램을 작성한다고 해 보자. 30개나 되는 변수를 각각 따로 만들 필요없이 크기 30의 배열을 하나 선언하기만 하면 된다.

 

int Score[30];

 

이렇게 하면 Score라는 이름으로 30개의 성적을 저장할 수 있는 정수형 변수 집합이 생성된다. Score[0]부터 Score[29]까지 정수형 변수 30개가 연속적인 메모리 공간에 생성되는 것이다. 이 배열에 학생들의 성적을 입력받을 때는 다음과 같은 반복문을 사용한다.

 

for (i=0;i<30;i++)

     scanf("%d",&Score[i]);

 

for문은 반복적인 처리를 하는 문장인데 다음 장에서 배우게 될 것이다. 이렇게 입력된 성적을 가공하는 것도 아주 쉽다. 점수의 총합을 구하고 싶으면 Score[0]~Score[29]까지의 값을 더하기만 하면 된다.

 

Sum=0;

for (i=0;i<30;i++)

     Sum=Sum+Score[i];

 

Score라는 하나의 이름으로 성적 자료를 한곳에 모아 두었으므로 평균이나 분산, 최빈값 등을 구하는 것도 아주 쉽다. 뿐만 아니라 특정 학생의 성적을 조회한다거나 바꾸는 조작도 학생 번호를 첨자로 사용하면 간단하게 해결된다. 만약 배열이 없다면 반복을 할 수가 없고 다음과 같이 해야 할 것이다.

 

int Score0, Score1, Score2, Score3, ..... Score29;

scanf("%d",&Score1);

scanf("%d",&Score2);

scanf("%d",&Score3);

....

scanf("%d",&Score29);

 

필요한만큼 변수를 일일이 선언한 후 사용해야 하니 얼마나 끔찍한가? 30명 정도라면 이렇게 할 수 있겠지만 학생이 천 명정도 된다면 도저히 이런 방식으로는 자료를 처리할 수가 없을 것이다. 가끔 다음 코드가 동작할 것이라고 생각하는 순진한 사람도 있다.

 

for (i=0;i<30;i++)

     scanf(%d",&Scorei);

 

i를 0 ~ 29까지 반복하면서 Scorei를 참조하면 차례대로 Score0, Score1, Score2 변수를 사용할 것 같지만 컴파일러는 Scorei를 하나의 명칭으로 인식하므로 이렇게 되지는 않는다. 그래서 배열이 필요한 것이다. 배열은 하나의 이름으로 동일한 자료들의 집합을 다룰 수 있고 반복적인 처리가 가능하다는 점에서 아주 실용적인 타입이다.

배열의 크기값을 두 개 주면 2차 배열이 된다. 2차 배열은 두 개의 첨자를 가지며 요소를 참조할 때는 두 첨자를 밝혀야 한다. 마치 2차원 좌표 공간에서 한 점을 지정할 때 x, y 두 개의 좌표값을 주는 것과 같다. 다음은 학생과 과목번호를 첨자로 사용하는 2차 배열을 선언한 예이다.

 

int Score[3][10];

 

첫 번째 첨자가 과목의 번호이고 두 번째 첨자가 학생의 번호이다. 컴파일러는 이 선언문에 의해 Score라는 배열에 3*10개의 정수형 변수를 담을 수 있는 메모리(총 120바이트)를 할당한다. 이때의 메모리 모양을 그림으로 그려 보면 다음과 같을 것이다. 실제 메모리에는 선형적으로 배치되지만 2차 배열은 개념적인 도표(table)로 생각할 수 있으므로 일반적으로 표 형식으로 그리며 그렇게 생각하는 것이 더 편리하다.

이렇게 배열에 도표 형태로 성적값들이 저장되어 있다면 이 배열로 성적을 처리하는 것은 아주 쉽다.

 

1번 과목의 총합 : Score[1][0] ~ Score[1][9]까지의 합

5번 학생의 총점 : Score[0][5] ~ Score[2][5]의 합

전체 학생 전체 과목의 총점 : Score[0][0] ~ Score[2][9]까지의 합

 

이런 식으로 반복 처리하면 된다. 총점이 구해지면 평균이나 석차는 약간의 처리만 하면 쉽게 구할 수 있다. 3차 배열이나 4차 배열도 만들 수 있는데 메모리만 충분하다면 얼마든지 큰 배열도 가능하다. 배열에 대한 좀 더 자세한 내용에 대해서는 다음에 따로 배우게 될 것이다. 여기서는 배열이 동일 타입 변수의 집합이라는 정의와 반복적인 처리에 유리하다는 점에 대해서만 직관적으로 이해하도록 하자.


7-2. 구조체

동일한 타입의 집합인 배열과는 달리 구조체(Structure)는 서로 다른 타입의 집합이다. 이때 구조체에 속하는 개별 변수들을 멤버(Member)라고 한다. 정수형 변수와 실수형, 문자형 등의 기본형 변수뿐만 아니라 배열이나 구조체같은 큰 변수도 멤버가 될 수 있다. 구조체도 변수이므로 당연히 이름을 가져야 한다. 또한 구조체에 속하는 각 멤버들도 고유의 타입과 이름을 가진다. 구조체를 선언할 때는 struct라는 키워드를 사용하며 기본 형식은 다음과 같다.

 

struct {

          멤버 목록

변수명;

 

멤버 목록에는 일반 변수 선언문이 오는데 구조체 하나에 여러 개의 변수들을 포함할 수 있으므로 필요한만큼 멤버 변수를 선언하면 된다. 다음이 구조체의 예이다.

 

struct {

     char Name[10];

     int Age;

     double Height;

} Friend;

 

Friend 구조체는 친구 한명의 신상 정보를 가지며 이름, 나이, 키 등을 멤버로 가지고 있다. Name, Age, Height 등은 타입이 다른 변수들이지만 Friend라는 하나의 구조체 이름으로 모여 있다. 더 많은 정보를 저장하고 싶다면 주소, 성별, 전화번호, 취미, 몸무게 등의 멤버를 얼마든지 추가할 수 있다. 멤버는 선언된 순서대로 메모리에 할당된다.

Name 멤버가 10바이트, Age 멤버는 정수형이므로 4바이트, Height는 실수형이므로 8바이트를 차지할 것이다. 구조체 전체의 크기는 멤버들 크기의 총합과 같은데 Friend 구조체는 22바이트의 크기를 가진다. 구조체의 멤버를 참조할 때는 .(점)연산자를 사용하여 구조체.멤버 식으로 적으면 되는데 이때 . 연산자는 영어로 of, 한국어로 ~의로 해석하면 쉽게 이해할 수 있다.

 

Friend.Age=28;

printf("내 친구 이름은 %s이다",Friend.Name);

 

구조체 하나는 여러 개의 다른 타입 변수들을 포함할 수 있으므로 얼마든지 복잡한 정보를 표현할 수 있다. 도서 정보라면 책 제목, 저자, 출판사, 가격, ISBN 등의 정보를 가질 것이고 컴퓨터에 대한 정보라면 CPU, 하드 디스크, 메모리, 광학 드라이브, 모니터 크기 등의 정보들을 가지는데 이런 정보들을 하나의 구조체로 관리할 수 있다.

또한 이런 구조체 여러 개를 모아 구조체 배열을 만들면 복잡한 정보의 집합을 다룰 수도 있다. Friend 구조체는 한 사람에 대한 신상을 기억하는데 이런 타입의 배열을 만들면 주소록이 된다. Friend[100]의 형식으로 구조체 배열을 작성하면 최대 100명의 친구 신상을 기억시킬 수 있을 것이다.

공용체(Union)는 구조체와 유사하지만 멤버끼리 기억 공간을 같이 공유한다는 점이 조금 다르다. struct 키워드 대신 union키워드를 사용하며 초보자에게는 다소 어려운 개념이므로 여기서는 공용체라는 것도 있다는 것만 알아두고 자세한 사용 방법은 다음에 보도록 하자. 

7-3. 포인터

다음은 C의 데이터 타입중에 가장 이해하기 어려운 포인터에 대해 간략하게 소개한다. C 공부를 시작할 때 벌써 소문을 들어서 알고 있겠지만 C의 문법중에서 가장 어렵고 난해한 주제이면서 또한 C를 가장 강력한 언어로 만들어주는 일등 공신이기도 하다. 포인터를 직접 다룰 수 있기 때문에 C언어를 고급언어가 아닌 중급언어로 분류하며 어셈블리와 같은 수준의 시스템 프로그래밍까지도 가능하다.

정수형이나 실수형의 일반적인 변수들은 수치값을 저장한다. 이에 비해 포인터형은 번지를 기억한다는 면에서 일반적인 변수와는 조금 다르다. 데이터가 보관되어 있는 메모리 위치를 기억하고 있기 때문에 직접 값을 조작할 수도 있고 주변의 다른 값까지도 손델 수 있다. 또한 위치는 단순히 4바이트의 번지이기 때문에 함수의 인수로 전달하거나 받기도 효율적이며 함수로 포인터를 전달하면 포인터가 가리키는 메모리를 함수가 직접 조작하는 것이 가능하다.

포인터를 알려면 우선 번지(Address)의 개념에 대해 알아야 한다. 컴퓨터의 주 기억 장치로 사용되는 RAM은 용량이 아주 커서 보통 백만(M) 또는 10억(G) 단위를 사용한다. 컴퓨터에 실제 RAM이 얼마만큼 장착되어 있는가에 상관없이 32비트 운영체제 환경에서 각 프로그램은 32비트의 가상 메모리 공간을 사용할 수 있다. 즉 값을 기억할 수 있는 메모리의 용량은 최대 4G가 된다.

컴퓨터는 메모리의 위치를 구분하기 위해 순서대로 번호를 붙여 관리하는데 이 번호를 번지라고 한다. 최초의 시작 번지는 0번이고 순서대로 1번, 2번, 3번,... 순으로 번호가 매겨져서 40억까지 번지가 붙어 있다. 그래서 컴퓨터는 메모리 중의 특정 바이트를 지칭할 때 이 번지를 사용하여 정확한 위치의 값을 읽고 쓴다.

 

int Num;

 

이 선언문은 앞으로 Num이라는 이름의 정수형 변수를 사용하고 싶다는 뜻이다. 컴파일러는 이 선언문을 만났을 때 당장 사용되지 않는 메모리 공간 4바이트를 할당하고 이 번지에 Num이라는 이름을 붙여 준다. Num이 실제 어떤 번지에 할당될 것인가는 여유 메모리가 어디쯤에 있는지에 따라 달라지기 때문에 실행할 때마다 다르다. 설명의 편의상 1234번지에 할당되었다고 한다면 이때의 메모리 상황은 다음과 같을 것이다.

사용자는 Num 변수가 메모리의 어느 위치에 할당되어 있는가에 상관없이 Num=629; 이런 식으로 변수의 값을 읽거나 쓰기만 하면 된다. 컴파일러는 Num이 할당된 번지를 기억하고 있다가 이 변수를 참조하면 해당 메모리의 값을 읽거나 변경한다.

이때 Num으로 읽고 쓰는 것은 Num이 할당된 번지에 기억되어 있는 값이지 Num의 실제 위치인 번지가 아니다. 즉, C 컴파일러는 변수에 대한 참조문을 변수의 값에 대한 참조로 해석하며 변수의 번지를 참조하는 것이 아니다. 따라서 Num을 읽으면 629가 읽혀지며 1234가 읽혀지지 않는다. 만약 Num이 할당되어 있는 번지값을 알고 싶거나 직접 다루고 싶다면 이때 포인터라는 것이 필요하다. 포인터란 변수의 값이 아닌 변수가 저장되어 있는 메모리의 번지를 기억하는 타입이다. 포인터는 다음과 같이 선언한다.

 

타입 *변수명;

 

타입은 포인터가 가리키는 변수가 어떤 종류인가를 지정하며 int, char, double 등의 기본형과 배열, 구조체, 사용자 정의형 등의 모든 타입이 가능하다. 이 선언문에 사용된 *는 뒤쪽의 명칭이 포인터 변수임을 지정하는 구두점이다. 정수형 변수의 번지를 기억하는 변수 pi는 다음과 같이 선언한다.

 

int *pi;

 

이후 pi는 임의의 정수형 변수가 기억된 번지를 가질 수 있다. 다음 두 연산자는 포인터 변수와 함께 사용되어 번지와 관련된 연산을 한다.

 

* : 포인터가 가리키는 번지의 값을 읽는다.

& : 변수가 기억되어 있는 메모리 번지를 읽는다.

 

일단 두 연산자의 의미를 암기한 후 다음 예제를 작성해 보자. 

[pointer]

포인터의 개념을 설명하기 위한 아주 간단한 예제이다. 실행하면 "Num의 값은 629입니다."라는 문자열이 출력된다. int Num=629; 선언에 의해 4바이트의 메모리 공간이 할당되고 629라는 값으로 초기화된다. Num이 어떤 번지에 할당될 것인가는 알 수 없지만 설명의 편의상 1234번지에 할당되었다고 가정하자.

int *pi; 선언에 의해 정수형 변수의 번지를 가리킬 수 있는 포인터 변수 pi가 생성된다. 그리고 pi=&Num; 대입문에 의해 pi는 Num이 기억되어 있는 메모리 번지 1234라는 값을 가지게 될 것이다. &연산자를 변수명앞에 붙이면 변수의 값이 아닌 번지가 조사된다. 여기까지의 메모리 상황은 다음과 같다.

Num은 1234번지에 할당되어 있고 629라는 값을 가지고 있다. pi=&Num; 대입문에 의해 pi에 1234라는 번지값이 기억되는데 pi는 Num이 저장된 번지를 가리키고 있는 것이다. 이 상태에서 *pi로 값을 읽으면 Num 변수의 값이 읽혀진다.

*연산자는 포인터 변수가 가리키는 번지의 값을 읽는데 pi가 1234번지를 가리키고 있으므로 이 번지로 찾아가 그 값을 읽어온다. pi가 &Num의 값, 즉 Num의 번지값을 가지고 있는 상황에서는 *pi가 Num과 동일하다. Num에 어떤 값을 대입하는 문장 대신 *pi=값; 식으로 대입하는 것도 가능하다. 이 경우 pi가 가리키는 1234번지를 찾아가 값을 변경한다.

그렇다면 Num 변수를 바로 읽으면 되는데 왜 이렇게 포인터라는 간접적인 방법을 사용하는가? 한단계 더 중간 과정을 거치게 되면 그 중간 과정에서 많은 유용한 조작이 가능해지기 때문이다. 소프트웨어 공학에서는 융통성을 위해 중간 과정(전문 용어로 레이어라고 한다)을 삽입하는 경우가 아주 빈번하며 한 번 더 과정을 거침으로써 많은 것들이 가능해진다. 예를 들어 비디오 드라이버, 자바 가상 머신 등등이 레이어의 좋은 응용예이며 네트워크는 무려 7개의 레이어로 구성되어 있다.

위 예제는 실용적인 가치는 없지만 포인터의 개념을 이해하는데 많은 도움을 준다. 이 예제가 어떻게 실행되는지 잘 감이 잡히지 않는 사람을 위해 비슷한 예제 하나를 더 작성해 보도록 하자. 다음 예제는 포인터를 사용하여 간접적으로 값을 대입한다.

[pointer2]


이번에는 실수형 변수를 사용해 보았다. Num1, Num2 두 개의 실수형 변수를 선언하고 Num1에 3.14라는 상수를 기억시켜 놓았다. Num2는 초기화되지 않았으므로 쓰레기값을 가지고 있을 것이다. 실수형이므로 둘 다 8바이트의 메모리를 점유하고 있다. 이 변수들이 할당된 실제 번지는 알 수 없지만 편의상 Num1은 1234, Num2는 5678에 할당되었다고 하자.

실수형 포인터 변수 pd는 &Num1, 즉 Num1이 할당된 번지값을 대입받았으므로 그 값은 1234일 것이다. 이때의 메모리 상황은 다음과 같다.

pd가 Num1의 번지를 가리키고 있다. 이 상태에서 Num2=*pd; 대입문을 실행하면 다음과 같은 연산이 수행된다.

pd가 가리키고 있는 번지를 먼저 찾아 가고 *연산자로 그 값을 읽는다. 그리고 Num2에 값을 대입하였다. 결국 이 예제는 포인터를 통해 간접적인 연산을 하지만 결과적으로는 Num2=Num1; 이라는 대입 연산을 하고 있다. 이 예제를 이해하면 포인터의 개념과 *, & 연산자에 대해 이해했다고 할 수 있다. 이 예제는 *, & 연산자의 동작을 잘 설명하는 전형적인 예제인데 만약 이 두 연산자가 헷갈린다면 항상 이 예제를 생각해 보기 바란다.

이상으로 포인터 타입에 대한 간략한 소개만 했다. 포인터는 한 장을 다 할애해도 설명하기 힘들고 포인터만 다루는 전문 서적이 있을 정도로 어려운 개념이므로 현재 단계에서 크게 욕심 내지 말고 개념만 익히기 바란다. 누가 "포인터가 뭐야?" 라고 물으면 짧게나마 "포인터란 이런 것이야" 라고 대답할 수 있을 정도면 충분하다.

 

앞의 두 예제는 포인터의 기본 개념과 *, & 연산자의 동작을 이해하는데 아주 중요한 의미를 가지고 있다. 논리를 이해한 후 소스를 다시 복원해 보고 이왕이면 메모리속에서 일어나는 일들을 그림으로 그려 설명해 보자. 


7-4. 사용자 정의형

언어가 지원하는 데이터 타입이 아무리 풍부해도 프로그램의 특수한 요구를 다 수용할 수는 없다. 그래서 C는 기존 타입들로부터 사용자가 새로운 타입을 정의하는 방법을 제공한다. 사용자 정의형 타입을 만드는 기본 형식은 다음과 같다.

 

typedef 타입정의 타입이름;

 

형을 정의하는 것도 문장이므로 끝에 세미콜론을 반드시 붙여야 한다. 다음은 사용자 정의형 타입에 대한 몇 가지 예이다.

 

typedef int jungsoo;

typedef enum { True, False } Bool;

typedef int *pint;

typedef int arint[10];

typedef struct { int a; double b; } myst;

 

첫 번째 예는 별로 실용성은 없지만 jungsoo라는 이름으로 int 형에 대한 단순한 별명을 만든 것이다. jungsoo가 int와 똑같은 타입이 되었으므로 int i;라고 선언하나 jungsoo i;라고 선언하나 똑같은 변수가 만들어질 것이다. 두 번째 예는 True, False를 멤버로 가지는 열거형을 Bool이라는 이름의 사용자 정의형 타입으로 새로 만들었다. 이렇게 타입을 정의해 놓으면 다음부터는 Bool형의 변수를 언제든지 선언할 수 있다. 사용자가 만든 타입도 int나 double같은 기본형과 완전히 동일하며 기본형이 올 수 있는 모든 곳에 사용자 정의형도 올 수 있다.

 

Bool Male;

Male=True;

 

pint는 정수형 포인터 타입이며 arint는 크기 10의 정수형 배열 타입이다. 보다시피 타입이름이 반드시 끝에만 나오는 것이 아니라 조금 혼란스럽기도 하다. X형의 데이터 타입을 정의하는 방식은 요령만 알면 생각보다 간단하다. X형의 변수를 선언하는 문장에서 변수를 타입명으로 바꾸고 앞에 typedef키워드만 붙이면 된다.

사용자 정의 타입도 모든 면에서 기존 타입과 동등한 자격을 가진다. 사용자 정의형의 배열을 만들 수 있고 사용자 정의형 포인터도 가능하다. 사용자 정의형은 가독성을 높이는 효과가 있는데 주로 구조체같이 큰 타입에 대해 별도의 타입을 정의하여 사용하는 경우가 많다.


 

'old > C Grammer' 카테고리의 다른 글

기억 부류  (0) 2010.11.18
함수  (0) 2010.11.17
연산자  (0) 2010.11.16
제어문  (0) 2010.11.15
현정누나 요약 C/C++  (0) 2010.08.17
Posted by jazzlife
,

shell 한글 입력

Web/Ubuntu 2010. 11. 12. 11:03

$ sudo apt-get install language-pack-ko
$ sudo apt-get install language-pack-ko-base

1. Check / etc / environment

$ sudo nano / etc / environment

LANG = "ko_KR.UTF-8"
LANG = "ko_KR.EUC-KR"
LANGUAGE = "en_US: en: en_GB: en"

2. Check / etc / default / locale
3. Check / etc / profile

$ sudo nano / etc / profile

LANG = "ko_KR.UTF-8"


4. And reboot!

$ sudo shutdown -r now



'Web > Ubuntu' 카테고리의 다른 글

iso 이미지 만들기, cd 굽기  (0) 2011.02.12
[error] E: Sub-process /usr/bin/dpkg returned an error code (1)  (0) 2011.01.26
[error] setuid  (0) 2010.05.06
싱글모드 부팅  (0) 2010.05.06
우분투(ubuntu) apt-get 사용  (0) 2010.05.06
Posted by jazzlife
,

freeware ; 프리웨어

프리웨어는 아무런 대가없이 제공하는 프로그램을 말한다. 그러나, 저작권은 살아있으므로 다른 사람들은 저작권자의 허락없이는 그 프로그램에 어떠한 것도 추가로 개발하여 넣을 수 없다. 이런 제한이 가장 적은 무가(無價) 프로그램은 공개 소프트웨어이며, 많은 유닉스 프로그램들이 그 예이다. 자신의 프로그램 속에 공개 소프트웨어를 재사용하려면, 그 프로그램에 대해 그간의 경과나 역사를 조사해봄으로써 그 프로그램이 실제로 대중에게 공개된 완전한 공개프로그램인지를 확실히 해두는 것이 좋다.

"프리"라고 불리는 프로그램 중에는 라이트웨어, 포스트카드웨어, 셰어웨어 등 다양한 이름으로 불리는 것들이 있으나, 사용할 수 있는 조건이 각각 다소 다르니 함께 참조하라.

'old > 용어정리' 카테고리의 다른 글

gigabit ; 기가비트  (0) 2010.11.15
garbage and garbage-collecting ; 가배지 또는 자투리 모으기  (0) 2010.11.15
format ; 포맷  (0) 2010.11.11
footprint  (0) 2010.11.11
flowchart ; 순서도 또는 플로우차트  (0) 2010.11.11
Posted by jazzlife
,

format ; 포맷

old/용어정리 2010. 11. 11. 11:32

format ; 포맷

  1. (명사로서 쓰일 때...) 포맷이란 데이터를 위해 미리 설정되는 레이아웃으로서, 우리말로는 '형식'이라는 용어와 동일하게 쓰인다. 프로그램들은 보통 어떤 특정한 형식의 데이터만을 입력으로 받아들이고, 처리할 수 있으며, 출력할 때에도 입력과 같은 형식으로 출력하는 것이 보통이지만, 여러 가지 다른 형식으로 출력할 수 있는 프로그램들도 있다. 특정 포맷으로 저장된 모든 데이터들은, 그 포맷을 다루는 방법을 알고 있는 프로그램에 의해서만 처리될 수 있다.
  2. (동사로서 쓰일 때...) 프린트하거나 화면에 표시할 문서 또는 파일에 대해 '포맷한다'는 것은 출력장치가 그 내용을 어떻게 표현해야하는 지에 관한 필수적인 정보를 추가하는 것을 말한다.
  3. (동사로서 쓰일 때...) 하드디스크디스켓을 포맷하는 것은 매체상의 저장공간을 설정한 다음, 저장된 데이터들을 어떻게 접근할 것인지를 정확하게 알 수 있도록 파일배치표(FAT)를 만드는 것이다. 저장공간의 설정은 저장이 편리하고 쉽게 접근할 수 있도록 그들의 공간을 조직화하고 여러 조각으로 나누는 것을 말하는데, 하드디스크는 섹터, 트랙 및 클러스터라고 불리는 영역들로 나뉠 수 있다.
Posted by jazzlife
,

footprint

old/용어정리 2010. 11. 11. 11:30

footprint

정보기술에서, footprint란 특정 하드웨어소프트웨어 단위가 차지하고 있는 공간의 크기를 말한다. 만약 마케팅 브로슈어에서, 새로운 하드웨어 유니트나 데스크탑 디스플레이가 "더 작은 footprint를 갖는다"라는 설명을 했다면, 그것이 방이나 책상 위에서 차지하는 공간이 전보다 더 작아졌다는 것을 의미한다. 최근에 이 용어는, 컴퓨터의 내부 공간을 적게 차지하는 마이크로컴포넌트들이나, 메모리를 적게 차지하는 소프트웨어를 가리키는데 사용된다.

Posted by jazzlife
,

flowchart ; 순서도 또는 플로우차트

플로우차트는 프로그램 논리순서, 작업 또는 제조공정, 조직도 또는 비슷한 형식을 갖춘 구조 등을 그래픽으로 표현하기 위한 형식이다. 이전에 플로우차트는 컴퓨터 프로그래밍에서 프로그램 내 각각의 처리 경로를 묘사하기 위해 사용되었었다. 프로그래머는 자신의 논리를 머리 속에 간직하지 말고, 항상 플로우차트를 통해 가시화 하도록 요구받아 왔다. 객체지향 프로그래밍과 비주얼 개발 도구의 출현과 함께, 전통적으로 프로그램에 쓰여왔던 플로우차트는 이제 자주 보기 어렵게 되었다. 그러나, 객체지향 프로그래밍에서 사용되는 데이터클래스 모델링을 위한 새로운 플로우차트가 사용될 수 있다.

전통적인 프로그램의 플로우차트는 단순한 기하학적 기호를 사용했는데, 예를 들어 프로세스는 직사각형으로, 판단은 마름모꼴, 그리고 입출력처리는 야구의 홈플레이트와 같이 생긴 기호를 쓴다. 이러한 기호들은 ANSI x3.5나 ISO 1028에 정의되어 있다.

'old > 용어정리' 카테고리의 다른 글

format ; 포맷  (0) 2010.11.11
footprint  (0) 2010.11.11
FPU (floating point unit) ; 부동소수점 처리장치  (0) 2010.11.11
FLOPS (floating-point operations per second) ; 플롭스  (0) 2010.11.11
flip-flop ; 플립플롭  (0) 2010.11.10
Posted by jazzlife
,

FPU (floating point unit) ; 부동소수점 처리장치

수치연산 보조프로세서로도 알려져 있는 FPU는 컴퓨터가 사용하는 기본 마이크로프로세서보다 더 빠르게 숫자를 다를 수 있는 특별한 회로 설계 또는 마이크로프로세서를 말한다. FPU는 전적으로 대형 수학적 연산에만 초점을 맞춘 특별한 명령 셋을 가지고 있어서 그렇게 빠르게 계산을 수행할 수 있는 것이다. FPU는 오늘날의 거의 모든 PC에 장착되고 있지만, 실은 그것은 그래픽 이미지 처리나 표현 등과 같은 특별할 일을 수행할 때에만 필요하다. FPU가 장착되어 있지 않은 PC는 FPU 에뮬레이터를 설치함으로써 간간이 이러한 장치를 필요로 하는 소프트웨어를 처리할 수 있다.

부동소수점 숫자들은 어떤 소수점 위치를 가지고 있는 숫자를 말한다 (2.17986 등과 같이). 이것은 "부호"(양 또는 음), 의미 있는 숫자들인 "가수", 그리고 크기를 나타내면서 결국은 소수점이 찍힐 위치를 정하게 되는 "지수" 등 세 부분으로 저장된다. 부동소수점 숫자들은 이진수이다.

웹에서 다운로드할 수 있는 매크로미디어사의 쇽웨이브와 같은 프로그램들을 사용하려면, 자신의 컴퓨터에 FPU가 장착되어 있어야만 한다. 만약 자신의 컴퓨터에 FPU가 장착되어 있지 않다면, 마치 하드웨어적으로 FPU가 장착되어 있는 것처럼 보이게 해주는 FPU 에뮬레이터를 다운로드해서 사용하면 된다.

'old > 용어정리' 카테고리의 다른 글

footprint  (0) 2010.11.11
flowchart ; 순서도 또는 플로우차트  (0) 2010.11.11
FLOPS (floating-point operations per second) ; 플롭스  (0) 2010.11.11
flip-flop ; 플립플롭  (0) 2010.11.10
file formats  (0) 2010.11.10
Posted by jazzlife
,

FLOPS (floating-point operations per second) ; 플롭스

플롭스는 초당 수행할 수 있는 부동소수점 연산의 횟수를 의미하는 컴퓨터 성능 단위이다. 예를 들어 1 MFLOPS라면 1초에 백만번의 부동소수점 연산을 처리할 수 있다는 것을 의미한다. 플롭스 단위는 일반적으로 컴퓨터의 FPU 성능을 나타낼 때 주로 이용하고 있다. 참고로 펜티엄 133 MHz 프로세서를 이용하면 3차원 그래픽 연산에서 32~36 MFLOPS의 성능을 나타내며, OpenGL을 기반으로 운영하는 그래픽 프로그램을 가속할 수 있는 프리미디어 2 칩셋에는 100 MFLOPS 연산기가 내장되어 있다.

'old > 용어정리' 카테고리의 다른 글

flowchart ; 순서도 또는 플로우차트  (0) 2010.11.11
FPU (floating point unit) ; 부동소수점 처리장치  (0) 2010.11.11
flip-flop ; 플립플롭  (0) 2010.11.10
file formats  (0) 2010.11.10
field ; 필드  (0) 2010.11.10
Posted by jazzlife
,

자바를 공부하시는분들이 용어를 많이 헷깔려 하더군요...

저역시 그랬구요...

그래서 정리 한번 해봅니다.

자바를 공부하는 사람으로서 꼭 알아야 하는 간단한 용어 몇가지입니다^^


SDK => Standard Development Kit 혹은 Software Development Kit

위의 두가지 표현 모두 맞다고 보시면 됩니다.

어떻게 사용하고, 어떻게 해석하는가에 따라 다르지만 내용은 비슷합니다.

SDK는 자바뿐만아니라 모든 개발언어의 소프트웨어 개발 킷을 말합니다.

프로그램을 개발하려면 개발하는 프로그램이 있어야 겠죠? 그것을 말합니다^^


JDK => Java Development Kit

위에 설명한 SDK가 모든 소프트웨어 개발 킷이라면...  JDK는 말그대로 JAVA 개발 킷을 말합니다. 즉, Java용 SDK의 이름이 JDK라고 표현할수 있죠.

그런데 요즘들어 J2SE Development Kit라고 표현되있는것을 볼수있습니다.

이것은 J2SE의 JDK를 다운받을때 볼수 있는데요...

java.sun.com 홈페이지에 가보면... sun에서는 J2SE의 경우 jdk라 표현하며... 이때 J2SE Development Kit라고 되있습니다. 그리고 J2EE의 경우 j2eesdk라고 되있더군요.

즉, 최근 sun에서는 J2SE의 개발킷을  jdk라고 표현하며... J2EE의 개발킷은 j2eesdk라고 표현하더군요.


J2SDK => Java2 Standard Development Kit 혹은 Java2 Platform Standard Development Kit

위에 JDK설명에서 보시듯이 요즘 J2SE의 개발킷을 JDK라 표현하는데요...

예전에 java2 platform이 출시되었을 당시 java1과 구분하기위해  J2SDK라고 표현 했습니다.

즉, 현제는 java2 platform만 사용하기 때문에 JDK와 동일하다고 보시면 됩니다.


J2SE => Java 2 Standard Edition 혹은  Java2 Platform Standard Edition

J2SE는 말그대로 java의 표준 플렛폼 입니다.


J2ME => Java 2 Micro Edition혹은  Java2 Platform Micro Edition

J2ME는 규모가 작은곳에 프로그램을 개발하기 위한 플렛폼 입니다.

예를들면 PDA를 들수있죠^^


J2EE => Java 2 Enterprise Edition혹은  Java2 Platform Enterprise Edition

J2EE는 웹기반의 엔터프라이즈 어플리케이션을 구축하기 위한 플렛폼 입니다.

대표적으로 EJB가 있죠^^


JRE => J2SE Runtime Environment

JRE는 실행버젼입니다. JDK로 제작한 테스트 프로그램등을 실행할수 있도록 해주죠.

그래서 파일용량이 적은대신 개발할수는 없습니다.

기본적으로 디벨로퍼킷에 JRE가 포함되어 있으므로 따로 설치할 필요가 없습니다.

예를들면 한글뷰어 아시죠?

한글파일을 작성할수는 없지만 읽을수는 있죠.

이것과 비슷합니다^^

출처 : 네이버지식인 오픈사전 노하우 [작성자:cloudyeyes]

URL : http://kin.naver.com/knowhow/entry.php?eid=HMPsi8IAo1iprm9VUPg/vPEBd86+0XuC

'old > JAVA' 카테고리의 다른 글

객체지향 프로그래밍의 4대 특징  (0) 2010.11.10
정규표현식 정리  (0) 2010.08.25
abstract와 interface  (0) 2010.07.01
Scanner, StringTokenizer, DecimalFormat, ChoiceFormat, MessageFormat  (0) 2010.05.25
HashMap, TreeMap, Properties  (0) 2010.05.25
Posted by jazzlife
,

 

내가 객체지향을 공부했어!

객체지향 프로그래밍엔 빠삭해!

XXX 객체지향 언어에 대해서는 모르는 게 없다!

 

이렇게 말할 수 있으려면 객체지향의 4대 특징을 이야기 할 수 있어야 하고 그 객체지향 언어가 어떤 문법을 통해 4대 특징을 지원하는 지 열거할 수 있어야 합니다. 그 만큼 객체지향 프로그래밍의 4대 특징은 객체지향의 핵심중의 핵심입니다.

 

객체지향 프로그래밍의 첫번째 특징은 추상화 (abstraction)입니다. 추상화라고 하는 것은 객체들의 공통적인 특징(속성과 기능)을 뽑아내는 것입니다. , 우리가 구현하는 객체들이 가진 공통적인 데이터와 기능을 도출해 내는 것을 의미합니다.

 

그럼 추상화가 객체지향만의 특징이냐? 그렇지 않습니다. 추상화라고 하는 것은 절차지향 프로그래밍에서도 있어왔습니다. 대표적인 것이 구조체와 같은 사용자 데이터 형입니다. 이것은 데이터를 추상화해서 하나의 새로운 데이터 유형을 만드는 것입니다. 예를 들면 국어, 영어, 수학 점수를 모아 하나의 데이터 형으로 만든다면 아래와 같이 정의할 겁니다.

 

struct Sungjuk

{

  int kor_score;

  int eng_score;

  int math_score;

};

 

Sungjuk이라는 새로운 이름으로 데이터형을 정의하는 데 그 부속데이터로 kor_score, eng_score, math_score를 두고 있습니다. 성적이라는 데이터를 추상화를 통해 정의한 것입니다.

기능의 추상화도 있습니다. 함수가 바로 그것인데, 잘 쓰는 기능을 이름을 붙여 정의하였으니 기능을 추상화 한 것이죠. 여기서 데이터의 추상화와 기능의 추상화에서 알 수 있는 하나의 사실이 있습니다. 추상화라고 하는 것에는 항상 새로운 이름이 붙는다는 점입니다. 따라서 프로그래밍 입장에서 추상화라고 하는 것은 이렇게 정리해 볼 수 있습니다.

 

공통의 속성이나 기능을 묶어 이름을 붙이는 것

 

객체지향 프로그래밍에서 추상화는 그럼 무엇일까요? …

네 생각하는 대로 입니다. 클래스를 정의하는 과정이 바로 추상화라고 할 수 있습니다. 추상화관련 문법은 다음 장에서 다루기로 하고 일단 여기서 추상화 설명을 마치겠습니다.

 

 

두번째 특징은 바로 캡슐화(encapsulation)입니다. 객체지향에서 캡슐화는 데이터 구조' `데이터를 다루는 방법'를 결합시켜 묶는 것을 말합니다. 캡슐형태로 된 알약을 떠 올리시면 됩니다. 캡슐형 알약에는 질환을 치료하는 데 필요한 다른 종류의 약이 적정한 비율로 섞여있는 것을 볼 수 있습니다. 해당 질환을 치료하기 위한 목적으로 하나가 아닌 몇 가지 기능의 약을 하나의 캡슐안에 담은 겁니다.

객체지향에서 캡슐화도 마찬가지 입니다. 특정 객체가 독립적으로 역할을 제대로 수행하기 위해 필요한 데이터와 기능을 하나로 묶어 관리합니다. 객체가 맡은 역할을 수행하기 위한 하나의 목적을 위해 데이터와 기능들을 묶는 것이죠.

 

그런데 캡슐화라는 특징은 다른 의미로도 쓰입니다. , 데이터는 은닉하고 그 데이터를 접근하는 기능(함수)를 밖으로 노출한다는 의미를 나타낼 때 캡슐화라는 용어를 씁니다. 데이터를 기능이라는 캡슐로 보호한다는 것이죠.

 

 

 


위 그림처럼 데이터를 기능으로 보호하여 데이터의 입출력이 기능을 통해 통제되도록 설계하는 것을 말합니다. 역시 자세한 것은 뒤에 설명될 겁니다.

 

 

세번째 특징은 상속성(inheritance)입니다. 객체지향의 꽃입니다. 상속이 없으면 객체지향은 절차지향과 큰 차이가 나지 않습니다. 객체지향 문법이 어렵고 복잡해 질 이유도 없죠. 상속이란 특징을 가지면서 객체지향 언어가 절차지향 언어에 비해 문법의 규모가 2배이상 늘어났습니다.

 

상속이란 상위개념의 특징을 하위 개념이 물려받는 특징을 말합니다. 예를들어 남학생이라는 단어에는 학생이라는 단어의 특징을 물려받고 있습니다. 개념적 특징이 상속되는 것이죠. ‘학생이 갖는 특징을 그대로 계승하면서 남학생만 갖는 특징을 부가하여 남학생의 전체 특징이 형성됩니다. 이 개념을 프로그래밍에 도입한 것인데 하나의 클래스가 가지고 있는 특징(데이터와 함수)들을 그대로 다른 클래스가 물려주고자 할 때 상속성의 특징을 사용합니다.

 

 

네번째 특징은 다형성(polymorphism)인데 객체지향 개념 중 가장 까다롭고 4대 특징중에 가장 이해하기 어려운 특징입니다. 알았다고 해도 코딩으로 잘 활용이 안 되는 특징이기도 하죠. 이것을 잘 이해하고 활용한다면 객체지향 언어를 제대로 쓰는 것으로 봐도 무방할 정도입니다.

 

다형성의 의미는 약간 다른 방법으로 일을 하는 함수를 동일한 이름으로 호출해 주는 것을 말합니다. 이해가 잘 안 되죠?  예를 들어 보겠습니다. 홍길동이란 이름의 학생과 김철수라는 학생이 있다고 가정해 봅시다. 그런데 선생님이 홍길동을 바라 보면서 학생! 칠판 지워라고 명령을 했다고 합시다. 홍길동은 나름의 방법으로 칠판을 지울 겁니다. 다시 선생님이 김철수를 바라보면서 학생! 칠판 지워!’라고 명령했을 때 김철수도 자신만의 방법으로 칠판을 지울 겁니다. 그런데 홍길동이 지웠던 방식과는 다르겠죠? ‘학생! 칠판 지워.’라는 표현은 같지만 칠판을 지우는 행위는 다르게 나타나고 있습니다. 이것이 바로 다형성입니다. ‘학생! 칠판 지워.’라는 명령이 다양한 결과로 나타나기 때문에 이것을 다형성이라고 하는 것입니다.

 

프로그래밍 입장에서 다형성을 해석해 본다면 명령의 해석을 연결된 객체에 의존하는 것으로 정의할 수 있습니다. 이것도 나중에 자세히 코딩을 통해 설명할 것입니다.

 

 

이번 시간은 객체지향 프로그래밍 4대 특징의 정의 정도만 이해하시면 되겠습니다. 추상화를 이용한 프로그래밍 문법은 다음 시간에 하도록 하죠.

Posted by jazzlife
,

flip-flop ; 플립플롭

플립플롭은 두 가지 상태 사이를 번갈아 하는 전자회로를 말한다. 플립플롭에 전류가 부가되면, 현재의 반대 상태로 변하며 (0 에서 1 로, 또는 1 에서 0 으로), 그 상태를 계속 유지하므로 한 비트의 정보를 저장할 수 있는 능력을 가지고 있다. 여러 개의 트랜지스터로 만들어지며, SRAM이나 하드웨어 레지스터 등을 구성하는데 사용된다. 플립플롭에는 RS 플립플롭, D 플립플롭, JK 플립플롭, T 플립플롭 등 여러 가지 종류가 있다.

'old > 용어정리' 카테고리의 다른 글

FPU (floating point unit) ; 부동소수점 처리장치  (0) 2010.11.11
FLOPS (floating-point operations per second) ; 플롭스  (0) 2010.11.11
file formats  (0) 2010.11.10
field ; 필드  (0) 2010.11.10
fault-tolerant ; 무정지형  (0) 2010.11.10
Posted by jazzlife
,

file formats

old/용어정리 2010. 11. 10. 10:14

전세계의 모든 파일형식들 (파일 확장자 목록)

여기에 파일 확장자의 목록과 아울러 그 형식의 간단한 설명을 모아놓았습니다. 우리는 여기서 그 파일의 형식을 직접 보여주지는 못하지만(실제로 많은 파일형식들이 소유권 문제 때문에 보여줄 수 없습니다), 경우에 따라 우리는 파일형식의 정의나 관련정보에 대해 링크를 제공합니다.
일반적으로 특정 파일형식은 그 형식을 사용하는 전용 프로그램으로만 파일을 열거나 이용할 수 있습니다. 그러나 웹 페이지의 이미지에 사용되는 GIF 파일형식과 같은 것들은, 표준 파일형식을 지원하는 어떠한 프로그램으로도 열 수 있습니다.
이 목록을 만드는데 많은 사람들이 기여하였으며, 그분들께 감사드립니다. 만약, 이 목록에 누락되어 있는 파일확장자가 있다면, 저희에게 메일로 알려 주시기 바랍니다. 즉시 추가하겠습니다.

"A"로 시작되는 파일 확장자의 목록이 보여집니다."B"로 시작되는 파일 확장자의 목록이 보여집니다."C"로 시작되는 파일 확장자의 목록이 보여집니다."D"로 시작되는 파일 확장자의 목록이 보여집니다."E"로 시작되는 파일 확장자의 목록이 보여집니다."F"로 시작되는 파일 확장자의 목록이 보여집니다."G"로 시작되는 파일 확장자의 목록이 보여집니다."H"로 시작되는 파일 확장자의 목록이 보여집니다."I"로 시작되는 파일 확장자의 목록이 보여집니다."J"로 시작되는 파일 확장자의 목록이 보여집니다."K"로 시작되는 파일 확장자의 목록이 보여집니다."L"로 시작되는 파일 확장자의 목록이 보여집니다."M"으로 시작되는 파일 확장자의 목록이 보여집니다."N"으로 시작되는 파일 확장자의 목록이 보여집니다."O"로 시작되는 파일 확장자의 목록이 보여집니다."P"로 시작되는 파일 확장자의 목록이 보여집니다."Q"로 시작되는 파일 확장자의 목록이 보여집니다."R"로 시작되는 파일 확장자의 목록이 보여집니다."S"로 시작되는 파일 확장자의 목록이 보여집니다."T"로 시작되는 파일 확장자의 목록이 보여집니다."U"로 시작되는 파일 확장자의 목록이 보여집니다."V"로 시작되는 파일 확장자의 목록이 보여집니다."W"로 시작되는 파일 확장자의 목록이 보여집니다."X"로 시작되는 파일 확장자의 목록이 보여집니다."Y"로 시작되는 파일 확장자의 목록이 보여집니다."Z"로 시작되는 파일 확장자의 목록이 보여집니다.숫자로 시작되는 파일 확장자의 목록이 보여집니다.

$$$ 임시 파일
aac MPEG-2, 어디밴스드 오디오 코딩 파일
ac3 AC3, 오디오 파일
ace ACE Archiver 압축 파일
acf 마이크로소프트 에이전트, HTTP 문자 파일
acl 코렐 드로우 6, 키보드 가속기 파일
acm 윈도우 시스템 디렉토리 파일
acm Fallout 1,2, Baulder's Gate, 인터플레이 압축 사운드 파일
acm Dynamic Link Library (DLL)
acs 마이크로소프트 에이전트, 문자 구조의 저장 파일
ads GNAT, Ada source text specification
ahq AudioHQ 플러그인 모튤
ai 어도비 일러스트레이터 파일
ai 코렐 트레이스 드로잉
aif, aiff Audio Interchange File, 실리콘그래픽스와 매킨토시의 응용프로그램에서 사용되는 사운드파일 형식
ais ACDSee, 이미지 순서 파일
albm HP Photosmart, 사진 출력용 앨범 파일
alz 이스트소프트 - 알집, 압축 파일
app Centura Team Developer, Normal mode 애플리케이션 파일
app 심포니, 애드인 애플리케이션
app 마이크로소프트 비주얼 폭스프로, 생성된 애플리케이션 또는 활성화된 문서
app dBase, 애플리케이션 생성기 객체
app DR-DOS, 실행 애플리케이션
app 폭스프로, 생성된 애플리케이션
apr ArcView 프로젝트 파일
apr Employee Appraiser 퍼포먼스 리뷰 파일
apr 로터스 어프로치 97 뷰 파일
arc LH ARC (old version) 압축 아카이브
arc SQUASH 압축 아카이브
arj Robert Jung ARJ 압축 아카이브
art AOL, Johnson-Grace 압축 파일
asd 마이크로소프트, Word 자동 백업 파일
asf 마이크로소프트 Advanced Streaming Format 파일
asm 어셈블러 파일, 컴파일되지 않은 어셈블리어 파일
asp Active Server Page 파일 (마이크로소프 ASP 스크립트를 포함하고 있는 HTML 파일)
asv 자동저장 파일 (Auto Save File)
asx Cheyenne 백업 스크립트
asx 마이크로소프트 Advanced Streaming Redirector 파일
asx 비디오 파일
att AT&T 그룹 4 비트맵
au Sun/NeXT/DEC/UNIX 등에서 쓰이는 사운드 파일
avi 윈도우즈 무비를 위한 마이크로소프트 오디오 및 비디오 파일
awd FaxView, 문서 이미지
 
bak 백업파일
bas 비주얼 베이직 모듈 파일
bat MS-DOS 일괄처리 파일
bgdb 영산정보통신 배움닷컴용 GVA, 인증기능을 가진 강의 파일 (배움닷컴에서만 서비스받을 수 있음)
bin 바이너리 파일
bkf 마이크로소프트 백업 파일
bmf Corel, 갤러리 파일
bmp 윈도우 또는 OS/2비트맵 그래픽 파일
bnk Electronic Arts 사운드 효과 뱅크 파일
bnk 애드립의 악기 뱅크 파일
btr Btrieve 5.1, 데이터베이스 파일
 
c C 언어 소스 코드
cab 마이크로소프트 캐비넷 파일 (소프트웨어 배포를 위해 압축된 프로그램 파일들)
cad 소프트데스크 드라픽스 캐드 파일
cal 윈도우 캘린더 파일
cam 카시오(Casio) 카메라 파일
cap 이야기97용 갈무리 파일
cat dBase, 카탈로그 파일
cbl RM-COBOL, 원시코드 파일
cc C++ 언어 소스 코드
cca cc:mail 아카이브 파일
cct Macromedia Director, 쇽웨이브 캐스트 파일
cda CD 오디오 트랙
cdb Pocket Access 데이터 베이스
cdf 마이크로소프트 채널 정의 형식 파일
cdr 코렐 드로우 파일
cdr 오디오 CD (공 CD) 데이터 파일
cdt 코렐 드로우 템플릿 파일
cdx 코렐 드로우 압축 파일
cer 보안 인증서
cfg 구성 파일
cfm ColdFusion, 템플릿
cfm 비주얼 dBASE, 윈도우 커스토머 폼
cfm 코렐. 폰트마스터 파일
cgi CGI 스크립트 파일
cgm 컴퓨터 그래픽 메타파일
chk 도스에서 CHKDSK를 써서 복원된 파일
chm Compiled HTML 파일
class 자바 클래스 파일
clp 윈도우 클립보드 파일
cls 비주얼베이직 클래스 모듈
cmd Windows NT (OS의 .BAT 파일과 비슷함) 및 OS/2의 명령 파일
cnt Windows 또는 기타 시스템, 도움말 색인 등의 목적으로 사용되는 콘텐츠 파일
cnv Word for Windows, 데이터 변환 지원 파일
cnv WordPerfect for Windows, 임시 파일
cnv WS_FTP Pro, 변환 파일
cob COBOL 소스 코드
com MS-DOS용 실행 파일
cpl 윈도우 제어판 파일
cpp 비주얼 C/C++ 소스 파일
cpx Corel Presentation Exchange, 압축된 도면 파일
crc RZSplit, 분할된 파일에 관한 정보
crw Canon, Raw Format
csd 드림투리얼리티, 통합 문서 포맷 파일 (Compact Shared Document)
css Cascading Style Sheet file (MIME)
csv Comma-separated values file
ctb Autodesk, AutoCAD 색상에 따른 플롯 스타일 표
cue 마이크로소프트 Cue Cards 데이터
cur 윈도우 커서
cxb 코믹구루, 만화 이미지 파일
cxx C++ 소스코드 파일
 
dat 데이터 파일, 어떤 종류의 MPEG에서는 확장자가 DAT로 되어 있는 경우도 있음
dbf dBase 파일
dbf Oracle 8.1.x 테이블공간 파일
dbi Borland, 데이터베이스 탐색 정보
dbk dBase 데이터베이스 백업
dbx Outlook Express 5, 메일 저장 파일
dcr 쇽웨이브 파일
dcu 델파이 컴파일드 유니트
dft BullsEye 스타일 시트
dft Metalix, cncKad2002 Drafting Tool
dgn Microstation95 CAD 도면
dib 장치 독립적인 비트맵 (Device-independent bitmap)
dir 매크로미디어 디렉터 파일
dir ProComm Plus 다이얼링 디렉토리
dll Dynamic Link Library
dlg C++, 다이얼로그 스크립트
dmp 화면이나 메모리의 덤프 파일
doc 마이크로소프트 워드 파일
dot 마이크로소프트 서식 파일
dpr 델파이 프로젝트 파일
drv 드라이버 파일
drw Micrografx 벡터 그래픽 파일
drw 로터스 프리랜스 이미지
drw Pro/E 드로잉
dsc Description 파일
dsc 오라클, 디스카드 파일
dsf Micrografx Designer v7.x
dsf Delusion, 디지털 사운드 파일
dsn ODBC 데이터 소스
dsp 마이크로소프트 디벨롭퍼 스튜디오, 프로젝트 파일
dsp 시그너춰, 디스플레이 매개변수들
dsp 닥터 할로, 그래픽 디스플레이 드라이버
dst C++/Delphi 데스크탑 설정치
dst 타지마 (Tajima) 컴퓨터자수기 파일
dsw Borland C++ 4.5, 데스크탑 설정치
dsw 마이크로소프트 디벨롭퍼 스튜디오, 작업공간 파일
dtd SGML의 문서형식정의(DFD) 파일
dun 마이크로소프트 윈도우 95/98, 다이얼업 네트워킹 파일
dwf Autodesk, 벡터 그래픽
dwf 마이크로소프트 WHIP autoCAD reader, 도면 웹 파일
dwg 오토캐드 파일
dwt 드림위버 템플릿 파일
dxf 도면 교환 (Drawing Interchange (eXchange)) 형식, 바이너리 DWG 형식의 텍스트 표현
dxr 디렉터 무비 파일 (편집불가)
 
ear 자바 엔터프라이즈 애플리케이션 패키징 유니트
ebs WindowsXP 스캐너 파일
ebs Rational, Rose 98 스크립트 소스
efx Everex EFax, 팩스 문서
efx Efax Reader, 팩스 문서
emf Enhanced Windows Metafile
eml 마이크로소프트 아웃룩 익스프레스, 메일 메시지 파일 (MIME RFC 822)
enc Lotus 1-2-3 - uuencode, Encoded file - UUENCODEd 파일
enc Encore, 음악 파일
env WOPR, Enveloper Macro
env Microsoft WordPerfect for Windows, 환경 파일
eps 캡슐화된 포스트스크립트 이미지
er1 ERWin 파일
erx ERWin 파일
esp 포스트스크립트 프린터를 위해 설계된 정보를 담고 있는 파일들
etf Enriched Text File
evt 이벤트 로그 (마이크로소프트 윈도우NT, 2000)
exe 실행 파일
exp 저장된 대화 (ICQ에서)
ext WS_FTP PRO, ASCII 이진전송 파일
 
f FORTRAN 파일
f FREEZE 압축파일 아카이브
fcd 가상 CD-ROM 파일
fcd FastCAD/EasyCAD 출력 파일
ffa 마이크로소프트 find fast 파일
fla 플래시 무비 파일
fli 오토데스크의 FLIC 애니메이션
flm 오토캐드, 필름 롤
flx DataFlex, 컴파일된 바이너리 파일
fmg FreeMarkets 그래픽 브라우저
fnt 이야기97용 글꼴 파일
fon 시스템 글꼴 파일
for FORTRAN 소스코드
frm 폼(form) 파일
fxr WinFax 수신문서 (TIFF 형식)
 
g APPLAUSE, 데이터 차트
g723 가공하지 않은 CCITT G.723 3 또는 5 비트 ADPCM 형식의 데이터
gal 이야기, 갈무리 파일
gdb 영산정보통신 GVA 및 GVA2000, 압축된 강의 파일
gdb InterBase 데이터베이스 파일
gid 윈도우95 글로벌 인덱스
gif 컴퓨서브 그래픽 파일
gsp Gnuzip, Zip 파일
gul 훈민정음 파일
gz 유닉스 gzip 압축 파일
 
h C 프로그램 헤더 파일
h30 한글 워디안, 한글97 문서를 한글 워디안으로 불러왔을 때 생기는 백업 파일
hdr 한그림97, 그림 파일
hdr Pc-File+, 데이터베이스 헤더 파일
hdr Egret, 데이터 파일
hdr ProComm Plus, 메시지 헤더 텍스트
hdr 1st Reader, 메시지 헤더 텍스트
hem AnyEQ 수식 매크로 파일
hft 아래아한글 글꼴 파일
hgl HP Graphics Language, 도면 파일
hhp ProComm Plus, 원격 사용자들을 위한 도움말 정보
hlp 도움말 파일
hma 한컴 글맵시 파일
hml HWPML(Hangul Word Processor Markup Language) 파일
hnt 힌트 파일. 게임 등에서 자주 사용된다.
hp THOR 데이터베이스, 제1 해시 파일
hp HP/GL, HP 프린터 또는 플로터 출력용 프린트 파일
hpt 한컴 슬라이드 파일
hsm 한컴 이지샘 파일
hst

(일반적으로) 히스토리 파일

hta 97 글맵시 파일
hta 시스템 레지스트리를 갱신하게 위해 바이러스에 의해 사용되는 HTML 파일
htm 하이퍼텍스트 문서
html 하이퍼텍스트 문서
htx 확장 HTML, 템플릿 파일
hwd Hollywood, 프레젠테이션
hwp 아래아한글 파일
hwt 아래아한글 서식 파일
 
icm Image Color Matching 프로필
icn 아이콘 소스코드
ico 아이콘 파일
idx Outlook Express 4, 메일 저장 파일
iff Interchange file, (Amiga ILBM)
iff Image (Sun TAAC/SDSC Image Tool)
igs CAD 오버레이 파일
img GEM, 이미지 파일
img Ventura Publisher, 비트맵 그래픽 파일
inc Include 파일 (어셈블러 언어 또는 Active Server)
indd Adobe, Indesign
inf 설치정보 파일
ini 초기화 파일, 환경설정 파일
ipx Interactive Pictures Corporation, AV 파일
iso ISO 9660 CD-ROM 파일시스템 표준에 기반을 둔, CD-ROM 상의 파일 목록
isu InstallShield, 언인스톨 스크립트
 
j6i Ricoh 디지털 카메라 파일
jar 자바 아카이브 (애플릿이나 관련 파일들을 위한 압축 파일)
java 자바 소스코드
jnb Sigma Plot 5, Workbook 파일
jpe JPEG 이미지
jpeg JPEG 비트맵 그래픽 파일
jpg JPEG 비트맵 그래픽 파일
js 자바스크립트 소스 파일
 
lan NetWare, Loadable module (LAN DLL)
lbm 비트맵 (DeluxePaint)
lbm Linear Bitmap graphics (XLib)
lcd CDSpace, CD 이미지 파일
ldif 주소록 교환 형식
lgc 윈도우 애플리케이션 로그 파일
lha LZH 파일의 또다른 확장자명
lib 라이브러리
lnk 윈도우 바로가기 파일
lod 로드 파일
log 로그 파일
lzh LH ARC 압축 파일
lwd LotusWorks, 텍스트 문서 파일
 
m3u MPEG URL (MIME 오디오 파일) (MP3 재생 목록)
mac 이미지 (MacPaint)
mak 비주얼 베이직 또는 비주얼 C++ 프로젝트 파일
max Kinetix 3D Studio Max, 3D 장면
max Paperport, 문서 파일
max OrCad, 레이아웃 파일
max MAX, 소스코드
mbx Outlook Express 4, 메일 저장 파일
mcc MathCad, 구성 파일
mcd MathCad, 문서 파일
mcf MathCad, 글꼴 파일
mcp Metrowerks CodeWarrior 프로젝트 파일
mcp Capsule 애플리케이션 스크립트
mcp Mathcad 프린터 드라이버
mcr DataCad, 키보드 매크로 파일
mdb 마이크로소프트 액세스 데이터베이스
mdf 마이크로소프트, MS-SQL Master 데이터베이스 파일
mdi 마이크로소프트, 오피스 문서 이미지 파일
mdl CA-Compete!, 스프레드시트
mdl Digital Trakker, 음악 모듈
mdl 3D Design Plus, 모델
mdl Quake, 모델 파일
mdl Rational Rose, 모델 파일 요소
mht 마이크로소프트, MHTML 문서
mhtm MHTML 문서 (MIME)
mhtml MHTML 문서 (MIME)
mi Cocreate ME10 데이터 파일
mi 잡다한(Miscellaneous) 파일들의 일반적인 총칭
mid 미디 음악 파일
mix Power C, 오브젝트 파일
mix 마이크로소프트 PhotoDraw 2000, 그림 파일
mix 마이크로소프트 Picture-It!, 그림 파일
mix Command & Conquer, 패키지 파일
mix Westwood Studios, 리소스 아카이브
mmp MindMapor, MindManager 파일
mmp Bravado, MMP 출력 비디오
model CATIA, 도면 파일
mov QuickTime for Windows 무비 파일
mp2 MPEG Audio Layer 2 파일 (MIME 비디오 파일)
mp3 MPEG Audio Layer 3 로 압축된 음악 파일
mp4 MPEG-4 비디오 파일
mpeg MPEG 동영상 파일
mpf MP3 Folders, 폴더 파일
mpg MPEG 동영상 파일
mpp 마이크로소프트 프로젝트, 프로젝트 파일
mpp CAD 도면 파일
mpt 마이크로소프트 프로젝트, 템플릿 파일
mrc 서지 데이터 (Machine-Readable Cataloging records)
mrk Informative Graphics, 마크업 파일
msc 마이크로소프트 윈도우 2000, Common Console Document
msg 마이크로소프트, 전자우편 메시지
msi 마이크로소프트 윈도우 인스톨러 패키지
mus Oak Road Systems, WHISTLE 데이터 파일
   
nas NASTRAN 파일
nfo Folio, Infobase 파일
nil Norton, 아이콘 라이브러리 파일
nls Uniscape, 현지화를 위해 사용된 국어 지원 파일
nod Netobject Fusion, 파일
nrg Nero, ISO 9660 이미지 (CD-ROM 데이터용 순수 ISO 9660 이미지와 동일)
nxl 한컴 넥셀 파일
   
obd 마이크로소프트 오피스, 바인더
obz 마이크로소프트 오피스, 바인더 마법사
ocx 마이크로소프트 OLE custom control
oft 마이크로소프트 아웃룩, 서식 파일
ogg Vorbis, Vorbis 오디오 파일
olb 마이크로소프트 OLE, 오브젝트 라이브러리
old 백업 파일 들의 일반적인 총칭
or3 로터스 오거나이저 97 파일
ost 마이크로소프트 아웃룩, 오프라인 파일
ovl 오버레이 파일
ovr 오버레이 파일
 
p7m S/MIME, 암호화와 서명, 불명료한 서명이나 일반적인 서명된 문서
pab 마이크로소프트, 개인 주소록
pam Tonline, Ob4hbci 스마트 업데이트 파일
pak PAK, 압축 아카이브 파일
pas 볼랜드 파스칼, 소스코드 파일
pbk 파일마이크로소프트 폰북
pbr 파워빌더 자원 파일
pcd 코닥 Photo-CD 이미지
pcl HP 프린터 제어 언어 파일
pco Pro*COBOL, 원시파일
pct 매킨토시 PICT drawing
pcx ZSoft PC 페인트브로쉬 비트맵 파일
pdf 어도비 애크로뱃 문서 형식 (Portable Document Format)
pdx ProCite, 데이터베이스 색인 파일
pg 2D Graphic
pgd PGPdisk, 볼륨 파일
pgp Pretty Good Privacy, 암호화된 파일
php PHP 스크립트가 들어있는 HTML 페이지
php3 PHP 스크립트가 들어있는 HTML 페이지
phtml PHP 스크립트가 들어있는 HTML 페이지
pic PC Paint 비트맵
pic Lotus picture
pic 매킨토시 PICT drawing
pict 매킨토시 PICT 이미지 파일
pif 프로그램 정보 파일(Program Information File)
pjt 마이크로소프트 비주얼 폭스프로(Visual FoxPro), 프로젝트 테이블 메모 파일
pkg P-CAD, 데이터베이스
pl Perl 프로그램
pls 윈앰프, MPEG 재생목록 파일
plt HPGL Plotter, 도면 파일
plt AutoCAD, 플롯 도면
plt (일반적으로) 팔레트 파일
pm4 페이지메이커 4.0 문서 파일
pmp Sony 디지털 카메라 파일
png Portable Network Graphics 비트맵 그래픽 파일
pot 마이크로소프트 파워포인트 서식 파일
ppd Adobe Acrobat v.4.0, 포스트스크립트 프린터 정의 파일 규격
pps 마이크로소프트 파워포인트 슬라이드 쇼
pps Personal Producer 스토리 보드
ppt 마이크로소프트 파워포인트 파일
ppv Windows CE, 포켓 파워포인트 파일
prf 마이크로소프트 윈도우, 시스템 파일
prf 매크로미디어 디렉터, 설정 파일
prf Improces-Fastgraph, Pixel Run 형식 그래픽
prf dBase IV, 프린터 드라이버
prf Profiler, 출력 파일
prl Perl 스크립트
prn 프린트 테이블 (빈칸으로 구분된 텍스트)
prn 데이터 캐드, 윈도우 프린터 파일
prn 시그너처, 프린터 드라이버
prn 로터스123 심포니, 텍스트 파일
prt CADKEY, 부품 파일
prz 로터스 프리랜스97, 그래픽 파일
ps 포스트스크립트 형식의 출력용 파일
psd 어도비 포토샵 비트맵 파일
psp 페인트샵 프로 이미지 파일
pst 마이크로소프트 아웃룩, 개인 폴더 파일
pub Ventura Publisher, Publication 파일
pub Microsoft Publisher, 문서 파일
pub PGP, 공개키 링 파일
pwi Windows CE, 포켓 워드 파일
pwl 윈도우95/98 패스워드 목록 파일
pxl Windows CE, 포켓 엑셀 파일
pxr Pixar, Pixar 이미지 형식
pxt 마이크로소프트, 포켓 엑셀 템플릿
 
qic 마이크로소프트, 백업 파일 (Quarter Inch Cassette)
qrp Centura, 보고서 작성자 파일
qtx QuickTime, 이미지 파일
 
ra 리얼오디오 소리 파일
ram 리얼오디오 메타 파일
rar RAR 압축 파일
raw Raw File Format (비트맵)
rbf Rbase, 데이터 파일
rbk 한컴 슬라이드 서식
rc 마이크로소프트 C/C++, 리소스 스크립트
rc Borland C++, 리소스 스크립트
rc emacs, 구성 파일
rcp Recomposer's MIDI 시퀀서 음악 파일
rdo Xerox, Document Assembler Metafile
reg 윈도우 레지스트리 파일
res 마이크로소프트 Visual C++, 리소스 파일
rle Run-Length Encoded bitmap
rm 리얼오디오 비디오 파일
rmi MIDI 음악 파일
rol FM 음악 Adlib 음악파일 (Roland)
rom 카트리지 기반의 홈 비디오 게임 에뮬레이터 파일
rpm 레드햇 리눅스의 패키지 매니저 파일
rpt 크리스탈 리포트 파일 (및 마이크로소프트 비주얼베이직의 서브셋)
rtf Rich Text Format 문서
 
s 유닉스, 어셈블러 원시 코드 파일
s3m Scream Tracker v 3.0, 16 채널 음악 파일
sat ACIS, Solid 모델
sav 저장된 게임 파일 (일반 명칭)
sbd Storyboard Editor, 스토리보드 데이터 파일
sbd Superbase, 데이터 정의 파일
sbl Shockwave 플래시 오브젝트
scc 마이크로소프트, 소스 세이프 파일
scr 화면보호기 파일
sd2 SAS 데이터베이스 (윈도우95/NT OS/2, 매킨토시)
sea 자체적으로 압축이 풀리는 아카이브 파일 (매킨토시 파일들을 위해 Stuffit에서 사용됨)
sfx RAR 자체-풀림 아카이브
sgml Standard Generalized Markup Language 파일
shtml Server Side Includes (SSI)가 포함되어 있는 HTML 파일
sh3 하바드 그래픽스 프레젠테이션 파일
sib Sibelius, 음악 파일
sit Stuffit, 압축된 매킨토시 아카이브 파일
smi 로터스 CC:Mail, 스마트 아이콘
snd NeXT, 사운드 파일
snd 매킨토시, 사운드 리소스 파일
sng 롤랜드, 음악 데이터 파일
snm 넷스케이프, 메일 폴더 인덱스
snp Computer Eyes, 출력 비디오 파일
spi Siemens Scanner, 그래픽 파일
spi Phillips Scanner, 그래픽 파일
spl Macromedia, 플래쉬용 무비 파일
step ISO-10303 STEP 제품 데이터
stp 어도비, Acrobat Exchange 플러그인
stp ISO-10303 STEP 제품 데이터
stp DART Pro, DART Pro 98 시스템 설정치
sty 아래아한글 스타일 파일
sub Divx 서브타이틀
sur AutoData Systems, Survey Plus 2000 Survey File
svg W3C, 스케일러블 벡터 그래픽스 파일 (인터넷 멀티미디어 파일 교환용)
swa Macromedia Director, 쇽웨이브 오디오 파일
swf 쇽웨이브 플래시 객체
swp DOS, 스왑파일
syd QEMM, 기동 파일 백업
sys 시스템 파일
 
tar 테이프 아카이브
tbl Pagemaker TableEditor, 그래픽 형식
tbl OS/2, 표 형식의 값들
tel 이야기97용 전화걸기 정보 파일
tga Targa 비트맵
tgz 유닉스 Gzip/테이프 아카이브
thm 비디오 썸네일 파일
tif Tag Image File Format 비트맵 파일
tiff Tag Image File Format 비트맵 파일
tlb 마이크로소프트 OLE type 라이브러리 파일
tlb 버블 에디터 참고 테이블
tlb VAX 텍스트 라이브러리
tlb 비주얼 C++ Type 라이브러리
tmp 윈도우 임시 파일
trm 윈도우 터미널 파일
trx I-Cite, 익스포트 파일
tsd trueSpace 4, 데모 파일
tsk Pocket PC, 스킨 파일 (테마)
tsm OS/2용 Turbo Assembler, 설명서 파일
ttc 트루타입 컬렉션 파일
ttf 트루타입 글꼴
txt 아스키 텍스트
tzz 탑정보통신 밤톨이 압축파일 (분할 압축시 두번째 파일부터는 002, 003 ... 등 숫자가 사용됨)
 
ukx Epic Games, Inc., Unreal Tournament 2003 Animation
urh 훈넷 슬라이더, 이미지 주소 파일
url 인터넷 바로가기 파일
uu UU-encode된 파일
uue UU-encode된 파일
 
vbg 비주얼베이직, 그룹 프로젝트
vbp 비주얼베이직, 프로젝트
vbr 비주얼베이직, Remote automated registration 파일
vbs 비주얼베이직, 스크립트 파일
vbw 비주얼베이직, Workspace 파일
vbx 비주얼베이직, custom control 파일
vcd Virtual CD-ROM
vcf 넷스케이프, 가상 카드 파일
vct 마이크로소프트 폭스프로(FoxPro) 클래스 라이브러리
vcx 마이크로소프트 폭스프로(FoxPro) 클래스 라이브러리
vob Digital Video Disk, 현재 DVD에서 사용되는 암호화된 비디오 및 오디오 파일들
voc 크리에이티브 랩스 사운드 블라스터 오디오 파일
voc Quartet 오디오 파일
vqe 야마하 사운드 VQ Locator 파일
vqf 야마하 사운드 VQ 파일 (새로운 표준이 될 가능성이 있는 후보)
vql 야마하 사운드 VQ Locator 파일
vrml VRML 파일
vsd 비지오 드로잉 파일
vss 비지오 스텐실 파일
vue dBase IV 뷰 파일
vue 마이크로소프트 폭스프로 뷰 파일
vxd 마이크로소프트 가상 장치 드라이버
 
w44 dBase 임시 파일
wab Outlook 주소록
wav 윈도우 웨이브 파일
wcm WordPerfect 매크로
wej 나모 웹에디터, 프로젝트 파일
wfx 윈도우 팩스 파일
wi 코렐, Wavelet 압축 비트맵 파일
wks Microsoft Works, 문서
wma 마이크로소프트 Windows Media 오디오 파일 (ASF 형식으로 변경 가능)
wmf 윈도우 메타 파일
wmv 마이크로소프트, 윈도우 미디어 파일
wp4 WordPerfect 4 문서
wp5 WordPerfect 5 문서
wp6 WordPerfect 6 문서
wpd WordPerfect 문서
wpg WordPerfect 그래픽
wps Microsoft Works, 텍스트 문서
wpt WordPerfect 템플릿
wrl 가상현실 모델
wq1 쿼트로프로/DOS용 스프레드시트
wq2 쿼트로프로/버전5 스프레드시트
wsd WordStar, 문서파일
wsf Windows 스크립트 파일
wsp Fortran PowerStation, WorkSpace file
wsz WinAmp, 스킨파일
 
xcf GIMP, 이미지 파일
xdw 제록스 DocuWorks 문서
xlc 마이크로소프트 엑셀 차트
xlm 마이크로소프트 매크로 파일
xls 마이크로소프트 엑셀 파일
xlt 마이크로소프트 엑셀 서식 파일
xml eXtensible Markup Language 파일
xy XYWrite, 텍스트 파일
 
y Amiga, Yabba 압축 아카이브
yal Arts & Letters 클립아트 라이브러리
 
zip Zip 압축 파일
zoo Zoo, 초창기의 압축 파일 형식
 
123 로터스 1-2-3 파일
2bp Pocket PC 비트맵

'old > 용어정리' 카테고리의 다른 글

FLOPS (floating-point operations per second) ; 플롭스  (0) 2010.11.11
flip-flop ; 플립플롭  (0) 2010.11.10
field ; 필드  (0) 2010.11.10
fault-tolerant ; 무정지형  (0) 2010.11.10
relational database ; 관계형 데이터베이스  (0) 2010.11.10
Posted by jazzlife
,

field ; 필드

old/용어정리 2010. 11. 10. 10:13

field ; 필드

필드는 어떤 목적을 가진 레코드나 메시지 헤더 또는 컴퓨터 명령어와 같은 데이터 단위 내의 고정된 장소를 말하는데, 그 길이는 미리 정해지는 것이 보통이다. 한 필드는 더 작은 필드들로 나뉠 수 있는데, 다음에 몇 가지 예가 있다.

  1. 웹사이트 상의 입력 폼을 채울 때, 정보를 요구하는 각 박스가 바로 텍스트 입력 필드이다.

  2. 가변길이 전송 단위의 헤더에서, 헤더 내의 2 바이트 짜리 서브필드가 메시지의 길이를 식별하는데 사용될 수 있다.

'old > 용어정리' 카테고리의 다른 글

flip-flop ; 플립플롭  (0) 2010.11.10
file formats  (0) 2010.11.10
fault-tolerant ; 무정지형  (0) 2010.11.10
relational database ; 관계형 데이터베이스  (0) 2010.11.10
SGML (Standard Generalized Markup Language)  (0) 2010.11.10
Posted by jazzlife
,

fault-tolerant ; 무정지형

무정지형이라는 말은 컴퓨터 시스템이나 그 구성요소들을 설계할 때 주로 사용되는 말로서, 어떤 한 부품에 장애가 생겼을 때 예비 부품이나 절차가 즉시 그 역할을 대체 수행함으로써 서비스의 중단이 없도록 하는 것을 말한다. 무정지 서비스는 소프트웨어 만에 의해 제공되는 경우도 있지만, 하드웨어에 내장된 형태 또는 몇 가지가 조합된 형태로 제공될 수 있다. 소프트웨어에서의 구현을 살펴보면, 운영체계는 프로그래머가 하나의 트랜잭션 내에서 미리 정해진 시점에 매우 중요한 데이터를 검사할 수 있도록 인터페이스를 제공한다. 하드웨어에서의 구현에서는, 프로그래머 입장에서 컴퓨터 하드웨어가 무정지형 기능을 갖추었다는 사실조차 알 필요가 없다.

하드웨어 차원에서, 무정지형은 각 하드웨어 부품들을 이중화함으로써 달성된다. 디스크들은 당연히 미러링되며, 다중 프로세서들이 서로 계단 모양으로 묶여 있어 각자가 내놓은 결과의 정확도를 비교하게 된다. 이상이 발생되면 장애가 생긴 부품이 운영 라인에서 즉시 배제 되지만, 컴퓨터 시스템은 평상시처럼 기능을 계속하게 된다.

'old > 용어정리' 카테고리의 다른 글

file formats  (0) 2010.11.10
field ; 필드  (0) 2010.11.10
relational database ; 관계형 데이터베이스  (0) 2010.11.10
SGML (Standard Generalized Markup Language)  (0) 2010.11.10
entity ; 실체  (0) 2010.11.10
Posted by jazzlife
,

relational database ; 관계형 데이터베이스

관계형 데이터베이스는 1970년에 IBM의 E. F. Codd에 의해 개발되었다. 관계형 데이터베이스는 일련의 정형화된 테이블로 구성된 데이터 항목들의 집합체로서, 그 데이터들은 데이터베이스 테이블을 재구성하지 않더라도 다양한 방법으로 접근하거나 조합될 수 있다.

사용자와 관계형 데이터베이스를 연결시켜주는 표준 검색언어를 SQL 이라고 하는데, SQL 문장은 관계형 데이터베이스에 있는 데이터를 직접 조회하거나 또는 보고서를 추출하는데 사용된다.

관계형 데이터베이스는 만들거나 이용하기가 비교적 쉽지만, 무엇보다도 확장이 용이하다는 장점을 가지고 있다. 처음 데이터베이스를 만든 후 관련되는 응용프로그램들을 변경하지 않고도, 새로운 데이터 항목을 데이터베이스에 추가할 수 있다 (파일이나 네트웍 데이터베이스 등, 그 이전의 데이터베이스들은 항목이 수정되면, 그 데이터베이스를 사용하는 모든 응용 프로그램도 함께 수정해야하는 어려움이 있었다).

관계형 데이터베이스는 미리 정의된 내용에 따라 테이블들이 구성되는데, 각 테이블은 데이터 종류나 성격에 따라 여러 개의 컬럼이 포함될 수 있다. 예를 들어, 주문거래 데이터베이스에는 성명, 주소, 전화번호 등의 컬럼 항목으로 구성된 테이블과 또한 주문내용(제품, 고객, 일자, 판매가격 등)을 나타내는 테이블이 포함될 것이며, 데이터베이스 사용자는 사용자의 필요에 맞는 형태로 데이터베이스의 내용을 볼 수 있다.

또한, 관계형 데이터베이스를 구축할 때 데이터 컬럼이 가질 수 있는 값의 범위나, 그 값에 적용될 수 있는 제한사항을 정의할 수 있다. 예를 들어, 고객의 성명을 빈 칸으로 남겨 놓지 못하게 한다거나, 판매가격에는 마이너스(-) 값이 올 수 없도록 제한할 수 있다.

관계형 데이터베이스를 정의하게 되면 그 테이블이나 컬럼, 도메인 및 제한사항에 대한 내용을 가진 메타 데이터 테이블이 함께 만들어진다.

'old > 용어정리' 카테고리의 다른 글

field ; 필드  (0) 2010.11.10
fault-tolerant ; 무정지형  (0) 2010.11.10
SGML (Standard Generalized Markup Language)  (0) 2010.11.10
entity ; 실체  (0) 2010.11.10
enterprise ; 엔터프라이즈  (0) 2010.11.10
Posted by jazzlife
,

SGML (Standard Generalized Markup Language)

SGML[에스지에멜]문서의 마크업 언어나 태그 셋을 어떻게 정의할 것인가에 대한 표준이다. 이러한 규격 그 자체는 DTD 이다. SGML은 문서 언어 그 자체에 들어있는 것은 아니며, 다만 어떻게 지정할 것인지에 대한 설명이다. 이것은 메타 언어이다.

SGML은 문서들은 그 요소들이 어떻게 표현될 것인가에 관한 언급 없이 묘사될 수 있는 구조적이고 의미론적인 요소들을 가지고 있다는 사고에 기반을 두고 있다. 이러한 문서의 실제적인 표현은 출력 매체나 스타일의 선호도에 따라 달라질 수 있다. SGML에 기반을 두고 있는 문서들의 장점은 다음과 같다.

  • 문서의 표현특성보다는 구조에 중점을 두고 만들어질 수 있다.
  • SGML 컴파일러가 그 문서의 DTD 참조를 통해 어떠한 문서라도 해석할 수 있으므로, 이식성이 좋아진다.
  • 인쇄 매체를 위해 만들어진 문서가 컴퓨터 화면 등의 같은 다른 매체에 쉽게 다시 제작될 수 있다.

브라우저에서 사용하는 언어인 HTML도 실은 SGML에 기반을 두고 있는 언어이며, HTML을 위한 DTD가 따로 있다 (그리고 HTML 규격을 읽는 것은 실제로는 DTD의 확장판을 읽는 것이다). SGML은 어느 정도는 일찍이 IBM에서 개발된 일반화된 마크업 언어인 GML과 ISIL 등에 기반을 두고 있다.

'old > 용어정리' 카테고리의 다른 글

fault-tolerant ; 무정지형  (0) 2010.11.10
relational database ; 관계형 데이터베이스  (0) 2010.11.10
entity ; 실체  (0) 2010.11.10
enterprise ; 엔터프라이즈  (0) 2010.11.10
end user ; 최종사용자  (0) 2010.11.10
Posted by jazzlife
,

entity ; 실체

old/용어정리 2010. 11. 10. 10:04

entity ; 실체

일반적으로, entity란 존재하는 것, 즉 실체를 의미한다. 이 용어의 어원은 라틴어의 ens에서 나왔으며, 사물의 존재와 그것의 품질 사이에 구별을 짓는다. entity가 되기 위해 필요한 일은, 그저 존재하는 것이 전부이다. 어떤 것이 존재한다는 사실은, 그것이 다른 존재나 entity로부터 분리되어있음을 암시하는 듯하다. 프로그래밍이나 공학에서, 그리고 아마도 많은 다른 상황들에서, 이 용어는 명확한 사물이든, 이름이 붙여져 있지 않은 추상화된 아이디어든 관계없이 단일체를 인식하는데 사용된다. 칠판에 글씨나 그림을 쓰며 토의를 할 때, 흔히 아직 이름이 붙어있지 않고 단지 "entity"라고만 표현되어 있는 무엇인가를 그릴 수 있다 (만약, 그 entity가 토의가 진행되어 나중에 귀속 품질과 이름을 갖게 되었다면, 더 이상 그것을 "entity"라고 부를 필요는 없을 것이다). 일부 용법에서, entity는 객체지향 프로그래밍에서 사용되는 객체와 비슷한 의미를 갖는다. 아래에 일부 용례를 나열하였다.

  1. SGML에서, entity는 특정 문자나 표시법을 선택하거나 표현하기 위해 형식 지정 프로그램에 의한 효과를 가지고 있는 특정 문자열을 가리킨다. 예를 들어 아래의 특정한 entity는

    &quot;

    다음과 같은 표현을 만들어 낸다.

    "


    이 용법에서, entity는 선택되거나, 표시되거나, 인쇄되어야할 고유한 글꼴을 지정하는 어떤 문자열이다. 이러한 문자열을 위해 하나의 낱말이 필요했으며, entity는 여러모로 편리하다. HTML에서, 어떤 특별한 entity나 문자열들에는 이름이 주어질 수 있는데, 이 경우 각 entity들은 "명명된 entity"라고 불린다.
  2. 관계형 데이터베이스에서, entity는 저장될 수 있는 어떤 데이터에 관한 사람, 장소, 또는 사물이다.
  3. 데이터 모델링에서, entity는 분류될 수 있고, 다른 entity들에 대해 정해진 관계를 가지는 데이터 단위이다.
  4. OSI 네트웍 통신 모델에서, entity는 정의된 프로토콜을 사용하여 다른 entity들과 교신하는 활성화된 구성요소이다.
  5. IBM의 RACF 보안 제품에서, entity는 RACF에게 한정지어지는 사용자, 그룹, 또는 자원을 말한다.
  6. FORTRAN에서는, 프로시저, 연산자, 인터페이스 블록, 입출력 단위, 부호화 상수, 문장 번호 등과 같은 거의 모든 프로그램 구성요소를 entity라고 지칭한다.
Posted by jazzlife
,

enterprise ; 엔터프라이즈

컴퓨터 산업계에서, 엔터프라이즈라는 용어는 컴퓨터를 사용하는 조직 전체를 가리키는 말이다. 이 용어는 법인, 소규모 사업체, 비영리 단체, 정부기관, 그리고 가능한 모든 종류의 조직들을 두루 포함하기 위해 필요했었다. 그러나 실제로, 이 용어는 소규모보다는 대규모 조직을 가리키는데 좀더 흔히 사용된다.

'old > 용어정리' 카테고리의 다른 글

SGML (Standard Generalized Markup Language)  (0) 2010.11.10
entity ; 실체  (0) 2010.11.10
end user ; 최종사용자  (0) 2010.11.10
IMAP (Internet Message Access Protocol)  (0) 2010.11.09
POP3 (Post Office Protocol 3)  (0) 2010.11.09
Posted by jazzlife
,