Search

C Programming 시작하기 1 - 소개

Computer Language/C 2007. 8. 28. 23:40 Posted by AstinLen

1. C는?

 벨 연구소에서 1971년경부터 리치(D.M.Ritchie) 등에 의해서 설계 개발된 시스템 기술용의 프로그래밍 언어입니다. UNIX 오퍼레이팅 시스템의 기술에 사용할 것을 목적으로 설계한 언어로 UNIX OS의 대부분이 이 언어로 개발되었습니다. 컴퓨터의 구조에 밀착한 기초 기술이 가능한 것과 간결한 표기가 될 수 있는 것 등을 특징으로 하고 있습니다.

 시스템 기술용 언어의 경우에는 기억장치의 주소(address) 등과 같은 하드웨어 자원까지 기술의 대상으로 할 것을 요구하고 있는데, C 언어에서는 이러한 수준의 개념을 데이터 형이나 함수 등의 고수준 언어의 개념에 잘 대응하고 있습니다. 따라서 언어의 성격상 일반적인 범용의 언어와 거의 다를 바가 없습니다. 프로그램을 다른 종류의 컴퓨터에 이식하는 것도 용이하며, 범용 언어이기는 하지만 강력하고 고수준의 언어로 하는 것을 목표로 하고 있지 않습니다.

 C 언어는 프로그램 오류를 쉽게 발견하기 위한 기능은 부족하지만, 고수준 언어에서 자주 볼 수 있는 기술상의 제약이 적기 때문에 오히려 프로그래밍하기 쉬운 편리한 언어로 평가되며, 프로그램을 간결하게 쓰기 위하여 많은 연구를 한 언어입니다.

 C 언어의 기본 특징은 ASCII코드 체계로 영문 소문자 집합을 바탕으로 하고 있으며, 함수(function)의 정의문들의 집합으로 구성되어 있고, 분할 컴파일을 할 수 있어 함수 정의부 밖의 외부 변수를 정의함으로써 컴파일 단위가 다른 함수의 외부 변수를 참조할 수 있게 되어 있습니다. 또한 프로그램의 함수 기능에는 FORTRAN의 SUBROUTINE 기능과 FUNCTION 기능을 가지고 있으며, 함수 호출시 매개변수의 값만 넘겨주는 호출 방식을 따르고 있고, 자료의 주소를 자유롭게 조작할 수 있는 점들입니다.


2. C의 특징

  • 이식성
     C 언어는 다른 프로그램 언어보다 높은 호환성을 가지고 있고 C언어의 표준함수로만 작성된 프로그램은 어떤 기종의 컴퓨터에서도 정상적으로 컴파일 되고 실행될 수 있습니다. 예를 들면 소형 컴퓨터에서 작성된 프로그램이 대형 컴퓨터에서도 완벽하게 사용될 수 있는 것 입니다.

  • 다양성
     C 언어는 과학 계산용 프로그램뿐만 아니라 FA(공장 자동화), OA(사무 자동화), GUI(Graphics User Interface), 시스템 프로그램(system pr ogram), 응용 프로그램(application program) 등과 같이 컴퓨터의 모든 분야에서 사용할 수 있도록 설계된 효율적인 프로그램 언어입니다.

  • 유연성
     C 언어의 가장 큰 특징중의 하나는 소프트웨어의 부품화를 실현 할 수 있다는 것입니다. 소프트웨어의 부품화란 새로운 프로그램을 개발하기 위해 이미 작성된 프로그램 모듈들을 그대로 사용하는 곳을 의미합니다.
     C 언어를 부품과 같이 사용할 수 있는 대표적인 응용 소프트웨어로는 클리퍼, 폭스프로, 윈도우, 오토캐드 등이 있습니다. 또 다른 의미로는 기계어(어셈블리)에 준하면서 고급프로그래밍 언어로 집적된 표현을 할 수 있다는 것입니다.
     즉 저급 언어이면서 고급 언어의 성격을 가진 것을 말합니다.

  • 혼합성
     C 언어는 다른 프로그램 언어와 함께 혼합되어 사용될 수 있으며, 혼합 프로그램을 개발하는 프로그램의 혼합성을 극대화시키기는데 사용됩니다.
     C 언어와 함께 가장 많이 사용되는 프로그램 언어는 어셈블리이며 패키지 언어에는 클리퍼 등이 있습니다.

  • UNIX 시스템
     C 언어와 UNIX가 거의 동시에 개발되었으며 UNIX 시스템 자체가 C 언어로 대부분 작성되었기 때문에 최근에 UNIX와 같은 운영체제가 급속히 성장하고 있습니다. UNIX 시스템은 C 언어로 프로그램을 작성하고, 실행하는데 가장 적합한 환경으로 1980년대 이후 수퍼 미니 컴퓨터(super mini computer), 미니 컴퓨터(mini compiuter), 16비트 퍼스널 컴퓨터의 공통 운용 체제로 애용되고 있습니다. 널리 애용되고 있는 이유로 파일의 사용이 쉽고, 입출력(I/O)과 파일의 교체가 간단하며, 명령어(command)와 명령어가 파이프라인(pipeline)으로 연결되고, AT & T사와 정식 계약을 맺고 있어 원시 코드(source code)가 제공되기 때문입니다.
     UNIX 시스템의 C 컴파일러(compiler)는 'cc'로 UNIX 시스템 구조에서 가장자리에 있습니다. 'cc'는 C프리프로세서(preprocessor), 2 패스 컴파 일러(2-pass compiler), 어셈블러(assemler) 및 로더(loader:link,editor), 그리고 각각의 저수준 프로그램(low-level program)들을 호출합니다.
     C 프로그램의 개발은 UNIX 상에서 하는 것이 좋다라고 말하는데 그 이유는 UNIX사의 개발 툴 집단(development tools group)이 풍부하기 때문이다. 예를 들어 대표적인 툴들을 보면 프로그램 개발시에 유용한 명령어들(commands)과 디버거(debugger), yacc, lex, make, sccs 등이 있습니다.
     UNIX시스템에서 C가 특별한 언어이지만 그렇다고 해서 C 언어에만 국한되지 않는다는 것을 미리 생각해 두시기 바랍니다.

