김솔빛나라

2010년 10월 11일 월요일

3.Data Representation

이번 단원에서 Huffman Encoding 에 관해 자세히 알아 보도록 하겠습니다.
오늘 DS시간에 수업을 듣는데 허프만 코드에 대해서 나왔는데, 정말 이해가 안되서 DS공부도 할 겸 허프만 코드에 대해 공부해 보도록 하겠습니다.

허프만 코드란 Keyword encoding, Run-Length encoding 과 함께 Text Compression 의 한 종류입니다.
호프만 부호화의 기본 개념은 각 단위 정보를 표현하는 비트 수를 단위 정보들의 출현 빈도를 기본으로 할당한 것인데요.
빈도가 높은 정보는 적은 비트 수를 사용하여 표현하고, 빈도가 낮은 정보는 비트 수를 많이 사용하여 표현해서 전체 데이터의 표현에 필요한 비트의 양을 줄이는 것입니다.
 허프만 부호는 팩스전송이나 JPEG, MPEG 등 화상 정보의 압축 부호화 표준 규격에도 널리 사용됩니다.


허프만 부호화의 동작원리를 알아 봅시다.
① 발생확률이 높은 순서대로 부호를 정렬한후, 최소 발생확률 2개 부호를 선정함
② 최소 발생확률 2개 부호를 합한 값을 구한후, 발생확률이 높은 순서대로 부호 정렬
③ ①과 ②의 과정을 부호 값이 1이 될때 까지 반복함
④ 원래 확률값과 각각의 확률값을 합산하여 나온 결과값에 각각 0과1을 순차적으로 부여함

이 원리에 따라 허프만 트리를 만들어 보면 다음과 같다.


AAAAABBCDDEEEEEF 라는 문자가 있습니다.
이것을 압축하지 않으면 8bit * 17 개 = 136 bit 가 됩니다.
따라서 허프만 부호화 방법으로 압축해 보겠습니다.



첫번째




빈도순으로 정렬을 하고 가장 빈도가 낮은 둘을 더합니다.
그리고 다시 정렬을 하는데 여기서는 2로 나왔기 때문에 제자리에 두고 다시 옆수와 더합니다.



계속해서 정렬과 더하기를 반복합니다.




그럼 마지막으로 다음과 같은 트리가 완성되게 됩니다.



이렇게 해서

A   0
B   110
C   11010
D   1110
E    10
F    11111

으로 허프만 테이블을 만들 수 있습니다.

이것으로 위의 문자를 압축하여
0000001101101101011101110101010101011111 과 같이 나타낼 수 있습니다.
136bit 보다 훨씬 압축된게 보이시죠!?



이렇게 해서 허프만 부호화에 대해 알아보았습니다.

2010년 10월 10일 일요일

4.Gates and Circuits

오늘은 정말 제 때에 과제를 내네요..ㅠㅠ
죄송해요 힝

오늘은 시험이 얼마 남지 않아 시험 공부도 할 겸 4단원에 adders 를 자세히 공부해 보도록 하겠습니다.


4단원은 Gate 와 Circuits 에 관해서 배우는데 전 컴맹인 관계로 Gate 와 Circuits 의 뜻부터 확실히 알아봅시다

Circuit 은  회로로 Gate로 구성되어 있습니다.
Gate는 논리 게이트라 하여 기본이 되는 논리 기능을 실현하는 전자 회로 입니다.
Gate의 종류로는 NOT, AND,OR,XOR,NAND 등이 있습니다.

이번 단원은 전자회로와 컴퓨터에 관해 배웠던 시간이었습니다.


그럼 이제부터 제가 자세히 공부하기로 한 Adder 에 대해 공부해 봅시다.

Adder 란 우리말로 가산기라는 것인데 두개 이상의 수를 입력하여 이들의 합을 출력하는 논리 회로 또는 장치 입니다.
종류로는 Full Adder 와 Half Adder 가 있습니다.

그럼 우선 Half Adder 란 무엇일까요?

반가산기란 컴퓨터 내에서 2진 숫자(비트)를 덧셈하기 위해 사용되는 논리 회로의 하나입니다. 덧셈해야 할 2개의 비트를 받아서 2개의 출력, 즉 합 (Sum) 과 자리 올림비트 (Carry) 를 생성합니다. 반가산기는 자리 올림 비트를 출력할 수는 있지만 앞의 덧셈으로부터 자리 올림 비트를 받을 수는 없습니다. 



이 회로는 반가산기 회로입니다.
A와 B 를 입력하여 S(sum)과 C(carry)를 출력해 냅니다.
그럼 반가산기의 진리표를 봅시다.

그럼 전가산기에 대해 알아봅시다.
반가산기는 2개의 값을 더하는 것이었는데 3개 이상의 값을 더야해 할 때 어떻게 해야할까요. 그 때 쓰는 것이 전가산기입니다.
전가산기는 3개의 입력, 즉 덧셈해야 할 2개의 비트와 앞의 덧셈으로부터 자리 올림 비트를 덧셈하는 것이다. 컴퓨터는 전가산기를 반가산기라고 하는 2개의 입력 회로와 조합시켜, 동시에 4개 비트 또는 그 이상의 덧셈을 할 수 있습니다.


위의 그림은 전가산기의 회로인데 두개의 반가산기와 OR 게이트로 이루어져 있습니다.
A와 B 는 입력값이고 Cin 은 입력되는 자리 올림수 이고 Cout 은 출력되는 자리올림수 입니다.

위와 같은 회로를 여러 개 붙이면 3개 이상의 수를 더할 수 있는 회로가 만들어 질 수 있겠죠



그럼 전가산기의 진리표를 보도록 합시다.

      A   B   C-in   Sum   C-out
      0    0     0       0         0
      0    0     1       1         0
      0    1     0       1         0
      0    1     1       0         1
      1    0     0       1         0
      1    0     1       0         1
      1    1     0       0         1
      1    1     1       1         1




이와 같이 가산기에 대해 알아 보았습니다.
뿌듯한 이 맘 !! 히힛
오늘은 과제를 제 때 내어서 기분이 좋습니다.

지난 과제들을 조금 늦게 올립니다. 그래도 과제한거 꼭 봐주세요 선생님 ㅜㅜ

2010년 10월 5일 화요일

2.Binary Values and Number Systems

이번 단원은 수요일에 공강 시간이 너무 긴 바람에 선아와 민주의 수업이 끝나기를 기다리며
국제관 2층에 앉아서 공부를 했다!!
그래서 과제를 조금은 쉽게 할 수 있을 듯 해요. 히힛
뿌듯하네요 헤헤

이번 단원에서는 2진수, 8진수, 16진수 같은 여러 진수에 관해서 배우고 각 진수들을 다른 진수들로 변환시키는 방법들에 대해 배웠습니다.

그래서 이번 단원에서는 수요일 공강 시간에 열심히 공부한 컴퓨터 수의 체계에 대해 더 자세히 공부해 보도록 하겠습니다!


컴퓨터에서는 실제로 2진수가 사용됩니다. 그러나 이번 단원에서는 2진수 뿐만 아니라 8진수, 16진수를 배우는데요.  그 이유는 8과 16이 2의 제곱수 중 하나이기 때문에 2, 8, 16 진수 끼리 서로 변환되기 편하기 때문입니다.

2진법은 컴퓨터의 ON OFF 를 사람이 인식하기 쉽게 0과 1의 형태로 표시한 방법입니다.
ON과 OFF 신호의 다양한 조합으로 각 H/W장치는 통신을 하는데 각 신호의 조합에 각 명령을 대입하여 CPU내에 약속을 저장한 것을 내부명령어라고 합니다.
이 각 신호를 BIT(데디터 표현의 최소 단위) 라고 합니다.
다양한 신호를 만들기 위해 최초로 7개의 신호를 묶어서 약속을 만들게 된 것이 ASCII코드(7bit)입니다. (ASCII코드는 3단원에서 자세히 배우네요~)
8bit 체계로 발전이 되고 언어 상징 등을 8bit 조합으로 표현이 됩니다.
8bit = 1Byte