1. JDK(Java Development Kit) 설치

Java를 사용하기 위해서는 Java가 실행이 가능한 환경을 만들어 주어야 합니다.
Sun Microsystems 사에서 JDK의 다운로드 주소는 아래와 같습니다.

http://java.sun.com/javase/downloads/index.jsp

첫 화면

현재(07년 08월 28일)는 JDK 6 Update 2 가 최신버전입니다. Download를 선택합니다.

사용자 동의
다운로드

다운로드가 완료 되면 설치합니다.


2. Eclipse 설치

Eclipse는 Java 개발툴로서 무료프로그램입니다. (프리웨어)
설치없이 다운로드 후 압축 풀기 방식으로 사용하실 수 있습니다.

Eclipse를 다운로드하는 방법은 Eclipse 홈페이지를 접속하여, 프로그램을 다운로드합니다.
홈페이지는 아래와 같습니다.

http://www.eclipse.org

첫 화면

Download Eclipse를 선택 후 Eclipse Classic 를 다운로드 받습니다.

다운로드

다운로드가 완료 되면 원하는 위치에 압축을 해제 합니다.

1. Java는?

 네트워크상에서 쓸 수 있도록 Sun Microsystems 사에서 개발한 객체 지향 프로그래밍 언어입니다.

 1995년 5월에 발표, 1996년 1월부터 정식 버전을 배포하였습니다. C++를 바탕으로 언어 규격을 규정하였습니다. 버그의 원인이 되기 쉬운 기능, 예를 들면 지시자(pointer) 연산을 생략하였으며, C++에서는 사용이 끝난 객체(object)를 명시적으로 폐기하도록 프로그램에 기술하였으나 그 대신 자동 폐영역 회수(garbage collection) 기능을 추가하였습니다. 이와 같이 기억 장치 관리의 오류에서 기인하는 버그를 방지합니다.

 Java는 객체 클래스의 계승(inheri-tance) 관계를 실행할 때에 확정하는 동적 모델을 채용하였습니다. C++에서는 컴파일 시에 확정하기 때문에 상위 클래스에 새로운 기능을 추가하면 그 클래스와 계승 관계가 있는 모든 클래스를 재컴파일 해야 합니다. 자바에서는 클래스의 계승 관계를 실행할 때 확정하기 때문에, 하위의 클래스를 재컴파일 할 필요가 없습니다.

 자바로 작성한 프로그램의 원시 코드는 자바 컴파일러로 컴파일합니다. 자바 컴파일러는 바이트 코드라는 중간 코드를 생성합니다. 이 중간 코드를 자바 가상 머신이라는 소프트웨어로 해석해서 실행합니다. 이 소프트웨어를 설치한 컴퓨터라면 컴퓨터의 명령 집합 아키텍처나 운영 체계(OS)에 관계없이 같은 바이트 코드를 변경하지 않고 실행할 수 있습니다. 자바의 원시 코드를 고쳐 쓰거나 재컴파일 할 필요가 없습니다. 그렇기 때문에 자바는 기종이나 운영 체계와 무관한 응용 프로그램의 개발 도구로 각광받고 있습니다.

 자바 가상 머신의 실현 방법으로는 현재 3종류가 있습니다. 즉, 바이트 코드를 해석하여 축차적으로 실행하는 자바 해석기, 바이트 코드를 일괄적으로 2진 코드로 변환하고 실행하는 JIT 컴파일러, 바이트 코드를 고속으로 해석하여 실행하기 위한 자바 칩(마이크로프로세서)입니다.