[컴퓨터에서 사용하는 저장단위]
bit : 최소
byte : 정보 기본 단위 (8 bit = 2의 3승)
1KB = 1 kilo byte = 1024 = 2의 10승
1MB = 1024 KB = 1024 * 1024 Byte
1GB = 1024 MB
1TB = 1024 GB

출처 :  http://blog.naver.com/bluesyj00?Redirect=Log&logNo=100087591633

2진수는 0, 1 의 두 개의 수를 사용하여 나타낸 수이고
8진수는 0~7 의 8 개의 수를 사용한 수이고
16진수는 0~9 의 10개의 수와 A~F까지의 알파벳을 사용하여 나타낸 수입니다.


그럼 보수를 이용하여 2진수의 뺄셈을 하는 법을 알아보도록 합시다.

컴퓨터에는 마이너스라는 개념이 없습니다.
그래서 보수를 사용하여 뺄셈을 하게 되는데요.

그럼 예를 들어보아요

10진수 1은 2진수로 00000001 입니다.
그럼 10진수 -1은 이진수로 어떻게 표현할까요??
음수일때 사인비트는 1이고 양수일 때 사인비트 0이므로  쉽게 생각하면 10000001 이라고 생각하기 쉽습니다.
그러나 1+(-1) = 0 이므로 두이진수를 더해도 0이 나와야 하지만 계산해 보면 그렇지 않습니다.
실제로 10진수 -1의 2진수 값은 1111111 입니다.

    00000001
  +11111111
                         
  100000000

이고 맨 앞의 1은 8비트이므로 잘라버려 두 이진수의 값이 0임을 알 수 있습니다.


실제로 컴퓨터는 뺄셈을 할 수 없습니다.
위의 1 + (-1) 과 같은 방법으로 뺄셈을 하는 것 입니다.

보수는 이 때문에 만들어진 개념인데요
1을 -1로 바꾼 것처럼 수를 음수로 바꾸는 것이 보수입니다.

보수로 바꾸는 방법은 간단합니다.

첫째,  수를 2진법으로 고칩니다.
둘째,  2진법으로 표현된 수가 1010 이라면 0101로 바꾸는 것처럼 0은 1로, 1은 0으로 바꿉니다.
셋째,  바꾸어진 수에 1을 더합니다.

예를 들어 10진수 1의 보수를 알아봅시다.

첫번째! 10진수 1을 2진수로 바꾸면 00000001 입니다.
두번째! 0과 1을 변환시키면 11111110 이 됩니다.
세번째! 11111110 에 1을 더하면 111111111 이 됩니다.

참 쉽네요!! 히힛

두 수 더하니 00000001 + 11111111 = 100000000  이네요 제일 앞자리의 1은 자리수가 초과되었으므로 없어지니 00000000 이 됬네요!!

2010년 9월 22일 수요일

C언어와 JAVA

나는 1장에 나오는 여러 주제들 중 프로그램 언어에 대해 글을 써보려 한다.
특히 2학기에 배우는 과목들을 좀 더 깊고 효과적으로 배우고 공부하기 위해서 이번 과제를 기회 삼아 1학기 때 처음 배운 C 언어와 현재 배우고 있는 JAVA 언어를 조사해 알아볼 생각이다.

<C언어>

C 프로그래밍 언어1970년대켄 톰슨데니스 리치가 당시 새로 개발된 유닉스 운영체제에서 사용하기 위해 만든 프로그래밍 언어이다. 켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 이 B언어에서 C언어가 탄생했다. 유닉스 시스템의 바탕 프로그램은 모두 C로 씌여졌고, 많은 운영체제의 커널도 또한 C로 만들어졌다. 오늘날 많이 쓰이는 C++는 C에서 객체 지향형 언어로 발전된 것이다. 또 다른 다양한 최신 언어들도 그 뿌리를 C에 두고 있다.

소개 [편집]
C는 실질적으로 모든 컴퓨터 시스템에서 사용할 수 있는 프로그래밍 언어이다. 예를 들어 BASIC등과는 달리 다양한 플랫폼에서 ANSI C의 정의에 따르는 비교적 동일한 구현이 가능하다. 모든 C 시스템에는 정규화된 표준 C 라이브러리가 존재한다. 이런 이유와 생성된 프로그램의 높은 성능이 아직까지도 C언어가 사랑받는 이유중 하나이다.
그러나 C언어가 기술적으로 보아 현재 기술 수준에 부합하지 않는다는 의견이 있으며, C를 "이식가능한 고급 어셈블러"정도로 낮추어 부르기도 한다. 이는 반면 오늘날의 거의 모든 널리 쓰이는 운영체제 커널이 C를 이용해 구현된 이유이기도 하다. C는 시스템 프로그램 개발에 매우 적합하나, 응용 프로그램 개발에도 많이 쓰인다.

역사 [편집]


<JAVA 언어>

자바(Java, 문화어: 쟈바)는 썬 마이크로시스템즈의 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이며, 썬 마이크로시스템즈에서 무료로 제공하고 있다. 1991년 그린 프로젝트(Green Project)라는 이름으로 시작해 1995년에 발표했다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발했지만 현재 웹 어플리케이션 개발에 가장 많이 사용하는 언어 가운데 하나이고, 모바일 기기용 소프트웨어 개발에도 널리 사용하고 있다. 현재 버전 6까지 출시했다.
자바의 개발자들은 UNIX 기반의 배경을 가지고 있었기 때문에 문법적인 특성은 파스칼이 아닌 C++의 조상인 C 언어와 비슷하다.[1] 자바를 다른 컴파일언어와 구분짓는 가장 큰 특징은 컴파일된 코드가 플랫폼 독립적이라는 점이다. 자바 컴파일러는 자바 언어로 작성된 프로그램을 바이트코드라는 특수한 바이너리 형태로 변환한다. 바이트코드를 실행하기 위해서는 JVM(자바 가상 머신, Java Virtual Machine)이라는 특수한 가상 머신이 필요한데, 이 가상 머신은 자바 바이트코드를 어느 플랫폼에서나 동일한 형태로 실행시킨다. 때문에 자바로 개발된 프로그램은 CPU운영체제의 종류에 관계없이 JVM을 설치할 수 있는 시스템에서는 어디서나 실행할 수 있으며, 이 점이 웹 애플리케이션의 특성과 맞아떨어져 폭발적인 인기를 끌게 되었다.

역사 [편집]
자바 언어는 1991년 6월 셋톱 프로젝트를 위해 제임스 고슬링(James Gosling)이 만들었다. 이 언어는 원래 제임스 고슬링의 오피스 밖에 있던 오크 나무를 따라 오크(Oak), 혹은 그린(Green) 이라고도 불렀으나 단어 리스트 중 무작위로 뽑은 자바(Java)를 선택했다. 고슬링의 목표는 C/C++ 스타일의 언어와 가상 머신을 구현하는 것이었다. 첫 공개 자바 버전은 1995년의 자바 1.0 이었다. 한번 쓰고 어느 곳에도 실행 "Write Once, Run Anywhere" 하는 것을 약속하였고 인기 플렛폼에 무료 런타임을 제공하였다. 이 플랫폼은 꽤 안정성을 지녔고 보안 시스템은 여러 설정을 통해 네트워크 및 파일 접근을 통제할 수 있었다. 대부분의 브라우져들은 곧 자바 애플릿(Java Applet) 을 웹 페이지 안에서 실행 할 수 있었고 자바의 인기는 급상승했다. 자바 2 (JDK 1.2 ~ 1.4) 의 출현으로 여러 다양한 플렛폼에서 사용 할 수 있는 설정(Configuration) 들을 만들었다. 예를 들어 J2EE 는 엔터프라이즈 애플리케이션을 실행할 수 있고 J2ME 는 모바일 애플리케이션을 실행할 수 있다. J2SE는 스탠다드 에디션 으로 지정되었다. 2006년에 마케팅 용으로 Java EE, Java ME, Java SE 순서대로 명칭을 바꾸었다.
썬사 (Sun Microsystems) 는 1997년 ISO/IEC JTC1 표준화 그룹, 그리고 나중에는 ECMA International 그룹과 접촉하여 정식 승인 받으려 했으나 곧 이 프로세스에서 철수 했다. 자바는 사실상 (de facto) 의 표준이며 자바 커뮤니티 프로세스(Java Community Process) 를 통해 관리가 된다. 썬사는 자바의 대부분을 무료로 배포하였으나 오픈이 아닌 Proprietary 소프트웨어였다. 썬사는 자바 엔터프라이즈 시스템같은 특정 라이선스를 팔아서 수입을 올렸다. 썬사는 자사의 개발용(Software Development Kit (SDK))과 개발용의 일부인 실행용 (Runtime Environment (JRE)) 을 구분한다. 실행용에는 컴파일러, 유틸리티 및 여러 개발용 헤더 파일이 포함되어 있지 않다.
2006년 11월 13일 썬사는 대부분은 자바를 GPL 라이선스로 소스를 오픈하였으며 2007년 5월 8일 이 과정을 마쳤다. 썬사가 권한을 가지고 있지 않은 대부분의 코어 부분을 오픈하였다.