2. Java의 특징

  • 간단(Simple)합니다.
     자바의 주된 특징은 기존의 C/C++ 언어의 문법을 기본적으로 따르고, C/C++ 언어가 갖는 전처리기, 포인터, 포인터 연산, 다중 상속, 연산자 중첩(overloading) 등 복잡하고 이해하기 난해한 특성들을 제거함으로써 기존의 프로그램 개발자들이 쉽고 간단하게 프로그램을 개발할 수 있도록 합니다.

  • 객체지향적(Object-Oriented)입니다.
     자바는 C++와는 달리 처음부터 객체지향 개념을 기반으로 하여 설계되었고, 객체지향 언어가 제공해 주어야 하는 추상화(Abstraction), 상속(Inheritance), 그리고 다형성(Polymorphism) 등과 같은 특성들을 모두 완벽하게 제공해 주고 있습니다. 또한, 자바의 이러한 객체지향적 특성은 분산 환경, 클라이언트/서버 기반 시스템이 갖는 요구사항도 만족시켜 줄 수 있습니다.

  • 높은 신뢰성(Reliability)을 가집니다.
     자바는 컴파일 시에 에러 검사를 철저하게 하고, 실행 시에 발생할 수 있는 에러에 대해서도 실행 시에 철저하게 검사를 수행함으로써 신뢰도가 높은 프로그램을 작성할 수 있도록 해 줍니다. 또한, C/C++ 프로그램 개발자들을 가장 혼란스럽게 하고, 프로그램의 치명적인 오류를 발생시킬 수 있는 포인터 및 포인터 연산을 자바에서는 사용하지 않게 함으로써, 포인터를 사용함으로써 프로그래머가 범할 수 있는 오류를 없앴다는 것입니다.

  • 보안성(Security)을 가집니다.
     자바는 분산환경에서 작동하도록 설계 되었습니다. 그러나, 자바는 자바 언어와 자바 런타임 시스템 내에 보안 기능이 내재되어 있기 때문에 보안성이 있는 프로그램을 개발할 수 있도록 해 줍니다. 이러한 특성은 자바 프로그램이 네트웍 환경에서 바이러스 등과 같은 프로그램이 파일 시스템을 파괴하려는 것을 막을 수 있도록 해 줍니다.

  • 아키텍쳐 중립적(Architecture-neutral)이고 이식성(Portable)이 높습니다.
     자바는 서로 다른 이종(Heterogeneous)의 네트워크 환경에서 분산 되어 실행될 수 있도록 설계되었습니다. 이와 같은 환경에서는 응용 프로그램들이 다양한 하드웨어 아키텍쳐 위에서 실행될 수 있어야만 합니다. 이를 위해 자바 컴파일러는 이종의 하드웨어 및 소프트웨어 플랫폼에서 효율적으로 코드를 전송하기 위해 설계된 아키텍쳐 중립적인 중간 코드인 바이트코드를 생성합니다. 이는 동일한 자바 프로그램의 자바 바이트코드가 자바 가상머신이 설치되어 있는 어떤 플랫폼에서도 실행될 수 있도록 하는 것입니다. 또한, 자바는 기본 언어 정의를 엄격하게 함으로써 효율적인 이식성을 제공해 주고 있습니다. 예를 들어, int 형과 같은 기본 데이터형의 크기를 플랫폼과 무관하게 일정하게 하고, 연산자의 기능을 확실하게 규정하고 있습니다. C 언어를 이용하여 int 형을 선언할 때, 도스에서는 16비트, 윈도우 95/98/NT 등 32비트 운영 체제 환경에서는 32비트, 유닉스에서는 32비트 등 그 플랫폼에 따라 크기가 다르지만, 자바에서는 플랫폼에 상관없이 32비트로 고정되도록 하였습니다. 이는 자바 프로그램이 실행되는 환경이 자바 가상머신으로 동일하기 때문입니다.

  • 높은 수행성능(High-performance)을 제공합니다.
     자바에서는 인터프리터가 런타임 환경을 검사할 필요 없이 실행될 수 있도록 구성하였기 때문에 뛰어난 성능을 제공해 줍니다. 쓰레기 수집기(garbage collector) 즉 메모리 관리자는 자동으로 낮은 우선순위의 백그라운드 스레드로 실행되어 메모리가 필요할 때에만 동작하도록 함으로써, 자바 가상머신에게 무리를 주지 않으면서 보다 나은 수행 성능을 제공할 수 있도록 해 줍니다. 또한, 방대한 양의 계산을 수행하는 프로그램은 계산이 많은 부분을 본래의 플랫폼에 해당하는 기계어 코드로 재작성하여 자바 프로그램과 인터페이스 할 수 있도록 하였습니다.

  • 인터프리터(Interpreter) 방식입니다.
     자바 언어로 작성된 자바 프로그램을 중간언어 형태인 자바 바이트코드로 컴파일하고, 이렇게 생성된 자바 바이트코드를 자바 인터프리터가 해석함으로써, 자바 인터프리터와 런타임 시스템이 이식(porting)된 모든 플랫폼에서 자바 바이트코드를 직접 실행할 수 있습니다.

  • 다중 스레드(Multi-thread)를 지원합니다.
     자바의 다중 스레드 기능은 동시에 많은 스레드를 실행시킬 수 있는 프로그램을 만들 수 있도록 해 줍니다. 자바는 동기화 메소드들을 기본적으로 키워드로 제공함으로써, 자바 언어 수준에서 다중 스레드를 지원해 줍니다. 자바 API에는 스레드를 지원해 주기 위한 Thread 클래스가 있으며, 자바 런타임 시스템에서는 모니터와 조건 잠금 함수를 제공해 줍니다.