핵심 목표 [편집]

자바 언어는 다음 5가지의 핵심 목표를 지니고 있다.
  1. 객체 지향 방법론을 사용해야 한다
  2. 같은 프로그램이 여러 운영 체제에서 실행될 수 있어야 한다
  3. 컴퓨터 네트워크 접근 기능이 기본으로 탑재 되어 있어야 한다
  4. 원격 코드를 안전하게 실행할 수 있어야 한다
  5. 다른 객체 지향 언어들의 좋은 부분만 가지고 와서 사용하기 편해야 한다

   출처 :  위키백과사전




<C 와 JAVA 의 차이점>

C언어가 개발되고 여기에 객체지향이라는 개념이 도입되어 C++이라는 언어가 만들어졌다.
JAVA는 전자기기 등의 펌웨어 제어용으로 사용될 목적으로 C++을 기반으로 개발된 언어이다.  JAVA는 C와 C++의 일일이 컴파일 해야 하는 번거로움을 덜기 위해 생겼났다.
C언어는 컴파일을 바로 해당하는 CPU언어로 바뀌게 된다. 코딩한 내용을 바로 해당 CPU가 알 수 있는 언어로 컴파일하게 된다. 그러므로  C가 JAVA보다 실행속도가 빠르다.
그러나 C언어는 CPU에 맞추어 일일이 컴파일 해주어야 한다.
JAVA는 크로스플랫폼을 지원하기 때문에 타겟이 되는 작업환경에 최적화된 컴파일 소스를 지원하지 않는다. 여기서 C의 컴파일 소스에서 20배에서 50배 가량 느린 실행속도를 보인다.
JAVA의 강점은 크로스플랫폼 이외에도 생산성이 크다고 한다. 무수히 지원되고 별다른 수정없이 가져다 쓸 수 있는 라이브러리로 인해 라이브러리를 만드는 시간보다 라이브러리로 무엇을 해야 하는지에 초점을 맞출 수 있어 코딩 시간이 줄어든다고 한다.
JAVA는 운영체제에 따라 컴파일 되는 것이 아니라 바이트 코드라는 중간계 코드를 한 번 더 만들게 되는데, 이 바이트 코드는 컴퓨터가 이해 하지 못 한다.
그래서 자바를 설치할 때 해당 운영체제 별 JVM이 설치되어 CPU가 이해 할 수 있는 명령어로 바꿔 준다. 바이트 코드로 바꾸는 첫 단계가 느리다는 단점이 있지만 그 외에 속도 차는 거의 없다고 한다.

2010년 9월 5일 일요일

1. The Big Picture

이번 단원에서 컴퓨터에 대한 전반적인 부분에 대해 다루고 있다. 컴퓨터의 역사와 컴퓨터를 배우기 위한 기본적인 전문 용어 등에 대해 다루고 있다.

2. Binary Values and Number Systems

이 단원에서는 c프로그래밍 시간에도 잠시 다뤘던 정보를 다루는 방법인 2진법을 다루는 방법에 대해 나와 있다. 2진법을 중심으로 다른 진수들에 대해서도 배운다.

3. Data Representation

여기에서는 숫자, 그래픽, 비디오 등의 다양한 형태로 다루어 지는 정보들에 대해 나와 있고 이 정보들을 어떻게 효율적으로 다뤄야 하는 지에 대해 배운다. 앞으로 배울 멀티미디어 시스템과목과도 연관이 있는 것 같다.

4.Gates and Circuits

컴퓨터의 기본적인 하드웨어에 대해 나와 있다. 컴퓨터과학과 전자공학에 대해서도 배우는 단원인 것 같다.

5.Computing Components

컴퓨터의 기본적인 장치들에 대해 각각 설명되어져 있다. 연산장치와 입출력장치, 제어장치 등 각각의 장치들에 대해 자세히 배울 수 있는 단원이다. 컴퓨터의 구조를 배우는 단원과 연관이 있는 것 같다.

6.Low-Level Programming Languages and Pseudocode

여섯번째 단원에서는 기계코드와 낮은 수준의 프로그래밍 언어에 대해서 배우고 수도코드와 알고리즘에 대해 배운다. 이번 단원은 c프로그래밍 과목과 많은 연관이 있는 것 같다.

7.Problem solving and Algorithms

이번 단원은 컴퓨터 언어를 사용한 프로그래밍으로 문제를 해결하는 방법을 배운다. 알고리즘에 대해 배우는 단원이다. 이 단원은 프로그래밍 수업과 알고리즘 수업과 연관이 있는 것 같다.

8.Abstract Data Types and Subprograms

이 단원에는 많은 하위프로그램 명령문들에 대해 나와 있다. 아마 date structure 수업에서 계속 다루게 될 것 같다.

9.Object-Oriented Design and High-level Programming Languages

이 단원에서는 객체중심디자인과 컴파일러와 자바, c프로그래밍 등 고급 프로그래밍 언어에 대해 나와 있다. 이 단원은 c언어와 자바 등 프로그래밍 과목과 연관이 있어 보인다.

10.Operating Systems

십단원은 윈도우,리눅스 등의 운영체제에 대해 전반적으로 배우는 단원이다. 전 학기에 배웠던 리눅스 과목이나 운영 체제 설계 및 개발과 같은 과목과 연관이 있는 단원인 것 같다.

11. File Systems and Directories

파일의 타입, 접근, 조작 등 파일에 관한 전반적인 부분을 배우고 디렉토리를 조작하는 방법에 대해서도 배우는 것 같다. 리눅스 시간에도 디렉토리를 배웠었던 걸로 보아 유닉스의 이해와 활용 과목과 연관이 있는 것 같다.

12.Infomation Systems

이 단원은 정보 시스템에 대해 나와 있다. 엑셀과 같은 spreadsheets 와 데이터베이스 처리 시스템과 같은 정보 시스템에 대해 배운다. 이 단원은 데이터 구조 및 실습 이나 데이터베이스응용과 같은 수업과 연관이 있는 것 같다.

13.Artificial Intelligence

이 단원에서는 인공뉴런, 음성 인식 같은 인공지능에 대해 배우는 단원이다. 이 과목은 나중에 배울 인공지능 과목과 관련이 깊어 보인다.

14.Simulation, Graphics, Gaming and Applications

이번 단원은 시뮬레이션, 게임, 그래픽과 같은 어플리케이션에 대해 배운다. 이번 단원은 게임 프로그래밍이나 컴퓨터 그래픽스 같은 수업과 관련이 있는 것으로 보인다.

15.Netwoks

이 단원에서는 컴퓨터 네트워크에 대해 자세히 배운다. 네트워크의 종류와 프로토콜, 등 네트워크에 대해 전반적으로 배운다. 이 단원은 컴퓨터네트워크 수업과 관련이 있는 것 같다.

16.The World Wide Web

인터넷에 대하여 배우는 단원이다. 15장과 마찬가지로 컴퓨터네트워크 수업과 관련이 있어 보인다.

17.Limitations of Computing

마지막 단원에서는 커뮤니케이션, 에러 등 컴퓨터의 한계에 대해 나와 있다. 이 단원은 컴퓨터 전반적인 수업들 모두와 연관이 있는 것 같다.