Joinc 팀블로그 리눅스 메뉴얼 정리 Joinc 위키
댓글

Recent Comments

Powered by Disqus
팀블로그 카테고리
  전체 (1105)
   공지사항 (1)
   검색엔진 (21)
   기술동향 (58)
   게임 (2)
   독서 (6)
   리눅스 (12)
   보안 (1)
   사회문제 (22)
   어셈블리 (43)
   영화 (3)
   오픈소스 (10)
   음악 (9)
   인물 (1)
   포인터 (4)
   프로그래머 (23)
   팀블로그 (20)
   테터툴즈 (29)
   C/C++ (152)
   FireFox (11)
   Gimp (2)
   Google (98)
   Java (13)
   Perl (2)
   Pthread (11)
   STL (13)
   TCP/IP (8)
   Tools (31)
   Web2.0 (42)
   Wiki (1)
«   2010/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
2007/06/11 23:55

자바와 함께 하는 컴퓨터과학 9장 - 입출력 Input/Output

이 문서는 수정될 수 있습니다. 최신문서는 Joinc Wiki에서 확인하세요.
원문 : http://chortle.ccsu.edu/java5/Notes/chap10/ch10_1.html

이번장에서는 자바5.0에서의 입력과 출력에 대해서 다룰 것이다. 모든 프로그램은 데이터를 입력받아서 그것을 처리하고, 처리한 결과를 출력한다. 이번장에서는 키보드를 이용해서 데이터를 입력받는 방법과 결과를 모니터에 출력하는 방법에 대해서 알아보도록 하겠다. 디스크, CD와 같은 매체로의 입출력은 나중에 다루도록 하겠다.

다룰 내용들
  • 입출력 Stream
  • 표준입력/출력 Streams
  • 예외 - Exceptions
  • int형 데이터를 String 로 변경하기

입출력 I/O

I/O 는 입출력(input output)의 약자다. 입출력은 소프트웨어뿐만 아니라 전자기적 수준까지 다루어는 매우 복잡한 영역이다. 컴퓨터가 외부에서 데이터를 읽어들이는 방법과 외부로 데이터를 출력하는 것은 다양하며 서로 전혀 다르기 때문에 이둘에 대해서 이해를 하고 있어야 한다. 입력을 통해서 읽어들인 데이터는 출력이 가능하게끔 변환하는 복잡한 과정리을 거치게 된다. 그러나 다행히도, 이러한 복잡한 내부과정은 당신의 프로그램에서 사용하는 메서드들이 전부 알아서 처리하므로 크게 신경쓰지 않아도 된다.

이 문서는 입력을 위해서 java.util.Scanner클래스를 이용할 것이다. Scanner는 Java의 기본요소가 아니며, java 5.0에 새로이 추가된 패키지다. package는 다른 프로그램에서 사용할 수 있게 마들어놓은 클래스의 모임이다. C와 같은 언어에서의 라이브러리와 비슷하다고 보면 될 것이다. 클래스가 툴 이라면, 패키지는 툴박스 정도라고 이해하자.

입출력은 매우 기본적인 작업이므로 Java가 자체적으로 I/O 관련 클래스를 내장하면 편할 것이라고 생각할 수 있지만, I/O의 종류가 매우 다양하고, 이들을 자체적으로 포함하면 쓸데없이 프로그램이 커질 수 있으므로, 패키지 형태로 용도에 맞게 선택할 수 있도록 해 놓았다.

문제
당신의 자동차는 컴퓨터를 가지고 있다. 이 컴퓨터는 모터와 센서, 계기판을 제어한다. 이 컴퓨터의 입장에서 입력과 출력기기는 무엇인가.

I/O Streams

만약 당신의 자동차의 프로그램이 java로 만들어져 있다면, 센서와 모터를 제어하기 위한 특별히 만들어진 I/O 패키지들을 포함하고 있을 것이다. 이 패키지는 여러분이 사용하는 키보드와 터미널을 제어하기위한 일반적인 I/O 패키지와는 전혀다를 것이다.

자바에서 입력된 데이터의 원본은 input stream이라고 하고, 출력 데이터를 output stream 이라고 한다. 스트림은 다음과 같이 이해할 수 있다.

IOStreams.gif

위의 그림에서 각각의 "O"는 datum(데이터의 초각)을 의미한다. 이들 datum은 일종의 컨테이너 벨트를 통해서 흐르는 것처럼 Java Program으로 흘러들어가게 된다. 스트림(흐름)이라고 부르는 이유가 여기에 있다. 입력되는 데이터를 reading 데이터 출력되는 데이터를 writing 데이터라고 한다. 출력 스트림은 모니터 혹은 프린터로 흘러들어가게 된다.

보통 프로그램은 여러개의 입력데이터를 읽은 다음 하나의 결과를 출력하게 된다. 숫자의 목록을 입력받아서 더한결과값 하나를 출력하는 프로그램이 대표적인 예다.

문제
문서 편집기 - vi 같은 -에서 입력 데이터와 출력 데이터는 무엇인가.

표준 Stream

입력과 출력에는 다양한 종류가 존재할 수 있다. 예를들어 똑같이 모니터에 출력하는 데이터라고 하더라도 결과값을 출력할 수도 있지만 에러를 출력할 수도 있다. 만약 아무런 속성이 없이 데이터를 모니터에 출력한다면, 사용자는 출력된 데이터가 에러메시지인지 아니면 정상처리되어서 나온 메시지인지를 확인할 수가 없다.

그래서 프로그램은 표준적으로 사용할 수 있는 스트림의 속성을 분류해 놓고 있다.
  • System.in : 입력 스트림
  • System.out : 출력 스트림으로 일반적인 결과를 출력한다.
  • System.err : 출력 스트림으로 에러메시지를 출력한다.

일반적으로 System.in은 키보드로 연결되며, 문자들을 입력받는다. System.out와 'System.err"은 모두 모니터에 연결되어 있으며, 동일하게 문자데이터를 출력한다. System.out와 System.err에 대한 내용은 표준입력표준출력관련 문서를 읽어보기 바란다.

문제
키보드로 1234를 입력했다면, 프로그램에 어떤 데이터가 전달되는가.

문자열 입력과 출력

키보드는 컴퓨터에 문자데이터를 전달한다. 숫자판의 숫자를 입력했다고 하더라도, 문자가 전달이 된다. 그리고 모니터는 문자를 모니터에 출력한다. 아래의 그림은 키보드로 입력된 데이터가 모니터에 출력되는 과정을 묘사하고 있다.

charsINcharsOUT.gif

그러므로 만약 여러분의 프로그램이 산술계산을 한다면, 키보드로 입력된 문자값을 원시데이터타입 중의 하나인 int형으로 변환해야 한다. 이러한 일은 Scanner객체를 이용하면 된다. 이렇게 해서 산술연산을 한 결과는 모니터에 뿌려지게 되는데, 이때 반드시 문자 데이터로 변경이 되어야 한다. 이것은 System.out 메서드를 이용하면 된다.

문제
System.out메서드를 사용해본적이 있는가?

입출력 예제 프로그램

다음은 자바프로그램이 입출력 데이터를 다루는 방식을 묘사하고 있다. 이 그림에서 네모상자 안의 부분이 프로그램이다. 프로그램은 Scanner를 이용해서 입력을 받고, System.out을 이용해서 출력한다.

EchoPicture.gif

ScannernextLine() 메서드를 호출해서 키보드로 부터 줄단위로 문자들을 읽어들인다. 읽어들인 문자들은 String 객체로 보내진다. 보내진 데이터는 String 객체의 레퍼런스 변수인 inData에 의해서 참조된다. 이제 System.outprintln()메서드를 이용해서 inData의 값을 모니터에 출력하게 된다.

문제
Scanner 에 nextLine 말고 다른 메서들도 있다고 생각되는가 ?

Echo.Java

실제 작동한 자바프로그램이 있다. 이 프로그램은 키보드로 부터 문자를 읽어들여서 String 객체에 저장한후, 모니터에 출력하는 일을 한다.
import java.util.Scanner;

class Echo
{
public static void main (String[] args)
{
String inData;
Scanner scan = new Scanner( System.in );

System.out.println("Enter the data:");
inData = scan.nextLine();

System.out.println("You entered:" + inData );
}
}
import java.util.Scanner;는 java.util.Scanner 패키지에 있는 Scanner 클래스를 사용하겠다는 걸을 알려주기 위해서 사용한다. java.io 패키지는 자동으로 import 된다. 다음은 실행결과다.
$ java Echo
Enter the data:
Hello World
You entered:Hello World
컴파일 시키는 방법은 앞장에서 다룬바가 있으므로 설명하지 않도록 하겠다.

문제
123 과 같은 숫자정보도 받아들일 수 있는가 ?

숫자도 문자다

이렇게 키보드로 받아들인 데이터는 그게 눈으로 보기에 숫자라고 하더라도 모두 문자로 처리된다. 만약 산술계산을 하고 싶다면, 문자를 숫자로 바꾼다음 산술계산을 해야 한다.

문자를 숫자로 바꾸는 방법은 차차 알아나가게 될 것이다.

문제
키보드로는 문자만 받아들일 수 있습니까 ?

자세히보기

앞의 Echo 프로그램을 자세히 파헤쳐 보도록 하자.
import java.util.Scanner;

class Echo
{
public static void main (String[] args)
{
String inData;
Scanner scan = new Scanner( System.in );

System.out.println("Enter the data:");
inData = scan.nextLine();

System.out.println("You entered:" + inData );
}
}

class Echo

프로그램의 클래스 이름은 Echomain() 메서드를 가진다.

  • public static void main (String[] args)
    모든 main() 메서드는 동일한 방법으로 시작하며, 실행되기 위해서는 main() 메서드를 포함해야만 한다.
  • String inData;
    프로그램이 생성한 String 객체를 reference 하기 위한 reference 변수 inData를 선언한다.
  • Scanner scan = new Scanner( System.in );
    Scanner 객체를 생성하며, 생성된 객체를 위한 레퍼런스 변수 scan에 대입한다.

문제
Scanner는 어떤 데이터 stream에 연결되어있는가.

  • System.out.println ("Enter the data:");
    이 메서드는 모니터에 문자열 "Enter the data"를 출력한다.
  • inData = scan.nextLine();
    nextLine()메서드를 이용하면 키보드로 부터 한줄의 문자열을 읽어들일 수 있다. 읽어들인 문자열은 String 객체인 inData가 refer한다.
  • System.out.println("You entered:" + inData );
    "You entered:" 다음에 inData가 refer하고 있는 문자열을 모니터에 출력한다.

    문제
    enter키를 누르기전에 문자열의 편집이 가능한가? (backspace 혹은 키보드 이동을 통한)

    숫자입력

    여기에 또다른 프로그램이 있다.
    Enter the data:
    Columbus sailed in 1492.
    You entered:Columbus sailed in 1492.

    문자 '1', '4', '9', '2' 에 주목하라. 우리는 숫자라고 하더라도 모두 문자로 처리된다는 것을 알고 있다. 이러한 경우에는 입력받은 데이터를 문자로 인식해도 문제가 되지는 않을 것이다. 그러나 콜롬버스가 지금으로 부터 몇년전에 항해를 했는지를 계산하고자 할 경우에는 문제가 발생한다.

    nextInt()

    Scanner 객체에서 제공하는 nextInt 메서드는 읽어들인 문자열을 int타입으로 변환한다. Scanner 객체는 문자열의 스트림에서 한자씩 문자로 읽어들여서 숫자로 변환한다. 변환된 숫자는 32bit 데이터 타입으로 저장된다.

    charsConversion.gif

    위의 그림은 읽어들인 문자열이 어떻게 숫자로 변환되는지를 보여주고 있다. 입력된 데이터는 integer로 변환된다음 num에 저장된다. 변환된 숫자는 제곱된다음 square 에 저장되고, println 메서드를 이용해서 문자열로 변환된 다음 화면에 출력이 된다.

    문제
    문자열에 대해서 산술연산이 가능한가 ?

    EchoSquare.java

    다음의 프로그램은 이전에서 그림으로 묘사되었던 일을 수행한다. 키보드로 입력을 받아서 제곱을 한다음 그 결과를 화면에 출력한다.
    import java.util.Scanner;

    class EchoSquare
    {
    public static void main (String[] args)
    {
    Scanner scan = new Scanner( System.in );
    int num, square; // declare two int variables

    System.out.println("Enter an integer:");
    num = scan.nextInt();
    square = num * num ; // compute the square

    System.out.println("The square of " + num + " is " + square);
    }
    }
    다음은 컴파일하고 실행시킨 결과다.
    $ javac EchoSquare.java
    $ java EchoSquare
    Enter an integer:
    12
    The square of 12 is 144
    $

    문제
    이 프로그램이 아래와 같은 입력을 처리할수 있을까?
    천이백삼십사

    integer로 변환하기

    위의 프로그램에서 integer형으로 변환하는 것은 아래의 코드를 통해서 이루어진다.
    num = scan.nextInt();

    이코드는 다음과 같은 과정을 밟는다.
    1. 대입연산자의 오른쪽에 있는 코드가 먼저 평가되고 실행된다.
    2. 실행된 결과값이 변수 num 에 저장된다.

    nextInt 메서드는 공백문자나 개행문자를 만나기 전까지의 입력된 문자열을 int형으로 변환하고 그 결과를 num 변수에 저장한다.

    만약 주어진 문자열이 변환할수 없는 문자를 포함하고 있다면, java는 Exception을 발생시키고 프로그램을 종료시킨다. Exception은 프로그램의 오동작과 관련된 정보를 담고 있는 객체다. 실제 산업현장에서 사용되는 프로그램은 Exception이 발생했을 때, 이에 대한 처리를 해주어야 하지만, 이 프로그램은 그냥 프로그램을 종료시킨다.

    문제
    이 프로그램은 아래의 입력을 제대로 처리할수 있을까?
    Enter an integer: 1492
    Enter an integer: Fourteen ninety two
    Enter an integer: 14.92
    Enter an integer: -1492
    Enter an integer: 1 4 9 2

    InputMismatchException

    사용자가 숫자로 변경할 수 없는 잘못된 문자를 입력한다면, 이 프로그램은 다음과 같이 예외(exception)을 발생시킨다.
    $ java EchoSquare
    Enter an integer:
    14.92
    Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:819)
    at java.util.Scanner.next(Scanner.java:1431)
    at java.util.Scanner.nextInt(Scanner.java:2040)
    at java.util.Scanner.nextInt(Scanner.java:2000)
    at EchoSquare.main(EchoSquare.java:11)
    $

    예외는 자바 프로그램이 잘못실행될 때, 자바시스템에 의해서 발생되며 특별한 처리를 해주지 않을경우 프로그램을 종료시킨다.

    문제
    다음의 입력을 integer 형으로 받아들일 수 있을까 ?
    +65

    다른 예제

    다음은 두개의 숫자를 입력받아서 더한후 출력하는 프로그램이다.
    import java.util.Scanner;

    class AddTwo
    {
    public static void main (String[] args)
    {
    Scanner scan = new Scanner( System.in );
    int first, second, sum ; // declaration of int variables

    System.out.println("Enter first integer:");
    first = scan.nextInt(); // read chars and convert to int

    System.out.println("Enter second integer:");
    second = scan.nextInt(); // read chars and convert to int

    sum = first + second; // add the two ints, put result in sum

    System.out.println("The sum of " + first + " plus " + second +" is " + sum );
    }
    }
    다음은 실행결과다.
    $ java AddTwo
    Enter first integer:
    100
    Enter second integer:
    200
    The sum of 100 plus 200 is 300

    $ java AddTwo
    Enter first integer:
    800
    Enter second integer:
    -400

    나누기 테스트

    앞에서 다루었던 프로그램을 약간 수정해서, 다양한 산술연산이 가능한 프로그램을 작성했다.
    • dividentdivisor 두개의 수를 입력받는다.
    • (quotient)과 나머지(remainder)를 구한다.
    • quotient * divisor + remainder 를 계산해서 출력한다.
    import java.util.Scanner;
    class IntDivideTest
    {
    public static void main (String[] args)
    {
    Scanner scan = new Scanner( System.in );

    int dividend, divisor ; // int versions of input
    int quotient, remainder ; // results of "/" and "%"

    System.out.println("Enter the dividend:"); // read the dividend
    dividend = scan.nextInt();

    System.out.println("Enter the divisor:"); // read the divisor
    divisor = scan.nextInt();

    quotient = dividend / divisor ; // perform int math
    remainder= dividend % divisor ;

    System.out.println( dividend + " / " + divisor + " is " + quotient );
    System.out.println( dividend + " % " + divisor + " is " + remainder );
    System.out.println( quotient + " * " + divisor +
    " + " + remainder + " is " + (quotient*divisor+remainder) );
    }
    }
    프로그램을 실행시키고 다양한 값을 입력해서 어떤결과가 발생하는지 테스트해보도록 하자.
  • :::
    2007/06/08 16:26

    자바와 함께 하는 컴퓨터과학 8-3 : Object Data(객체 데이터)

    이 문서는 수정될 수 있습니다. 최신 문서는 Joinc Wiki 에서 확인하세요.

    원문 : http://chortle.ccsu.edu/java5/Notes/chap09C/ch09C_1.html

    이번장에서는 객체가 무엇인지, 어떻게 사용해야 하는지에 대해서 알아보도록 하겠다. 객체에 대한 모든 토론은 표준 자바 라이브러리에 포함된 클래스를 기준으로 할 것이다. 자기만의 객체를 만드는 것은 나중에 다루도록 하겠다.

    다음과 같은 내용들을 다룰 것이다.
    • Classes
    • 객체(Objects)
    • Reference 변수
    • String 객체
    • 객체의 실행 메서드
    • String 객체의 메서드들

    문제
    자바는 두종류의 데이터를 가진다. 나열해 보아라.

    객체와 원시 데이터

    원시 데이터 타입은 비트패턴으로 된 조그마한 데이터이며, 하나의 아이템을 표현하기 위해서 사용한다. 예를 들어 int는 32bit 크기의 비트패턴을 가지며, 정수형 숫자를 표현하기 위해서 사용한다. 자바는 byte, short, int, long, float, double, char, boolean의 8가지의 원시 데이터타입만을 제공한다.
      +-------------+-------------+
    | Primitive | Objects |
    | Data | |
    +-------------+-------------+

    객체는 많은 처리해야할 데이터와 처리하기 위한 프로세스 정보들을 가진다. 자바는 수천개의 객체 클래스를 제공하며, 프로그래머는 여기에 덧붙여서 쉽게 자신의 클래스를 생성할 수 있다.

    여기에서는 왜 객체를 사용해야 하는지에 대한 것들은 다루지 않을 것이다. 이내용들은 26장에서 다룰 것이다.

    문제
    객체는 원시데이터타입 을 포함할 수 있는가?

    객체의 모양

    객체는 데이터와 메서드로 구성된다. 옆의 그림은 객체의 일반적인 모습을 보여주고 있다. 각각의 조그마한 노란색 블럭은 메모리의 바이트를 의미한다. 데이터와 메서드를 불문하고 모두 바이트로 구성된 정보임을 알 수 있다. 이 객체는 Elementary, my dear Waston!이라는 데이터를 포함하며, 이 데이터를 다루기 위한 concat, equals, length, substring 메서드들을 포함한다.


    class는 객체의 데이터 타입으로, 객체를 선언하기 위해서 사용한다. 클래스는 집을 짓기 위한 계획과 같은 것으로 생각할 수 있다. 집을 짓기 전에, 여러분은 집을 어떻게 지을것인지에 대한 계획을 세울 것이다. 여기에는 망치, 나무, 못, 시멘트와 같은 재료와 공학적인 지식들이 포함될 것이다. 집을 짓는데 필요한 재료를 데이터, 집을 짓는 방법을 나타내는 공학적인 지식들이 메서드정도가 될 것이다.

    옆의 그림의 객체는 자바의 기본객체중 하나인 String 클래스를 보여주고 있다. 이 String 객체는 문자열을 데이터로 가지며, 이문자열을 다루기 위한 여러 메서드들을 포함한다.

    문제
    String객체에서 length 메서드는 무엇을 하기 위해서 존재한다고 생각되는가 ?

    객체의 생성

    아래의 프로그램은 String객체를 생성하는 방법을 보여주고 있다.
    class StringDemo1
    {
    public static void main ( String[] args )
    {
    String str ;

    str = new String( "Elementary, my dear Watson!" );
    }
    }

    이 프로그램에서 다음 부분을 주목해서 보기바란다.
    new String("Elementary, my dear Watson!");
    new를 이용해서 새로운 String객체를 생성하고 있음을 알 수 있다. 이 새로운 객체는 String 클래스의 모든 메서드들을 가지게 된다.

    이 프로그램은 객체의 메서드들을 이용해서 문자열을 다룰 수 있다. 그렇지만 아직까지는 객체를 생성시킨 것 말고는 하는일이 없다. 이 프로그램을 실행시키면, 아무런 결과도 보여주지 않고 바로 종료해 버릴 것이다.

    문제
    "You know my methods, Watson"이라는 문자열 데이터를 가지는 새로운 String 객체를 만들어보자.

    객체는 실행시간에 생성된다

    프로그램이 실행되기전에는 객체는 존재하지 않는다. 프로그램이 시작된 후 새로운 String 객체를 생성할 수 있다.
    class StringDemo1
    {
    public static void main ( String[] args )
    {
    String str;

    str = new String( "Elementary, my dear Watson!" );

    }
    }
    String str 선언은 reference 변수를 생성한다. 이것은 단지 선언일 뿐으로 String를 생성하지는 않는다. 변수 str은 새로 생성될 String 객체를 참조하기 위해서 사용된다.

    다은 라인에서 new 키워드를 이용해서 새로운 String 객체를 만들었으며, str이 이 객체를 참조하도록 하고 있다.

    프로그램의 실행이 중단되면 String객체는 더이상 존재하지 않는다. String 객체가 있던 메모리 공간은 시스템의 다른 프로그램들이 사용할 수 있도록 비워지게 된다.

    Object Reference

    다음과 같은 코드가 있다고 가정해보자.
    str = new String( "Elementary, my dear Watson!" );
    이것은 다음과 같이 실행될 것이다.
    • 표현의 평가
      new String( "Elementary, my dear Watson!" );
      이것은 새로운 객체를 생성한다. 객체는 메모리상에 위치할 것이므로 객체가 메모리상의 어느 위치에 있는지를 가리키는 무엇인가가 필요할 것이다. reference는 객체를 가리키는 일을 한다. 우리가 레퍼런스를 부르면 자바 가상머신이 객체의 위치를 찾아서 되돌려준다.
    • 변수에 값을 저장
      객체를 생성하면 그에 대한 레퍼런스가 생긴다. 이제 이것을 변수에 저장하면 된다.
      str = The reference to the string just created
      이제 str을 이용해서 객체를 사용하면 된다.

    때때로 변수 str객체의 이름 혹은 객체명이라고 부르기도 한다. 레퍼런스라고 하는 것보다는 쉽게 알아들을 수 있지만 명확히 레퍼런스와는 다르므로 명확히 알고 사용해야한다. 이에 대한 내용은 나중에 다루기로 하겠다.

    문제
    객체와 레퍼런스 변수는 어떤점에서 다른가 ?

    Before and After

    여기에 어떻게 객체와 객체를 가리키는 레퍼런스가 생성되는지를 보여주는 그림이 있다. 왼쪽 그림은 프로그램이 막 실행된 상태로 str 변수는 아무것도 레퍼런스 하고 있지 않다. 이제 new키워드를 이용해서 객체를 생성하고 객체의 레퍼런스를 str에 할당해 보자.
    str = new String("Elementary, my dear Watson!");
    이제 새로 생성된 객체가 str에 할당되었다. 오른쪽 그림은 str 이 생성된 객체를 레퍼런스 하는 모습을 보여주고 있다.

    creationPicture_1.gif

    이렇게 해서 레퍼런스가 할당된 변수는 다른 레퍼런스가 할당되거나 프로그램이 종료되기전까지 유지되게 된다.

    문제
    객체가 존재하고 있다면, 메서드를 실행시킬 수 있는가 ?

    메서드의 실행

    아래의 예제 프로그램을 분석해 보도록 하자.
    class StringDemo2
    {
    public static void main ( String[] args )
    {
    String str;
    int len;

    str = new String( "Elementary, my dear Watson!" );

    len = str.length();

    System.out.println("The length is: " + len );

    }
    }
    위의 코드에서
    str.length();
    부분이 있는데, str이 레퍼런스하고 있는 객체의 length() 메서드를 호출하겠다는 의미다. 이 메서드는 객체가 가지고 있는 데이터의 문자열의 길이를 넘겨주는 일을 한다. 생성된 객체가 가지고 있는 문자열 데이터는 "Elementary, my dear Watson!" 으로 27을 넘겨줄 것이다. 메서드를 실행시켜서 얻은 결과값은 len에 저장하고 있다.

    이렇게 실행된 메서드를 calling a method 라고 한다. 위의 프로그램은 length()메서드를 호출하고 있다.

    문제
    문자열의 길이를 계산할대, 공백문자와 구둣점 문자도 계산에 포함되는가 ?

    Dot Notation (표기)

    객체는 다양한 변수와 메서드들을 포함하는데, 이들을 통상적으로 객체의 member이라고 한다. 이러한 멤버들은 dot 표기를 이용해서 접근할 수 있다.
       objectReference . memberName

    만약 객체에 있는 어떤 메서드를 실행시키기를 원한다면, 레퍼런스 뒤에 메서드 이름을 적어주면 된다. 이때 호출하는 메서드가 인자를 필요로 한다면 ( )를 통해서 넘겨준다.
       objectReference . memberName (parameter)
    인자를 필요로 하지 않는 메서드들도 있는데, 이경우에는 () 만 사용하면 된다.

    문제
    length() 메서드는 인자를 필요로 하는가 ?

    레퍼런스 변수의 선언

    레퍼런스 변수를 선언하는 다양한 방법에 대해서 알아보도록 하자.
    • ClassName variableName;
      이 선언은 해당 클래스를 위한 레퍼런스 변수를 선언한다. 그러나 아직 객체는 만들어지지 않았다.
    • ClassName variableName = new ClassName( parameter, parameter, ...);
      이 선언은 해당 클래스를 위한 레퍼런스 변수를 선언한다. 그리고 new 키워드를 이용해서 객체를 생성한다. 최종적으로 레퍼런스 변수는 새로 생성된 객체의 레퍼런스가 할당된다.
    • ClassName variableNameOne, variagleName Two;
      두개의 레퍼런스 변수를 선언할 수도 있다. 이 경우에는 아직 객체가 만들어지지는 않았다.
    • ClassName variableNameOne = new ClassName( parameter, parameter ),
      variableNameTwo = new ClassName( parameter, parameter );
      두개의 페퍼런스 변수를 선언하고, new키워드를 이용해서 생성된 객체를 할당한다.

    • 문제
      다음 코드에 문제가 있는가 ?
      String stringG = new String("And yet, it moves!");

    String 클래스의 메서드들

    String객체는 많은 메서드들을 가지고 있는데, 이들은 또다른 String객체를 생성하기도 한다.

    예를 들어 substring(int begin) 메서드는 String 객체에 포함되어 있는 데이터의 일부분을 복사하는 일을 한다. 여기에 substring 메서드를 사용하는 프로그램이 있다.
    class StringDemo3
    {
    public static void main ( String[] args )
    {
    String str = new String( "Golf is a good walk spoiled." ); // create the original object

    String sub = str.substring(8); //create a new object from the original

    System.out.println( sub );

    }
    }

    위의 코드에서 str.substring(3)은 str 객체가 가지고 있는 데이터인 Golf is a good walk spoiled 의 8번째 위치부터 마지막까지의 데이터를 복사한다. 이 substring 메서드는 String객체를 생성하는 코드를 포함하고 있으며, 최종적으로는 8번째 위치인 a부터 시작하는 데이터를 가진 새로운 객체를 만들게 된다. 예제에서는 이렇게 해서 만들어진 새로운 객체를 레퍼런스 변수인 sub에 할당하고 있다.

    문제
    새 객체가 포함하고 있는 문자열은 무엇인가?

    새로운 String

    아래의 그림은 위의 코드가 실행되는 과정을 보여주고 있다. 이 프로그램은 두개의 레퍼런스 변수를 가지고 실행된다. 그러나 아직은 어떠한 객체로 refer(가리키고)있지 않다. 가장 먼저 다음 코드가 실행이 된다.
       String str = new String( "Golf is a good walk spoiled." );  // 원본 객체의 생성
    이제 새로운 String 객체를 생성하고 이것을 변수 str에 할당한다.

    spoiledWalk.gif

    이제 아래의 코드가 실행이 된다.
       String str = str.substring(8);  // 원래 객체로 부터 새로운 객체를 생성한다. 
    str.substring 메서드는 자신이 가지고 있던 문자열의 8번째 부터 시작하는 새로운 문자열을 가지는 객체를 생성한다. 이렇게 해서 생성된 객체는 변수 sub에 할당이 된다.


    String의 다른 메서드들

    다음은 String이 가진 많은 메서드들을 보여주고 있다. 이들은 String이 가진 메서드들 중 일부분일 뿐이다.
    public char charAt( int index )
    public String concat( String str )
    public boolean endsWith( String suffix )

    public boolean equals( Object anObject )
    public boolean equalsIgnoreCase( String anotherString )

    public int indexOf( int ch )
    public int indexOf( String str )

    public int length()
    public boolean startsWith( String prefix )

    public String substring( int beginIndex )
    public String substring( int beginIndex, int endIndex )
    public String toLowerCase()

    public String toUpperCase()
    public String trim()
    다른 메서드들은 앞으로 천천히 다루게 될 것이다.

    문제
    위의 메서드들 중 객체가 가지고 있는 데이터가 변경되는 메서드를 찾아보라.

    Type Wrappers

    자바는 primitive 데이터와 objects데이터를 가지고 있음을 알고 있을 것이다. 때때로 일관성을 위해서 primitive 데이터타입을 따로 두지 않고 모두 객체로 두고 싶을 때가 있을 것이다. 이를 위해서 Java 는 Wrapper type 이라는 것을 제공하고 있다. 이 객체들은 내부에 원시데이터 타입을 가지고 있다. 각각의 Wrapper type 은 원시데이터 타입의 첫글자를 대문자로 하는 이름을 가지고 있다.
    원시 데이터 타입 Wrapper type
    byte Byte
    short Short
    int Int
    long Long
    float Float
    double Double
    char Character
    boolean Boolean

    예를 들어 원시데이터 타입인 int 형은 32 bit의 크기 가진다. 103 이란 값이 있다면, 이 32bit의 공간에 저장이된다. 이것은 Integer 타입에 동일하게 저장할 수 있다. 물론 Integer 은 객체로, 103이라는 값 외에도 다른 메서드들을 포함하기 때문에 더 많은 메모리 공간을 차지한다.

    이들을 이용하는 방법은 나중에 다루도록 하겠다.

    문제
    String는 wrapper 클래스인가 ?
    :::
    2007/05/12 23:59

    번역]Coumpter Science Using Java 8-2장

    이번 장에서는 앞장에 이어서 수치표현과 integer 연산자, floating point 연산자들의 쓰임에 대해서 알아보도록 하겠다. 다음과 같은 내용을 다룰 것이다.
    1. 표현에 대한 복습
    2. 수치 연산자들
    3. Integer 연산자
    4. Floating point 연산자
    5. Floating point와 Interger 가 함께 사용될 경우의 표현
    6. 상수 (Constants)

    문제
    아래의 표현은 정확한가 ?
    13 * 6 -

    표현 - Expressions

    expression은 literals, 연산자, 변수명, 값을 계산하기 위해서 사용되는 괄호등의 조합으로 이루어진다.

    표현을 위한 이들 각각의 요소는 올바르게 배열되어야 한다. 보통은 수학에서 보여주는 원칙들이 그대로 사용되기 때문에 직관적으로 사용하는 정도로도 큰 문제없이 문법에 맞는 표현을 사용할 수 있다. 다른 언어들과 마찬가지로 많은 경험을 해보는게 좋은 표현을 만드는 가장 좋은 방법이다.

    표현은 operatorsoperands를 가진다. 당신은 연산자가 +,-,*,/ 등이라는 것을 이미 알고 있을 것이다. operand는 연산자에 의해서 계산이 되어지는 값이다.

    자바 표현에서 연산자와 operands는 명백하게 구분이 된다. 13 -5 라는 표현에서 13과 5는 operand 이고 -는 연산자다. 14 * sum 에서는 14와 sum이 operands가 된다. 별표는 곱셈연산을 위해서 반드시 사용되어야 한다. 14sum 은 잘못된 표현이다.

    다음의 표현에 문제가 있는지 확인하고, 문제가 있다면 교정해보기 바란다.
    • 25
    • 2(a - b)
    • a - b/c +D
    • ( (x+y) / z) / (a -b )
    • 25 - value
    • (a-b) * (c-d)
    • -sum + partial
    • ( (m-n) + (w-x-z) / (p %q)

      문제
      산술표현에서는 숫자만이 사용될 수 있는가 ?

    산술 연산자

    산술연산자는 특히 중요하며, 자바는 다음과 같은 산술계산을 위한 연산자를 제공한다. 아래의 산술연산자는 다른 대부분의 언어들이 공통적으로 지원하고 있다.
    연산자 의미 우선순위
    - 마이너스표시 높음
    + 양수 표시 높음
    * 곱하기 중간
    / 나누기 중간
    % 나머지 중간
    + 더하기 낮음
    - 빼기 낮음

    이러한 모든 연산자는 floating point 숫자나 integer 숫자들이 사용된다. 예를들어 / 연산자의 경우는 양쪽에 있는 integer 숫자 혹은 floating point 숫자들을 서로 나누기 위해서 사용한다.

    integer 연산은 32bit 혹은 64bit (long형) 크기를 가지는 operand를 사용하게 된다. operand에 사용된 값이 32bit 보다 더 작은 자료형의 값이라고 하더라도 32bit 연산을 하게 된다.

    예를 들어 16bit short 변수를 사용한다고 하더라도, 32bit 연산이 수행된다.
       short x = 12;     // 16bit short
    int result; // 32bit int

    result = x / 3 // 모두 32bit 로 간주되어서 연산이 된다.
    x/3은 16bit x 데이터를 32비트 3으로 나누겠다는 표현이라고 생각할 수 있겠지만 실제로는 32bit 데이터 x 를 32비트 3으로 계산을 하고, 그 결과를 32bit 변수인 result에 저장하게 된다.

    문제
    short 형인 12가 32bit 로 바뀌면 어떤 문제가 발생하는가 ?

    다른 예제

    여기에 다른 예제가 있다.
    short x = 12;
    short y = 3;
    short value;

    value = x/y;
    비록 xy가 16비트 크기를 가지고 있다고 하더라도, x/y는 32bit 값 나누기 32bit가 되며, 결과역시 32bit가 된다. 이러한 특성은 전문적인 프로그램영역에서 매우 중요하게 다루어지기도 한다. 그래서 일반적으로 int, long, double 등의 데이터형을 사용하는걸 선호한다. 혹은 type cast (형변환)을 이용하기도 한다. - 형변환에 대한 내용은 한참 뒤에서 다루도록 하겠다. -

    문제
    아래의 코드를 자바에서 실행했을 때 결과가 현대적인 전자계산기와 같을 것이라고 생각할 수 있는가 ?

    Weird Integer Arithmetic

    나누기 연산자인 /는 상황에 따라 다른 연산을 한다. 만약 양쪽의 수가 모두 integer이라면 정수형 나누기연산을 한다. 반면 한쪽이라도 floating point number가 된다면 floating point 나누기연산을 하게 된다. 만약 정수형 나누기가 이루어졌다면, 결과도 정수형이 된다. 이는 소숫점 이하의 수는 계산이 되지 않음을 의미한다.

    아래의 계산을 Java와 전자 계산기에서 수행할 경우 서로 다른 결과를 보여줄 것이다.
      7/4
    전자 계산기는 1.75를 보여주지만, Java는 1을 보여줄 것이다.
    7/4 = 1
    74 모두 정수형으로 정수형 나누기가 이루어지기 때문으로, 소숫점 이하의 수는 버리게 된다.

    문제
    다음 표현의 결과값은 ?
    199/50

    Integer과 Float를 썩으면

    정수형 나누기의 계산방식을 이해하는건 별 문제 없을 것이다. 그러나 아래와 같이 짬뽕될 경우 약간 혼란스러울 수 있을 것이다.
    1.5 + 7/2
    연산자 우선순위에 따라서 + 보다 /연산이 우선 이루어질 것이다. 나누기의 결과는 inger 값인 3이된다. 1.5에 3을 더하니 최종 결과는 4.5 가 된다.

    해당 부분에서 발생한 정수형 연산은 다른 부분에 영향을 미치지 않는다. 위의 경우에는 최종적으로 float point + Integer이 되어서 floating point 연산을 수행하게 된다.

    문제
    다음 표현의 결과는 ?
    1/2 + 1/2

    Copy-and-Paste 프로그램

    정말 제대로된 계산값을 원한다면 위의 수식을 1.0/2.0 + 1.0/2.0으로 바꾸어야 한다. 다음의 자바 프로그램을 컴파일해서 실행시켜 보기 바란다.
    class IntegerDivision
    {
    public static void main ( String[] args )
    {
    System.out.println("The result is: " + (1/2 + 1/2) );
    }
    }

    문제
    99/100의 결과 값은?

    연습

    다음은 나눗셈연산을 사용할때 주어지는 sign에 의한 일반적인 결과룰을 보여주고 있다.

    +num/+div == +result,  -num/+div == -result,  +num/-div == -result,  -num/-div == +result 
    다음은 실예로 위의 룰을 이해하고 있다면 어렵지 않게 결과를 유추해낼 수 있을 것이다.

    17/5 == 3,  -17/5 == -3,  17/-5 == -3,  -17/-5 == 3

    문제
    3/4의 결과는 ?

    subexpressions

    3/4는 양쪽의 operand가 모두 integer이기 때문에, 정수형 나누기 연산이 수행된다. 소숫점 이하의 계산결과를 보기를 원한다면 3.0/4.0으로 표현을 해야 한다. 거의 대부분의 연산자는 두개의 operand를 가진다.
    34+12, 19/3, 90-sum, val * x

    그렇지만 단지 하나의 operand를 가지는 연산자들도 있다.
    +93, -72, +sum, -Math.Pl

    subexpression은 표현을 정확하게 하기 위해서 사용하는 expression의 부분이다.
    (x-y)/2.3, (sum-2) * (sum+3)

    문제
    34.12 / 68.0이라는 표현에서 /는 정수형 나누기를 하는가 floating point 나누기를 하는가.

    Floating point와 Integer 표현을 함께 사용

    그럼 연산에서 Integer 과 floating를 함께 사용하면 어떻게 될까 ?
    • operand가 모두 interge : 정수형 연산
    • 하나라도 floating point 라면 : floating point 연산

    아래의 예는 float와 integer을 모두 포함하는 예다.
    (12.0 * 31)/12, (a-2.0)/b, 56*x/3

    앞의 두개의 예가 floating point 연산이 될거라는걸 쉽게 이해할 수 있을 것이다. 문제는 56*x인데, x가 float인지 아닌지에 따라서 연산의 종류가 달라진다.

    문제
    (12 + 0.0) / 7 에서 /의 타입은 ?

    더 복잡한 Mixed Expression

    이상 연산자에 사용되는 operand 중 하나라도 floating point가 포함되어 있다면, floating point 연산이 수행됨을 알 수 있다. 이러한 규칙이 어떻게 적용될 수 있는지, 아래의 예를 분석해 가면서 알아보도록 하자.

    ( 1/2 + 3.5 ) / 2.0

    괄호안에 있는게 가장 먼저 해석이 되는것을 우리는 알고 있다.
    ( 1/2 + 3.5 ) / 2.0
    ---
    do first
    괄호안의 연산의 경우 /이 '+보다 연산자 우선순위에서 위에 있으므로 1/2 가 먼저 계산될 것이다. 1/2 는 양쪽의 operand가 모두 integer이므로 정수형연산이 이루어질 것이다.
    ( 0 + 3.5 ) / 2.0

    이제 0+3.5 연산이 이루어질 것이다. 한쪽 operand가 floating point형이므로 floating point 연산이 이루어진다.
    3.5 / 2.0
    양쪽 operand 모두 floating point 형이므로 floating point 연산이 이루어진다. 그러므로 다음과 같은 계산결과를 출력하게 된다.
    1.75

    문제
    (a/b + 4) / 2 표현의 결과를 계산하라.
    a는 6, b는 12.0 이다.


    나누기 연산자

    13 을 5로 나눈다면, 다음과 같은 방법에 의해서 계산을 할 것이다.
          2
    --------
    5 | 13
    -----
    10
    -----
    3
    13 / 5 == 2이고 나머지는 3을 가진다. 이 식이 맞는지는 13 == 2*5 + 3을 통해서 증명할 수 있다. 종종 나누기의 이 아닌 나머지가 필요한 경우가 있는데, 이때는 %를 사용하면 된다. 이 연산자를 modulo 연산자라고 한다. 다음은 나머지 연산자의 결과와 그 증명이 옳음을 보여주는 간단한 자바프로그램이다.
    class RemainderExample
    {
    public static void main ( String[] args )
    {
    int quotient, remainder;

    quotient = 17 / 3;
    remainder = 17 % 3;

    System.out.println("The quotient : " + quotient );
    System.out.println("The remainder: " + remainder );
    System.out.println("The original : " + (quotient*3 + remainder) );
    }
    }

    문제
    아래의 표현에서 가장먼저 처리되는 것은 무엇인가.
    System.out.println("The original : " + (quotient*3 + remainder) );

    음수와 양수에서의 나머지 연산

    음수에 대한 나머지 연산은 다음과 같은 규칙을 가진다.
    • 오른쪽 operand에 관계없이 : 왼쪽 operand가 음수면 결과도 음수, 양수면 양수
    17 %  3 == 2     -17 %  3 == -2     
    17 % -3 == 2 -17 % -3 == -2

    상수

    프로그램을 작성하다 보면 종종 상수(constand value)를 사용하는 경우가 있다. 예를 들어 세금계산 프로그램을 짜는데 세율이 0.045% 라면, 이 수는 변하지 않을 것이기 때문이다. 이렇게 값이 변하지 않는다면 상수로 선언할 수 있다. 이렇게 상수로 선언되면 프로그램내에서 결코 바뀔 수 없게 된다.
    class CalculateTax
    {
    public static void main ( String[] arg )
    {
    final double DURABLE = 0.045;
    final double NONDURABLE = 0.038;

    . . . . . .
    }
    }
    final은 컴파일러에게 값이 변경되지 않음을 알려준다. 단지 변경되지 않음을 제외하고는 다른 변수와 차이점은 없다.
    taxamount = gross * DURABLE ;

    그러나 다음의 코드는 컴파일시 에러메시지를 출력하고, 컴파일 실패하게 된다.
    DURABLE = 0.441; 
    DURABLE 는 상수인데, 값을 변경하려고 했기 때문이다.

    이렇게 상수를 사용함으로써 얻을 수 있는 잇점은 아래와 같은 것들이 있다.
    1. 상수는 프로그램을 좀더 쉽게 볼수 있도록 도와준다.
    2. 세율이 0.05로 바뀌었다고 가정해보자. 만약 여러분이 상수를 사용하지 않았다면, 코드내에서 사용된 모든 세율관련 변수명을 찾아서 0.05로 바꾸어줘야 할것이다. 상수로 선언해서 사용했다면, 상수의 값만 변경하면 된다.

      문제
      final을 이용해서 얻을 수 있는 또다른 잇점에 대해서 생각해 보자.
    :::
    2007/05/03 22:12

    번역] 자바와 함께 하는 컴퓨터 과학 8장

    아무리 작은 프로그램이라고 하더라도, 실행되는 프로그램은 항상 값을 다룬다. 이러한 값들은 메인 메모리의 작은영역을 차지하게 된다. 우리가 이 데이터를 사용할려면 메인 메모리의 주소를 알아야 겠지만, 숫자를 사용해서 접근하는 것은 쉽지 않다. 그래서 변수라고 불리우는 심볼을 사용하게 된다.

    이번 장에서 다룰 주제는 다음과 같다.
    • 변수
    • Assignment Statements
    • Expressions
    • 산술 연산자들

    문제
    변수가 어떻게 값으로 바뀌는지 기술할 수 있는가 ?

    변수

    당신이 사용하는 PC의 저장장치에는 수기가 바이트의 공간을 가지고 있다. 여기에는 기계 명령과 데이터들이 저장된다. 메인 메모리의 전자회로는 이들 두개의 데이터에 대해서 어떠한 구분도 하지 않는다. 프로그램이 시작되면 메모리의 특정영역에 기계 명령들과 기타 다른 데이터들이 위치하게 된다. 이렇게 명령과 데이터가 동일하게 메모리에 함께 두도록 하자는 아이디어는 현대적 컴퓨터의 선구자인 John von Neumann에 의해서 제안되었다.

    메모리상에 데이터를 집어 넣었다면, 나중에 다시 빼낼수 있어야 한다. 그러기 위해서 프로그램은 사용하고 있는 각각의 메모리 영역에 대해서 이름을 가지고 있어야지만 한다.
    변수 : 값이 저장된 메인메모리의 위치를 가리키는 심볼

    메인 메모리에 있는 비트패턴을 사용하기 위해서 변수를 이용해서 호출하게 되면, 변수가 가리키는 메인메모리의 데이터를 읽어오게 된다. 변수란 하나 혹은 그 이상의 특별한 데이터 타입의 값이 저장된 상자라고 볼 수 있다.

    payAmount.gif

    그림에서 변수는 payAmount라는 이름을 가지며 long타입의 데이터를 가진다.

    문제
    변수는 반드시 데이터 타입을 가지고 있어야 하는가 ?

    변수의 선언

    여기에 변수 payAmount를 이용하는 프로그램이 있다.
    class Example
    {
    public static void main ( String[] args )
    {
    long payAmount = 123; //a declaration of a variable

    System.out.println("The variable contains: " + payAmount );
    }
    }
    long payAmount = 123;가 변수를 선언하는 곳이다. 변수의 선언이란 프로그램에게 변수가 필요함을 요청하는 것이다. 위의 예제 프로그램에서는 main 메서드에 단지 하나의 변수만 선언되어 있다.

    선언을 위해서는 이름과 변수의 데이터 타입이 필요하다. 이것은 변수가 저장될 공간에 어떤 데이터가 저장될지를 알려주는 역할을 한다. Java와 같은 고급언어에서는 프로그래머는 컴퓨터 하드웨어가 데이터 타입을 위한 공간을 어떻게 만들지 걱정할 필요가 없다. 만약 long타입의 변수를 선언했다면, Java 컴파일러가 long를 위해서 필요한 만큼의 메모리 공간을 확보해 주기 때문이다.

    예제 프로그램에서는 payAmount라는 이름을 가지는 long원시데이터타입을 위한 64bit의 메모리영역을 요구하고 있다. 이제 프로그램이 시작되면, 메모리 공간이 할당되고, 123이 변수영역에 저장이 된다.

    변수는 선언되기 전에는 프로그램에서 사용될 수 없으며, 단 한번만 선언될 수 있다.

    문제
    위의 프로그램이 실행되면 모니터에 어떤 값을 출력하는가.

    자바프로그램 Simulated

    이번에는 간단한 자바프로그램을 흉내내는 프로그램을 만들도록 하겠다. 아래의 코드는 앞전에 이미 다룬 코드다. 여기에는 빈칸이 있는데, 빈칸에 값을 집어 넣고, CompileRun버튼을 누르면, 어떻게 컴파일 되고 실행되는지를 확인할 수 있다. 일종의 자바 시뮬레이션 환경이라고 보면 될거 같다.

    아래의 자바 시뮬레이션 프로그램은 자바스크립트를 지원하는 브라우저에서 작동을 한다.
    class Example
    {
    public static void main ( String[] args )
    {
    long payAmount = ; //a declaration of a variable

    System.out.println ("The variable contains: " + payAmount );
    }
    }
    Simulated Monitor

    이 시뮬레이션 프로그램을 이용해서 여러분은 소스코드를 만들고 컴파일하고 실행시키는 귀찮은 과정없이, 실행과정을 확인할 수 있다.

    문제
    시뮬레이션 변수에 rats 와 같은 문자열을 입력해 보자.. 성공적으로 컴파일 되는가 ?

    변수선언 문법

    모든 언어가 그렇듯이 컴퓨터 언어도 나름대로의 고유 문법을 가지고 있으며, 이를 엄격히 지켜야 한다. 마찬가지로 변수를 선언하는데에도 문법규칙에 따라야 한다.

    여기에서는 변수를 선언하는 다양한 방법에 대해서 알아볼 것이다.

    dataType variableName;
    가장 일반적으로 사용되는 방법으로 변수의 데이터 타입과 변수명만을 명시한다. 이렇게 될경우 해당 변수명을 위한 메모리가 할당될 것이다. 이 메모리 공간에는 아무런 값이 들어가지 않았는데, 이경우 자동적으로 초기화가 된다.

    dataType variableName = initialValue;
    두번째 방법은 변수의 테이터 타입과 변수명을 지정하고, 해당 변수의 메모리 영역에 초기값을 넣는다. 이 초기값은 반드시 dataType와 일치해야만 한다.

    dataType variablenameOne, variableNameTwo;
    두개의 변수를 동시에 선언한다. 두개 모두 메모리만 할당하고, 특별한 값은 저장되지 않는다. 원한다면 두개 이상의 변수에 대한 선언도 가능하다.

    '''dataType variableNameOne = initialValueOne,
    variableNameTwo = initialValueTwo;'''
    두개의 변수를 동시에 선언하며, 모두 초기값으로 초기화 한다.

    문제
    다음 선언은 옳은가 ?
    int answer;

    변수명

    http://chortle.ccsu.edu/java5/Notes/chap09A/ch09_6.html

    프로그램은 프로그램에서 사용될 각각의 변수의 이름을 지어줘야 한다. 덧붙여서 각 이름이 사용하고자 하는 용도에 맞으며, 규칙에 어긋나지 않도록 지어줄 필요가 있다. 이렇게 변수에 이름을 붙여주는 것을 identifier이라고 하며, 아래의 규칙을 따라서 이름지어져야 한다.
    • 'a'~'z', 'A'~'Z', '0'~'9', '_', '$'를 사용할 수 있다.
      이름중간에 빈칸이 포함되면 안된다.
    • 숫자로 시작될 수 없다.
    • 길이는 상관없다.
    • 변수명은 대소문자를 구별한다.
      SUMSum은 서로 다르다.
    • 예약어는 변수명으로 선택될 수 없다.
    • 해당 영역에서 두번 선언할 수 없다.

    예약어는 자바에서 사용하는 미리정의된 단어들이다. int, double, true, import등이 대표적인 예약어들이다.

    변수의 이름을 어떻게 짓는지는 프로그래밍 스타일에 따라서 달라질 수 있다. 일반적으로 변수명은 소문자로 시작하는걸 관례로 하고, 두단어 이상이 함께 사용될경우, 두번째부터 시작되는 단어의 첫자를 대문자로해서 단어간 의미구분을 한다. 예를 들자면 payAmount, grandTotal등이다.

    물론 pay_amount, grand_total와 같은 스타일을 따를 수도 있다. 실제 C와 같은 언어에서는 후자의 스타일을 선호하기도 한다. 그러나 여기에서는 Java 스타일을 따르도록 할 것이다.

    문제
    다음의 변수선언이 규칙에 위배되는지 확인하라.
    • long good-by;
    • short shrift = 0;
    • double bubble =0, toil=9, trouble = 8;
    • byte the bullet;
    • int double;
    • char thisMustBeTooLong;
    • int 8ball;

    예제 프로그램

    http://chortle.ccsu.edu/java5/Notes/chap09A/ch09_7.html

    다음은 다양한 변수선언이 포함된 예제 프로그램이다.
    class Example
    {
    public static void main ( String[] args )
    {
    long hoursWorked = 40;
    double payRate = 10.0, taxRate = 0.10;

    System.out.println("Hours Worked: " + hoursWorked );
    System.out.println("pay Amount : " + (hoursWorked * payRate) );
    System.out.println("tax Amount : " + (hoursWorked * payRate * taxRate) );
    }
    }

    *는 곱하라는 뜻이다. 이 프로그램에서 (hoursWorked * payRate)는 '''hoursWorked와 payRate를 곱하라는 의미다.

    +는 문자열 뒤에 문자열을 덧붙이기 위해서 사용된다. 만약 뒤에 오는 값이 문자열이 아니고 숫자라면, 문자열로 변환되어서 덧붙여 진다. 이 프로그램을 실행시키면 다음과 같은 결과를 보여줄 것이다.
    {
    Hours Worked: 40
    pay Amount : 400.0
    tax Amount : 40.0

    소스 프로그램에서 System.out.println이 처음 사용된 줄의 경우 변수 hoursWorked를 사용하고 있는데, 이는 hoursWorked의 메모리영역에 가서 그 값을 읽어오라는 뜻이 된다.

    문제
    프로그램의 첫번째 실행결과인 40에 소숫점이 찍히지 않는 이유는 무언가. 왜 두번째 결과에는 소숫점이 찍혔는가

    계산

    아래의 프로그램을 다시 한번 살펴 보도록 하자.
    class Example
    {
    public static void main ( String[] args )
    {
    long hoursWorked = 40;
    double payRate = 10.0, taxRate = 0.10;

    System.out.println("Hours Worked: " + hoursWorked );
    System.out.println("pay Amount : " + (hoursWorked * payRate) );
    System.out.println("tax Amount : " + (hoursWorked * payRate * taxRate) );
    }
    }
    붉은 색으로 표시된 줄을 주의깊게 살펴보기 바란다. 여기를 보면 아래와 같이 괄호로 둘러쌓인 영역을 확인할 수 있을 것이다.
    (hoursWorked * payRate)
    이것은 괄호안의 *연산을 먼저하라는 의미다. 이 곱셈연산이 먼저 된뒤에, pay Amount:과� +'''연산이 수행이 된다. 어떤 연산을 할때 이렇게 우선순위를 정하기 위해서 괄호를 이용하는 것은 매우 중요하다. 이는 프로그램이 제대로 수행되도록 해주며, 또한 소스 코드를 더 쉽게 볼 수 있도록 도와준다.

    문제
    위의 한 줄을 두 줄로 풀어서 써도 될까 ?

    각 Statement 를 여러줄로 쓰기

    당신은 하나의 statement를 여러줄에 걸쳐서 쓸 수 있다. 중간에 스페이스 문자로 구분이 되어있다면, 어디든지 statement를 분리할 수 있다. 그러나 이것이 변수명등의 이름의 중간에서 가능한걸 의미하지는 않는다. 또한 따움표등으로 둘러쌓인 string에도 허용하지 않는다. 다음은 하나의 statement를 여러줄로 나타낸 소스 프로그램이다.
    class Example
    {
    public static void main ( String[] args )
    {
    long hoursWorked = 40;
    double payRate = 10.0,
    taxRate = 0.10;

    System.out.println("Hours Worked: " +
    hoursWorked );
    System.out.println("pay Amount : "
    + (hoursWorked * payRate) );
    System.out.println("tax Amount : " + (hoursWorked
    * payRate * taxRate) );
    }
    }
    위의 소스 프로그램은 컴파일과 실행에 아무런 문제가 없으나, 사람이 보기에 깔끔하지 않다. 가능하면 아래와 같이 깔끔하게 작성하는걸 권장한다.
    class Example
    {
    public static void main ( String[] args )
    {
    long hoursWorked = 40;
    double payRate = 10.0,
    taxRate = 0.10;

    System.out.println("Hours Worked: " +
    hoursWorked );
    System.out.println("pay Amount : " +
    (hoursWorked * payRate) );
    System.out.println("tax Amount : " +
    (hoursWorked * payRate * taxRate) );
    }
    }

    문제
    다음 소스프로그램은 제대로 컴파일 되는가?

    cla
    ss Example
    {

    public static void main ( String[] args )
    {
    long hoursWorked = 40;
    double payRate = 10.0, taxRate = 0.10;

    System.out.println("Hours
    Worked: " + hoursWorked );

    System.out.println("pay Amount : " + (hours
    Worked * payRate) );

    System.out.println("tax Amount : " + (
    hoursWorked * payRate * taxRate) );
    }
    }

    Assignment Statements

    이제 어떻게 변수를 만들고, 값을 초기화 하는지에 대해서 알게 되었다. 그러나 아직 값을 바꾸는 방법에 대해서는 모르고 있다. 예상 했겠지만 값을 바꾸는 일은 매우 간단하다. 바꾸고자 하는 변수명에 값을 대입시켜주기만 하면된다. 그러면 프로그램의 실행중간에 값이 변경이 된다. 다음은 대입을 통해서 값을 변경하는 예제 프로그램이다.
    class Example3
    {
    public static void main ( String[] args )
    {
    long payAmount ; // 초기화 없이 선언했다.

    payAmount = 123; //an assignment statement
    System.out.println("The variable contains: " + payAmount );
    }
    }

    대입부분에서 변수 payAmount에 값 123을 밀어 넣었다. 변수가 64bit 자료형으로 선언되었기 때문에, 값 123은 변수가 가리키는 해당메모리의 블럭에 저장이 될 것이다.

    문제
    모니터에 무엇이 출력되는가.

    Assignment Statement Syntax

    위의 프로그램은 123을 출력한다. 이렇게 변수를 초기화 하지 않더라도, 필요할 때 값을 밀어 넣을 수 있다. 이러한 값을 밀어 넣는걸 변수에 값을 대입한다 라고 한다. 대입을 위해서는 대입과 관련된 문법을 사용해야 한다. 문법은 다음과 같다.
    variableName = expression;
  • 대입을 위해서는 =연산자를 사용한다. 대입연산자라고 한다.
  • variableName은 대입하기 전에 선언되어 있어야 한다.
  • expression은 값을 호출하기 위한 계산식 혹은 값 자체다.

    문제
    다음 문장에 문제가 있는가? (sum은 이미 선언되어 있다고 가정한다)
    sum = 42 - 12;

  • Assignment Statement Symatics

    프로그래밍 언어에서 문법은 반드시 규칙에 맞게 작성해야 한다. 그래야지만 그걸 인식하고 바이트코드로 변환해낼수 있다. 대충 문법에 틀리게 말해도 알아서 해석해주는 인간과는 다르다.

    프로그래밍 언어는 명령을 실행하기 위해서 그 명령을 분석하는 단계를 거치게 된다. 대입을 위해서는 다음의 두가지 단계를 거치게 된다.
    1. Evaluate the expression : 값의 계산
    2. 변수에 값을 저장
    다음은 대입의 전형적인 예이다.
    sum = 32+8
    실행단계는 다음과 같다.
    1. Evaluate the expression : 32+8을 계산한다.
    2. 변수에 값을 저장 : 40을 sum에 저장한다.

      문제
      아래의 대입구문이 실행되는 단계를 기술하라.
      sum = 42-12;

    Expressions : 표현

    sum에는 42-12의 결과 값인 30이 저장된다.

    아주 간단하다. 그러나 때때로 두 단계이상의 분석을 요구하는 복잡한 표현이 사용될 때가 있다.

    expression은 literals, 연산자, 변수명, 계산값, 괄호등의 조합이다. 아래에 이들 요소를 설명하고 있다.
    • literal - 값이 직접 의미를 가지는 문자 : 3.456
    • 연산자 - 산술 연산을 위한 +, * 와 같은 심볼들
    • 변수 - 값을 저장하기 위한 메모리 구역
    • 괄호 - ( 과 )

    이들을 조합하면 다음과 같은 복잡한 표현이 가능하다. /는 나누기 연산자이다.
    (32 - y) / ( x + 5 )

    다음은 잘못된 표현이다.
    32 - y) / ( x 5 + )

    산술연산에서의 표현은 은 우리가 알고 있는 대수학의 표현과 유사하지만 몇가지 다른 점이 있다. 예를 들어 두수를 곱하기 위해서는 *연산자가 사용되어야 한다. x와 y를 곱해야 하는 경우 수학에서는 xy로 표현할 수 있지만 자바에서는 x*y로 표현해야 한다.

    문제
    아래의 표현에 문제가 있는지 확인하라. 문제가 있다면 올바로 수정하라.
    • 53
    • 12 - 3)
    • x + 34
    • *z 99
    • sum + value
    • sum +* 3
    • (12-3)
    • sum*34/2
    • 3.1y

    spaces는 문제가 되지 않는다

    표현에서 스페이스 문자는 무시된다. 표현을 위해서 공백문자를 얼마를 사용한다고 해도 아무런 문제가 없다. 이들 공백문자는 보통 소스프로그램을 보기 좋게 만들기 위한 목적으로 사용된다.

    예를 들어 아래의 두 표현은 서로 완전히 동일하다.
    (hoursWorked*payRate)-deduction  -- 1
    (hoursWorked * payRate) - deduction -- 2
    또한 동일한 바이트코드를 생성해낸다. 그렇지만 2번째 표현이 읽기에 좀더 편함을 알 수 있다. 코드를 읽기 편하게 만들면 코드를 쉽게 이해할 수 있으며, 좀더 수월하게 디버깅을 할 수 있다. 그러나 아래와 같이 변수이름에 스페이스가 들어가는 등의 표현은 허용되지 않으며, 컴파일시 에러가 발생할 것이다.
    ( hours Worked * pay Rate) -deduction

    다음과 같이 여러개의 스페이스를 이용하는 것도 가능하지만, 역시 사람이 보기에 좋지는 않으므로 권장하지는 않는다.
    12-4     /     2+2
    위의 수식은 12에서 4를 뺀결과인 8을 2로 나누고 여기에 2를 더하라는 것으로 결과는 8이 나올 것이다. 여기에서 공백문자는 전혀고려되지 않는다. 위 표현은 아래의 표현과 완전히 동일하다.
    12 - 4/2 +2

    산술 연산자

    산술연산자 (arithmetic operator)은 간단한 수치연산을 위한 심볼들이다. 이 산술연산자들은 고유의 우선순위가 존재한다. 우선순위가 높음으로 되어 있는 것은 가장 먼저 계산이 수행된다는 것이고 낮음으로 표시된것은 가장 나중에 계산이 수행됨을 의미한다. 다음은 Java 언어에서 제공하는 산술연산자와 우선순의를 정리한 표이다.
    연산자 설명 우선순위
    - 음수표현 높음
    + 양수표현 높음
    * 곱하기 중간
    / 나누기 중간
    % 나머지 중간
    + 더하기 낮음
    - 빼기 낮음
    어떤 연산자들은 서로 같은 우선순위를 가진다. 예를 들어서 더하기 + 와 빼기 - 는 같은 연산자 우선순위를 가진다.

    음수표현과 양수표현을 위한 -,+는 양수인지 음수인지를 결정하기 위해서 사용하는 심볼이다. 예를 들어 -12는 음의 12, +12는 양의 12로 가장 먼저 계산이 된다.

    이러한 산술연산자는 두개의 피연산자들을 가지며, 두개의 피연산자 모두가 integer 이면 interger artithmetic을 수행한다. 만약 양쪽 피연산자가 모두 floating point 형이라면 floating point arthmetic를 수행할 것이다. 이것은 특히 나눗셈을 할 때 중요하다. intger 형으로 나눌것인지 아니면 float형으로 나눌것인지에 따라서 결과가 완전히 달라지기 때문이다. 예를 들어 5/2 는 2.5가 아닌 2이며, 5/10은 0.5가 아닌 0으로 결과 값이 계산된다. 자세한 것은 뒤에 다루도록 하겠다.

    문제
    다음의 산술연산 결과 값을 입력하라.
    • 16 - 12 / 4
    • 2 + 6 / 2
    • 8 + 4 * 2
    • 8+4 * 2
    • 12/2 - 3
    • 6/8 + 2

    Evalution by Rewriting

    http://chortle.ccsu.edu/java5/Notes/chap09A/ch09_17.html

    산술연산등의 예에서 보듯이 표현은 우선순위와 같은 규칙에 의해서 평가가 된다. 그러므로 계산된 결과를 예측하기 위해서는 표현을 단계별로 나누어서 평가해야할 필요가 있다. 아래의 표현을 보도록 하자.

    16 - 12 / 4

    위의 표현에서는 우선순위에 의해서 나눗셈이 먼저 행해진다. 그러므로 위의 표현의 첫단계는 다음과 같이 평가될 것이다.

    16 - 3

    이제 남은빼기 연산자가 수행되고 결과가 도출 될 것이다.

    13

    이러한 과정은 다음과 같이 요약할 수 있을 것이다.
    16 - 12 / 4
    ------
    16 - 3
    ---------
    13
    점선은 각 단계를 구분하기 위해서 사용되었다.

    문제
    아래의 표현을 평가하고 값을 예측하라.

    같은 우선순위의 경우 왼쪽께 먼저 평가된다.

    -+는 같은 우선순위를 가지는데, 이럴 경우 자연스럽게 왼쪽에서 오른쪽으로 평가가 된다. 다음은 간단한 예이다.
    4 - 2 + 5
    -----
    2 + 5
    -------
    7
    왼쪽에서 오른쪽으로 계산을 하는 것은 우리의 직관과 잘 맞아 떨어지므로 이해하는데 크게 어려움이 없을 것이다.

    문제
    다음의 표현을 평가하고 값을 예측하라.
    2 + 4/2 + 1

    음수표현

    연산자 테이블을 보면 -와 같은 경우와 같이 하나의 심볼이 2개의 표현으로 해석될 수 있음을알 수 있다. 어떤때는 음수임을 나타내기 위해서, 어떤때는 빼기연산을 위해서 사용된다.

    음수를 나타내기 위해서 사용되는 경우는 아래와 같이 표현될 것이다.
    -97.34
    위의 표현은 마이너스 97.34임을 의미한다. 반면 빼기연산자로 사용될 경우가 있다.
    95-12
    위의 표현은 95에서 12를 빼라는 의미다. 음수연산자는 가장 높은 우선순위를 가지고 빼기연산자는 가장 낮은 우선순위를 가진다. 아래의 코드는
    -12 + 3
    음수 12에 3을 더하라는 의미로 결과는 -9가 된다.

    문제
    아래의 표현을 평가하고 결과를 예측하라
    +12 + 3 * -4

    원하는 결과를 위해서 괄호를 사용하라

    연산은 연산자 우선순위에 따르게 되는데, 때때로 이를 무시하고 싶을 때가 있을 것이다. 이럴 경우 괄호를 사용한다.
    -1 * (9-2) * 3

    위와 같이 괄호를 사용하게 되면, 다른 연산자 우선순위를 무시하고 괄호안의 연산을 가장 먼저 수행하게 된다. 위의 경우라면 9-2를 먼저 수행하게 된다. 결국아래와 같이 평가가 된다.
    -1 * 7 * 3

    나머지는 동등한 우선순위를 가진 곱하기 연산자이므로, 왼쪽에서 오른쪽으로 차례대로 연산이 된다.
    -1 * 7 * 3  
    ------
    -7 * 3
    --------
    -21

    문제
    다음 표현의 값을 예측하라.
  • (8-2)/2
  • (2 + 6 )/2-9
  • (8+4) * 2
  • 8+(4*2)

  • 중첩된 괄호

    괄호는 중첩되어서 사용할 수 있다. 복잡한 수식의 경우에 주로 사용되는데, 이럴 경우 수식이 어떻게 평가되는지를 한눈에 파악할 수 있게 해준다. 아래의 수식은 모두 동일하게 평가된다.
    • a + b + c * d
    • a + b + (c * d)
    • (a + b ) + (c * d)
    • ( (a+b) + (c*d) )

      문제
      아래의 표현이 평가와 계산값은 ?
      • 8 + 2 / 2 + 3
      • (8 + 2) / (2 +3)
      • (8 + 2) / 2 + 3
      • 8 + 2 / (2+3)
    :::
    2007/04/17 01:26

    번역]자바와 함께 하는 컴퓨터 과학 7장 원시데이터 타입

    원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Java/Documents/ComputerScienceUsingJava/Chapter07

    컴퓨터 메모리는 비트의 패턴을 저장한다. 이러한 비트들의 패턴에 관계를 두어서 더 쉽게 사용할 수 있도록 만들고 있는데, 이를 데이터 타입이라고 한다.

    이번장에서는 다음과 같은 내용들을 다룰 것이다.
    • 데이터 타입
    • Primitive Data (원시 데이터 타입)과 객체 (Objects)
    • 자바에서 사용하는 Primitive Data Type
    • Numberic 데이터 타입
    • 문자 와 boolean 데이터 타입
    • Type Wrappers

      문제
      다음은 종이의 일부분이다. 이 종이에는 단어가 있는데, 이 단어가 의미하는 바가 무엇인가.

    mixPaper.gif

    데이터 타입

    해답
    무엇을 의미하는지 말하기 힘들다.

    문제의 종이에서 당신은 어떤 것을 얻을 수 있는가. 아마도 찢어진 부분을 예측할 수 없기 때문에, MIX가 의미하는 바를 알지 못할 것이다. 영어 단어 mix일 수도 있고, 라디오에서 한때 명성을 떨쳤던 Tom Mix의 일부분일 수도 있다. 혹은 MTV Dance MIX의 일부분일 수도 있고, BLOODY MARY MIX일지도 모른다. XIW를 뒤집어 놓은 것일 수도 있다. 아니면 우리가 모르는 상형문자의 일부분일 수도 있다.

    컴퓨터 메모리에는 비트의 패턴이 저장된다. 이것이 무엇의 의미할지는 순전히 어떻게 쓰여질지에 따라 달려있다. 마치 MIX가 어떻게 쓰이는지에 따라서 여러가지 의미를 가지는 것과 마찬가지이다. 이렇게 어떻게 쓰일지를 결정하는게 바로 데이터 타입이다.

    Data Type
    • 데이터가 어떻게 표현되고 사용될지를 결정한다.
    • 데이터 타입에 따라 컴퓨터가 어떻게 데이터를 다룰지 알 수 있다.
    • 컴퓨터에 저장된 모든 값은 데이터타입에 의해서 표현될 수 있다.

    예를 들어보자.
    0000000001100111

    위의 데이터는 컴퓨터 메모리 어딘가에서 찾아낸 16비트의 패턴이다. 이것은 어떻게 표현될 수 있을가 ?

    만약 위의 데이터 타입을 자바에서 사용하는 데이터 타입중의 하나인 short라고 정의 한다면, 이 값은 103으로 표현될 것이다.
    문제
    다음 16비트 패턴은 어떻게 표현될 수 있는가.
    0000000000000000

    많은 종류의 데이터 타입이 있다.

    0000000000000000 비트 패턴은 0 (zero)로 표현될 수 있을 거라고 생각할 것이다. 그러나 항상 그런건 아니며, 우리가 보기에 그 용도가 명확해 보이는 비트패턴이라도 자동적으로 그 의미를 결정할 수는 없다. 프로그래머인 인간이 일일이 결정해주어야 한다.

    만약 위의 비트패턴을 위한 데이터 타입을 short로 했다면, 비트패턴의 값은 숫자 0으로 표현될 것이다. 여기에 또다른 패턴이 있다.
    1111111110011001
    short로 표현될경우 -103이 될 것이다.

    기 본적으로 컴퓨터의 메모리에 있는 데이터는 무한히 많은 형식으로 표현이 될 수 있다. 표현할 수 있는 데이터 타입이 무한히 많다면, 유연하겠지만 프로그램을 작성하기에 너무 복잡할 것이다. 반면 데이터 타입이 너무 적다면, 프로그램이 간단해지긴 하겠지만, 활용범위가 너무 좁아질 것이다. 그래서 너무 많지 않은 수준에서 프로그래머가 사용하기에 적당한 데이터 타입이 준비되어야 한다.

    그러나 모든 기계가 다양한 데이터 타입을 준비해야 하는 건 아니다. 간단한 전자 계산기라면, 단지 부동소숫점을 가진 숫자위한 하나의 데이터 타입만 존재하면 될것이다. 전자 계산기를 디자인 하는 엔지니어는 비트패턴이 어떻게 숫자로 표현될지를 결정하기만 하면 된다. 우리가 사용하는 컴퓨터는 특수한 용도가 아닌 범용기계이기 때문에 전자 계산기보다는 다양한 종류의 데이터 타입이 필요해진다.
    문제
    1960년대에 오디오 데이터를 다룰 수 있는 기능을 가진 컴퓨터가 있었을까 ?

    Primitive Data Type

    1960년대에도 오디오 데이터를 다루는 컴퓨터가 있었다. 그러나 이것은 비트패턴을 오디오 데이터로 표현하기 위한 전용의 프로그램이 필요했다.

    이 렇게 자신만의 독특한 방법을 가지고 비트배열을 표현하는 식으로 데이터를 이용하는 것은 좋지 않은 방법이다. 범용성을 크게 해치기 때문이다. 가능하면 퍼즐을 맞추듯이 몇개의 기본적인 구성요소만을 가지고, 원하는 것을 만들 수 있는 모델을 사용하는게 훨씬 유리하다. 자바는 데이터를 표현하기 위한 가장 기본적인 몇가지 내장된 데이터 타입을 가지고 있다. 이것을 primitive data type라고 한다. 자바는 8개의 primitive 데이터 타입을 가지고 있다.

    byte short int long float double char boolean

    대소문자를 반드시 구분하기 바란다. byte는 primitive 데이터 타입이지만 BYTE는 아니다. 몇개의 예외도 있지만 대부분의 컴퓨터 언어는 대소문자를 엄격히 구분한다.

    primitive data type에서 primitive는 "다른 커다란 데이터를 조합하기 위해서 사용되는 기본이 되는 구성요소"라는 뜻으로 컴퓨터 과학에서 매우 자주 사용된다. 아주 큰 문제를 풀 경우라도 하더라도, 기본적으로는 이 8개의 primitive 데이터 타입과 이들의 연산을 통해서 이루어진다.

    문제
    Int는 primitive 데이터 타입인가.?

    Objects (객체)

    자바는 내부적으로 많은 종류의 데이터 타입을 내장하고 있다. 그리고 프로그래머의 필요에 따라서 새로운 데이터 타입을 만들 수 있도록 지원하고 있다. 어쨋든 자바에서 다루는 모든 데이터는 원시 데이터 타입객체두개의 분류중 하나에 속한다. 일단 우리는 원시 데이터 타입에는 8개의 종류만 있다는 것을 알고 있다. 그러니 나머지 데이터 타입은 모두 객체라고 볼 수 있을 것이다.

    dataSplit.gif

    자바에서 객체는 매우 중요한 요소로 몇장의 장을 할애해서 설명을 하겠지만, 일단은 간단히 다루도록 하겠다. 다음은 원시 데이터 타입과 객체의 차이점이다.
    • 원시 데이터 타입은 값이 작고 바이트의 크기가 고정되어 있을 때 사용한다.
    • 8개의 원시 데이터 타입만이 존재한다.
    • 프로그래머는 새로운 원시 데이터 타입을 생성할 수 없다.
    • 객체는 많은 메모리 바이트를 사용하는 큰 데이터블럭을 위해서 사용한다.
    • 객체는 많은 구성요소로 이루어진다.
    • 객체 데이터 타입은 class라고 부른다.
    • Java Development kit에는 유용하게 사용할수 있는 많은 클래스가 미래 정의되어 있다.
    • 프로그래머는 프로그램의 요구에 따라 새로운 클래스를 생성할 수 있다.

    원시 데이터 타입은 너트나 볼트와 같은 것으로 볼 수 있다. 반면 객체는 엔진 혹은 자동차와 같은 (너트오 볼트로 구성된)완전한 기계다. 우선은 이정도로 알고 넘어가도록 하자. 몇장만 더 읽다 보면 자세한 내용을 다룰 것이다.
    문제
    컴퓨터 프로그램에서 숫자는 중요한 기본이 되는가?

    숫자형 원시 데이터 타입

    Number(숫자)는 자바에서 매우 중요하며, 3개의 원시 데이터 타입중에서 6개가 숫자와 관련된 데이터 타입이다.

    이들 숫자 데이터 타입에서도 가장 기본이 되고 (널리 사용되는) 타입은 크게 integerfloating point 로 나뉜다.. integer 타입은 소숫점이 없는 정수숫자를 위한 타입이며, floating point는 소숫점을 가진 데이터 타입이다. 컴퓨터는 정수를 위한 비트패턴을 유지할 수 있지만, 소숫점을 가진 숫자의 비트패턴을 알 수가 없으므로, 프로그램 수준에서 다시 해석해야 한다. 이런 이유로 integer 와 float 를 표현하는 방식은 완전히 다르다.

    • 정수형 원시 데이터 타입들
      Type Size 범위
      byte 8bits -128 ~ +127
      short 16bits -32768 ~ 32767
      int 32bit 약 -20억 ~ 20억
      long 64bit 약 -10E18 ~ +10E18

    • 부동소숫점 원시 데이터 타입들
      Type Size 범위
      float 32bit -3.4E+38 to +3.4E+38
      double 64bit -1.7E+308 to 1.7E+308

    각 원시 타입은 고정된 bit크기를 가진다. 이는 표현할 수 있는 숫자의 크기에 한계를 가진다는 얘기가 된다. 예를 들어 short타입은 16비트의 크기를 가지며, 약 30,000 정도의 숫자를 표현할 수 있다.

    가장 큰 숫자를 담을 수 있는 데이터형은 64비트의 크기를 가지는 long으로 10^18 정도의 큰 수를 표현할 수 있다.

    또 한 이들 데이터들은 음수와 양수를 모두 표현할 수 있도록 되어 있다. 여러분이 이들 데이터 타입의 범위를 뛰어넘는 숫자를 표현해야 한다면, 이들 데이터 타입을 이용할 수 없다. 이럴 경우에는 더 큰 숫자를 처리할 수 있는 클래스를 만들어야 한다.

    문제
    1,0234,004를 다루기 위한 프로그램을 작성하고자 한다. 데이터 타입을 위해서 short를 사용할 수 있는가 ?

    큰 값을 다루기 위해서는 많은 비트가 필요하다

    큰 범위의 숫자를 다루기 위해서는 그만큼 많은 비트를 필요로 한다. 당신은 프로그램을 작성할 때 사용할 숫자의 범위를 예측해서 거기에 맞는 데이터형을 사용할 필요가 있다. 예를 들어서 나이를 입력받는 프로그램을 작성한다면 byte형이면 충분할 것이다. 물론 long 형을 사용할 수도 있긴 하지만, 다루어야할 비트의 크기가 커진만큼 메모리의 소비량과 수행속도에 있어서 손해를 볼 것이다.

    최근의 프로그램들은 수백만 수천만의 데이터 아이템을 다룬다. byte로 충분한걸 long으로 썼을 경우 고작해야 6바이트 정도일 수 있겠지만, 백만 데이터를 다루어야 한다고 가정하면, 6백메가의 낭비가 발생하게 된다.

    당신은 프로그램을 쓸때, 숫자가 어떤 비트 타입으로 들어갈지를 결정해줘야할 필요가 있다. 이것을 literal이라고 부른다. "literal"은 타이핑한 값이 프로그램의 일부로 그대로 들어가게 됨을 의미한다. 예를 들어서, 다음의 숫자들은 4byte int형 숫자로 표현될 것이다.
    125 -32 16 0 -123987

    그렇지만 long형 숫자를 입력하기 원한다면 숫자의 마지막에 'L' 혹은 'l'을 붙여줘야 한다. 그러면, 이 숫자 데이터는 long형으로 해석되어서 비트값으로 저장된다.
    125L -32L 16L 0l -123987l

    문제
    다음은 integer literal 인가 ?
    197.0


    Floating Point Type

    프로그램에서 197.0을 그대로 사용하게 되면, 컴파일러는 이 숫자를 floating point원 시 데이터 타입으로 사용하게 된다. 그래서 메모리 상에는 197.0의 floating point 비트 패턴이 들어가게 된다. 이 비트 패턴은 197과는 전혀 다르다. floating point는 두개의 원시 데이터 타입을 가지고 있다.

    float 데이터 타입은 "single-precision floating point"라고 불리우기도 한다. double데이터 타입은 "double-precision floating point"라고 부른다. 이들 데이터 타입은 자주 쓰이는 프로그래밍 언어중 하나인 FORTRAN에서 유래되었다.

    프로그램에서 floating point literals는 소숫점을 표시함으로써 이루어진다.
    123.0 -123.5 -198234.234 0.00000381

    Literal 정책에 의해서 위의 값들은 자동적으로 double타입으로 들어가게 된다. 거의 대부분의 경우 floating point 숫자는 double로 다루게 됨으로 큰문제가 없을 것이다. 만약 floating point 숫자를 32bit float형으로 다루기를 원한다면, 숫자의 마지막에 특별한 접미사를 붙여줘야 한다.

    문제
    double 대신 float 를 사용하게 될경우, 메모리상의 비트패턴에 큰 변화가 있는가 ?

    Explict Floating Point Literals

    그렇다면 float literal은 어떻게 적용시킬 수 있는가. 이 문제는 숫자의 접미사에 F 혹은 f를 붙여주는 것으로 해결할 수 있다.
    123.0f -123.5F -198234.234f 0.00000381F

    기본적으로 소숫점 데이터는 double literal되지만, 이를 명확히 해주고 싶을 수가 있는데, 이 경우 접미사로 D 혹은 d를 붙여주면 된다.
    123.0d -123.5D -198234.234d 0.00000381D

    문제
    다음 코드는 문제가 있다고 생각이 들지 않는가 ?
    double rats = 8912D;

    Scientific 표시

    다음 두 경우를 보도록 하자.
    double rats = 8912 ;과double rats = 8912.0 ;
    첫 번째 코드는 수행은 될것이다. 그러나 부주의한 코드다. integer literal이 double에 대입하기 위해서는 반드시 그에 맞도록 변환시켜주어야 한다. 그러므로 첫번째 코드는 두번째 코드처럼 double literal이 적용되도록 값을 초기화 시켜주어야 한다.

    때때로 과학표기가 필요한 경우가 발생할 것이다. 다음의 예는 모든 double-precision literals에 적용된다.
    1.23E+02 -1.235E+02 -1.98234234E+05 3.81E-06
    E는 10승을 하라는 의미다. 1.23E+02는 1.23에 10^2을 곱해주라는 의미가 된다.

    이 밖에도 E는 소숫점의 위치를 간편하게 나타내기 위한 목적으로 사용할 수 있다. 만약 E뒤에 붙은 기호가 양수라면 소숫점을 오른쪽으로, 음수라며 왼쪽으로 숫자만큼 이동시키면 된다. 즉 3.81E-06은 0.00000381 과 같다.

    문제
    1.9345E+03을 과학표기가 아닌 일반 표기로 바꾸어 보라

    Floating Point Number의 정확도

    1/3은 다음과 같은 결과를 보여준다는 것을 잘 알것이다.
    0.33333333333333333333333..........
    3이 무한대로 반복되는 값을 보여준다. 그러나 float형은 32bit 데이터 타입이므로 3을 무한대로 표시할 수는 없다.

    float데 이터 타입은 23 bit의 정확도를 가진다. float는 32비트 데이터 형이 아니던가? 라는 생각이 들 것이다. 32비트에서 1비트는 양수인지 음수인지를 판단하기 위해서 쓰이며, 나머지는 숫자의 크기를 나타내기 위해서 사용된다. 23bit의 정확도는 대략 7-8자리까지에 한정된다.

    문제
    1230.00089F 는 정확히 표현될 수 있는가.?

    Double 형의 정확도

    float 는 7-8자리에 대한 정확도만을 보장한다. 그런데 1230.00089는 소숫점을 제외하고 모두 9개의 숫자를 가지고 있다. 그래서 마지막 9가 반올림되어서 1230.0008F이 저장된다. 아래의 프로그램을 컴파일 한 후 테스트 해보기 바란다.
    import java.io.*;
    class Test
    {
     public static void main(String[] args)
     {
     float a = 1230.00089F;
     System.out.println("Data "+String.valueOf(a));
     }
    }

    double은 64bit를 이용한다. 그래서 float보다 더큰 -1.7E+308 to +1.7E+308 범위의 숫자를 저장할 수 있으며, 15자리까지의 정확도를 보장한다. 자바 프로그램에서 2.345와 같은 literal을 적용시켰다면, 이것은 자동적으로 double로 간주된다. 그러므로 float형으로 충분하다고 판단되면 직접 literal을 적용시켜줘야 한다. 위의 프로그램에서 1230.00089를 정확히 제어하기 위해서는 다음과 같이 프로그램을 수정해야 할 것이다.
    double a = 1230.00089D;

    문제
    8개의 원시 데이터 타입중 하나로 문자를 다룰 수 있을까?

    char 원시 데이터 타입

    http://chortle.ccsu.edu/java5/Notes/chap08/ch08_13.html

    문자는 컴퓨터에서 일반적으로 사용되는 데이터이다. 문자를 위한 원시 데이터 타입의 이름은 char이 다. char 타입은 16비트의 크기를 가진다. C와 같은 언어가 8비트의 크기를 가지는 것과는 약간다르다. 16비트를 가지게 됨으로 인해서 데이터량이 커지긴 했지만 대신 더 많은 다양한 언어들을 표현할 수 있게 되었다. 실제 자바는 유니코드를 이용함으로써 세상의 거의 대부분의 언어를 표현할 수 있다.

    다음은 16비트 패턴의 예이다.
    000000000110011
    위의 값은 16비트 char형으로 표현될 경우 문자 'g'를 나타낸다. 만약 이것을 integer형으로 표현하면 103이 될것이다. 실제로 integer 데이터 타입에는 16비트 크기를 가지는 short데이터 타입이 있다.

    char 데이터는 대소문자를 엄격히 구분하며, 서로 다른 비트 패턴을 가지고 있다. char데이터 타입에는 구둣점이나 쌍따움표, 공백문자, 탭과 같은 특수문자들도 포함된다.

    원시 데이터 타입 char은 단일 문자를 표현할 수 있으며, 폰트와 같은 다른 어떤 정보도 포함하지 않는다. 그러나 대부분의 경우 단일 문자만을 사용하는 프로그램이 드물기 때문에, char데이터를 포함하는 객체를 이용해서 문자열 단위로 사용하게 된다.

    문제
    다음 3개의 데이터는 서로 다른가 ?
    0 O o

    Character Literals

    프로그램에서 문자 literals는 따움표로 둘러싸는 것으로 나타낸다.
      'm'     'y'     'A'
    알파벳과 같은 일반 문자외에 줄이나 탭을 바꾸는 제어 문자도 존재하는데 이들은 역슬레쉬 문자와 함께 사용된다.
      '\n'    '\t'

    비 록 두개의 문자가 사용된 것으로 보이겠지만, 실제 프로그램에서는 단일 문자로 사용이된다. 역슬레쉬는 단지 컴파일러에게 제어문자를 사용하겠다는 것을 알려주기 위한 목적으로만 사용된다. 첫번째 문자는 줄을 바꾸기 위해서 사용되는 개행문자 이며, 두번째 문자는 문자와 문자사이를 일정간격으로 구분하기 위해서 사용되는 탭문자다.

    주의 : 아래의 데이터는 문자 literal 이 아니다.
    "Hello"
    쌍따움표가 사용된 데이터는 String이며, 이것은 원시 데이터 타입이 아닌 객체다.

    문제
    아래의 char literal은 무엇이 잘못되었는가

    "W"

    boolean 원시 데이터 타입

    이제 boolean 원시 데이터 타입에 대해서 알아보겠다. 이것은 참/거짓 (true/false)를 나타내기 위해서 사용하는 데이터 타입으로 아래의 두개의 상태중 하나만 가질 수 있다.
    true false

    자바 프로그램에서 truefalse라는 단어는 boolean값을 의미한다. boolean이라는 이름은 true/false의 값만으로도 많은 것을 할 수 있다는 것을 발견해낸 19세기 과학자인 George Boole에 의해서 만들어졌다.
    :::
    2007/04/17 01:23

    번역]컴퓨터사이언스with자바 6장 자바프로그램 만들기

    원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Java/Documents/ComputerScienceUsingJava/Chapter06
    이전장에서 자바프로그램이 만들어지고 실행되는 과정에 대해서 알아보았다. 이번 장에서는 간단한 예제 프로그램을 통해서 자바 프로그램이 샐행되는 과정을 좀더 자세히 알아보도록 하겠다.

    다룰 내용들은 다음과 같다.
    • 간단한 예제 프로그램들의 작성
    • 소스파일과 클래스 파일의 이름
    • Syntax 에러 (문법 에러)
    • 버그
    • 편집, 컴파일, 실행의 사이클
    • Matching braces
    • Neat indenting

      문제
      다음 중 자바프로그램이 실행되기 위해서 필요한 파일은 무엇인가.
      • 소스 코드 파일
      • 바이트코드 파일

    예제 소스 프로그램

    이전장에서 다룬 소스프로그램을 가지고 설명하도록 하겠다. 이 프로그램은 모니터에 Hello World!'를 출력하는 일을 한다.
    class Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello World!");
    }
    }

    이 파일은 반드시 Hello.java로 클래스의 이름과 같아야만 한다. 많은 컴퓨터 시스템이 파일이름의 대소문자를 구분하기 때문에, 대소문자도 분명히 구분해서 파일이름을 만들도록 하자. 소스 프로그램의 첫번째 라인을 보자
    class Hello

    이 소스프로그램은 Hello라는 클래스명으로 정의가 된다. class는 프로그램의 section을 결정한다. 작은 프로그램은 단지 하나의 클래스로 구성이 되기도 한다. 이 프로그램을 컴파일 하면, 컴파일러는 Hello.class라는 바이트코드 파일을 생성한다.

    모든 클래스는 하나 이상의 여러 라인으로 구성이 되며, 클래스의 시작과 끝을 알리기 위해서 {}이 사용된다.

    클래스의 이름은 반드시 알파벳과 숫자로 작성이 되어야 하며, 첫자는 알파벳을 사용해야만 한다. 이름의 중간에 공백등이 포함되면 안된다. 필수사항은 아니지만 관습적으로 클래스의 첫자는 대문자를 사용하는 경우가 많다. 확장자 이름은 소문자로 .java를 사용하면 된다.

    문제
    첫라인이 다음과 같은 자바 소스 프로그램이 있다.
    class AddUpNumbers

  • 소스파일의 이름은 무엇인가
  • 컴파일된 바이트코드 파일의 이름은 무엇인가.

  • Between the Braces

    위에서 다룬 자바 프로그램은 다음과 같은 구성을 가지고 있다.
    class Hello
    {
    ...
    }

    클래스는 {로 시작하고 }로 끝을 맺으며, 모든 내용은 이들 괄호 사이에 존재한다. 지금은 단지 하나의 클래스만 가지는 간단한 프로그램만 다루고 있지만, 나중에는 여러개의 클래스를 가지는 프로그램도 다루게 될 것이다.
    class Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello World!");
    }
    }

    이 예제 프로그램은 Hello World!를 모니터에 출력한다. 정말로 간단한 프로그램이지만, 여기에는 자바 프로그램을 이해하기 위한 중요한 많은 요소들을 포함하고 있다. 첫번째 라인을 살펴보자.
    public static void main(String[] args)
    프로그램이 시작되는 지점이다. mainmain method라고 불리우는데, 자바 가상 머신이 프로그램을 실행시키는 지점이 된다. 모든 자바 프로그램은 실행이 되기 위해서 반드시 하나의 main 메서드를 가지고 있어야만 한다.
    문제
    다음은 main 메서드는 문제가 없는가 ?
    public static void main(Stringp[] args)

    println

    http://chortle.ccsu.edu/java5/Notes/chap06/ch06_4.html

    예제 프로그램을 다시한번 살펴보도록 하자.
    ass Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello World!");
    }
    }
    이 프로그램의 메인 메서드는 다음과 같은 한줄의 코드를 포함하고 있다.
    System.out.println("Hello World!");

    이 코드는 쌍따움표 안에 있는 문자를 컴퓨터 시스템의 모니터에 출력하는 일을 한다.

    "Hello World!" 와 같이 문자가 연속되어있는 것을 string (혹은 문자열)이라고 부른다. 이 프로그램을 string를 모니터에 출력하고 프로그램을 종료시킨다.

    문제
    소스를 포함한 Hello.java 파일을 만들도록 하자. 이 프로그램을 실행시키기 위해서는 2가지 과정을 거쳐야 한다. 이에 대해서 논하라.

    자바 프로그램의 실행 과정 다시보기

    프로램을 실행시키기 전에 우선, 현재 작업중인 디렉토리에 소스파일이 있는지 확인해야 한다. 그래야 컴파일과 인터프리터 명령이 제대로 수행될 수 있다. 많약 다른 디렉토리에서 작업을 한다면 File Not Found와 같은 에러 메시지를 보게 될 것이다. 파일의 확인은 ls 명령을 이용하면 된다.
    # cd /home/java 
    # ls *.java
    Hello.java
    만약 파일이 존재하지 않는다면 다음과 같은 에러메시지를 출력할 것이다.
    # ls *.java
    ls *.java: 그런 파일이나 디렉토리가 없음

    파일이 존재하지 않는다면 cd(1) 명령을 이용해서 소스파일이 있는 디렉토리로 이동하도록 하자. 그 후 javac를 이용해서 컴파일을 하고, 컴파일된 바이트코드를 java인터프리터로 실행시키면 된다.
    # javac Hello.java
    # java Hello
    Hello World!
    #

    문제
  • 자바 컴파일러를 실행시키기 위한 명령은 ?
  • 자바 인터프리터를 실행시키기 위한 명령은 ?

  • 문법 에러

    아래의 소스 프로그램을 그대로 copy&paste 해서 Hello.java 로 저장한 후 컴파일 해보도록 하자.
    Class Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello World!");
    }
    }
    아마도 다음과 같은 에러메시지를 보게 될 것이다.
    # javac Hello.java
    Hello.java:1: 'class' or 'interface' expected
    Class Hello
    ^
    1 error
    소스 코드는 이전의 코드와 동일해 보이지만 class의 첫자가 대문자C로 변경되었음을 알 수 있다. 이렇게 오타나 혹은 문법이 잘못된 것을 syntax error (문법에러)라고 한다.

    컴파일러는 소스코드를 바이트코드로 변환하려고 하지만 Class라는 알 수 없는 문법을 만나게 된다. 컴파일러는 이경우 어떻게 변환해야 할지 알 수 없기 때문에, 에러메시지를 출력하는 것이다. 소스코드에 이러한 문법에러가 존재하는 한 절대로 바이트코드를 만들어 낼 수 없다.
    문제
    위의 예제 코드를 바이트코드가 만들어 지도록 수정해 보라.

    문법에러 수정

    Hello.javavi로 열어서 ClassC를 소문자로 변경한다음 저장한다. 이제 문제 없이 컴파일 될 것이다.

    편집, 컴파일, 실행 주기

    이번 장에서 당신은 당신이 만든 프로그램을 제대로 실행시키기 위해서 다음과 같은 주기를 거쳐야 한다는 것을 알게 되었다.
    1. vi를 이용해서 프로그램을 편집한다.
    2. 프로그램을 하드디스크에 저장한다.
    3. javac명령을 이용해서 프로그램을 컴파일 한다.
    4. 만약 문법에러 등으로 컴파일이 되지 않는다면 1번으로 되돌아 간다.
    5. java명령을 이용해서 프로그램을 실행한다.
    6. 제대로 실행되지 않는다면 1번으로 되돌아간다.
    7. 제대로 실행되면, 주기를 종료한다.

    이것을 edit-compile-and-run 주기라고 한다. 하나의 프로그램을 작성하기 위해서는 이 주기를 몇번씩 순환해야 할 것이다. eclipse와 같은 자바 프로그램 개발환경을 이용하면, 이 주기를 숨길 수 있지만 (개발환경이 뒤에서 처리해 준다), 기본 주기는 변하지 않는다. 이 주기는 다른 언어를 이용한 개발에도 거의 동일하게 적용된다.

    문제
    주기의 3번째 차례에서 소스 프로그램의 컴파일이 성공했다면, 프로그램이 제대로 실행 될 것이라는 걸 의미하는가 ?

    버그

    프로그램이 제대로 컴파일 되고 실행되었다고 해서, 프로그램이 제대로실행되는 것은 아니다. 예를 들어서, 당신이 술을 마신상태에서 소스프로그램을 만든 다면 다음과 같은 소스 프로그램을 만들어 낼 수도 있다.
    class Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello Neptune!");
    }
    }

    이건 문법에러가 아니기 때문에, 컴파일되고 실행이 될 것이다. 그러나 Hello Neptune라는 얘기치 않은 string를 출력하게 된다. 이렇게 프로그램의 실행도중에 발생하는 얘기치 않은 문제를 bug 라고 한다.

    문제
  • 이 프로그램은 문법에러 없이 컴파일 되는가 ?
  • 이 프로그램은 실행되는가 ?
  • 이 프로그램은 원하는 결과를 보여주는가 ?

  • 긴 프로그램의 작성

    버그 없는 프로그램을 만드는 것은 거의 불가능하다. 아주 단순한 프로그램이라고 하더라도 몇개의 버그를 가지고 있을 수 있다. 문제는 심각한 버그인가 아닌가 하는 것이다. 프로그램의 크기가 커지면 당연히 더 많은 버그가 생길 수 있으며, 매우 주의 깊게 프로그램을 작성해야 한다. 문법오류와 버그는 많은 연습을 통해서 어느정도 줄일 수 있다. 또한 경험 많은 프로그래머는 찾기 어려운 버그도 쉽게 찾아낸다.

    다음은 좀더 긴 예제 프로그램이다.
    class Emily
    {
    public static void main ( String[] args )
    {
    System.out.println("A bird came down the walk:");
    System.out.println("He did not know I saw;");
    System.out.println("He bit an angle-worm in halves");
    System.out.println("And ate the fellow, raw.");
    }
    }
    이 프로그램을 Emily.java로 저장하고, 컴파일 한 후 실행하고 결과를 확인해 보도록 하자.

    문제
    위 예제 프로그램의 실행결과를 예상해보라.

    다른 예제

    마지막으로 다음과 같은 string를 모니터에 출력하는 프로그램을 직접 만들어 보도록 한다.
    On a withered branch
    A crow has just alighted:
    Nightfall in autumn.

    아래의 빈칸을 채워서 완성하면 된다.
    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println(_______________________________);
    System.out.println(_______________________________);
    System.out.println(_______________________________);
    }
    }

    문제
    위 프로그램을 완성한다음 실행시켜 보도록 하자.

    프로그램의 종료

    여기에 완전한 프로그램이 있다. 이 프로그램은 상따움표 안에 있는 string를 출럭한다. 아래의 코드를 에디터를 통해서 입력할 때, 오타만 없다면 문제 없이 컴파일되고 실행될 것이다.
    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println("On a withered branch");
    System.out.println("A crow has just alighted:");
    System.out.println("Nightfall in autumn.");
    }
    }

    예제 프로그램을 입력하다보면, 여러개의 스페이스문자를 사용하거나 여러개의 개행문자를 입력할 수 있을 것이다. 그러나 이것들은 컴파일하는데 문제를 일으키거나 하지는 않는다. 아래의 예를 보기 바란다.
      class     Haiku{
    public static void main(String[] args )
    {
    System.out. println( "On a withered branch");
    System . out.println("A crow has just alighted:" );
    System.out.println("Nightfall in autumn.");
    }}
    코드가 꽤 난잡해지긴 했지만, 컴파일러는 무사히 코드를 번역해서 바이트코드를 생성해 낼 것이다. 인간의 눈에 보기에는 난잡한 코드지만, 위의 코드와 완전히 동일한 바이트 코드를 생성해 낸다.

    비록 자바 컴파일러 입장에서는 스페이스나 개행문자를 별로 신경쓰지 않는다고는 하지만 소스 프로그램은 사람이 보기 좋게 작성해야할 필요가 있다는 것을 염두에 두기 바란다.

    문제
    프로그램에 사소한 실수가 있을 경우, 쉽게 문제를 찾아낼 수 있는가 ?

    주석

    주석 (comment)는 프로그램에 인간만이 해석하도록한 일종의 표시다. 아래의 프로그램은 주석을 사용한 예이다.
    // Write three lines of a poem to the computer monitor
    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println("On a withered branch" );
    System.out.println("A crow has just alighted:");
    System.out.println("Nightfall in autumn.");
    }
    }
    // 이후의 라인은 인간만이 해석하라고 약속되어 있으므로, 컴파일러는 이 줄을 건너 뛰게 된다. 그러므로 주석을 사용하지 않은 코드와 완전히 동일한 바이트코드를 생성하게 된다. 자바 컴파일러는 주석은 해석하지 않고 건너 뛴다.

    문제
    주석은 바이트코드로 변환되는가?

    많은 주석의 작성

    주석은 프로그램의 코드를 설명하기 위해서 사용된다.
    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println("On a withered branch" ); // Write first line of the poem
    System.out.println("A crow has just alighted:"); // Write 2nd line of the poem
    System.out.println("Nightfall in autumn."); // Write 3rd line of the poem
    }
    }
    // 주석을 사용하면 // 표시뒤의 문자들이 모두 주석으로 처리된다. 그렇다면 여러라인의 줄을 동시에 주석으로 사용하고자 경우도 필요할 것이다. 이 경우에도 //로 처리가 가능하겠지만, 보통 /* */을 널리 사용한다.

    /* Program 1

    Write out three lines of a poem.
    The poem describes a single moment in time,
    using 17 syllables.
    */

    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println("On a withered branch" );
    System.out.println("A crow has just alighted:");
    System.out.println("Nightfall in autumn.");
    }
    }
    이건 주석의 또다른 스타일로 /* */사이에 있는 모든 문자들을 주석으로 처리한다. 이 스타일은 주석의 양이 많아질 때 유용하게 사용할 수 있다.

    문제
    왜 당신의 프로그램에 사용된 주석은 프로그램을 이해하는데 도움을 주는가?

    괄호문

    프로그램을 보면 코드들이 괄호에 둘러쌓여 있음을 알 수 있다.
    왼쪽괄호 
    {
    오른쪽괄호
    }

    예제 코드에서 첫번째 괄호는 클래스가 이제 시작됨을 나타내고, 두번째 괄호는 클래스가 여기에서 끝나고 있음을 알려준다. 또한 괄호는 그 안에 또다른 괄호를 둘 수가 있는데, 이 경우 메서드의 시작과 끝을 나타내기 위해서 사용한다.
    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println( "On a withered branch" );
    System.out.println( "A crow has just alighted:" );
    System.out.println( "Nightfall in autumn." );
    }
    }

    끝내며

    괄호는 시작괄호와 끝괄호가 서로 정확히 매칭 되어야 함을 기억하기 바란다. 이것은 ()와 같은 소괄호나, []등에도 그대로 적용된다. 이 괄호들은 프로그램에서 클래스나 메서드의 영역을 명확히 정의 하기 위해서 사용한다.
    class Haiku
    {
    public static void main ( String[] args )
    {
    System.out.println( "On a withered branch" );
    System.out.println( "A crow has just alighted:" );
    System.out.println( "Nightfall in autumn." );
    }
    }
    :::
    2007/04/17 01:08

    번역]컴퓨터사이언스with자바 5장 자바소개

    원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Java/Documents/ComputerScienceUsingJava/Chapter05

    Introduction to Java

    지금까지의 장들에 컴퓨터 하드웨어와 컴퓨터 소프트웨어, 비트와 바이트 , 기계어, 컴파일, 인터프리터 그리고 가상기계에 대해서 알아보았다. 이번장부터 우리가 알고자하는 자바에 대해서 본격적으로 다루게 될 것이다.

    이번장에서 다루는 내용들
    • Java 5.0 설치하기
    • Hello World 프로그램
    • Java 바이트코드
    • 편집기를 이용해서 소스프로그램 만들기
    • 자바 프로그램 실행하기

    이 문서는 Java 2 Standard Edition version JSE 5.0' 혹은 그 이상의 버전을 기준으로 작성되었다. 가능하면 이 버전을 이용해서 문서를 읽기 바란다.
    문제
    자바를 얻는데 얼마의 비용이 필요한가.

    자바 설치하기

    http://chortle.ccsu.edu/java5/Notes/chap05/ch05_2.html

    자바는 다음과 같은 컴퓨터 환경을 필요로 한다.
    • Windows XP
    • Windows 2000
    • 모든 버전의 Unix(리눅스와 솔라리스 포함)
    • Mac OS가 설치된 Apple 컴퓨터

    자바를 설치하기 위해서는 250메가 바이트 이상의 여유공간을 가진 하드디스크를 필요로 한다. 애플컴퓨터와 리눅스가 설치된 컴퓨터는 자바가 아마도 자바가 이미 설치되어 있을 것이다. 이 경우 오래된 버젼의 자바가 설치되어 있을 수도 있는데, 버전이 5.0 이상인지 확인하도록 하자.

    이 문서는 리눅스와 Java 5.0을 기준으로 작성할 것이다. 윈도우즈 환경에서 문서를 읽는다면 약간의 차이가 있을 수 있을 것이다. 그렇지만 언어자체에 있어서는 차이점이 없으니 큰 문제는 없을 것이다. 그렇다 하더라도 가능하면 리눅스를 설치하기 바란다.

    yundream 2007/01/21 20:51:12
    원래 이 문서는 윈도우즈 환경을 기준으로 작성되었지만, 제가 Linux 환경에서 모든 작업을 하는 관계로 리눅스를 기준으로 작성하게 되었습니다. 몇몇 부분은 리눅스와 윈도우즈 환경 모두에 대해서 설명을 할 수도있습니다.
    문제
    모뎀을 이용해서 자바를 다운로드 받을 수 있을까 ?

    자바 설치하기

    윈도우즈 환경 기준


    리눅스 환경

    http://java.sun.com/javase/downloads/index.jsp 에서 다운로드 받을 수 있다. RPM과 인스톨스크립트 두가지 방식으로 배포하는데, 여기에서는 인스톨스크립트를 기준으로 설명하도록 하겠다.

    인스톨 스크립트에 다음과 같이 실행권한을 주고 실행하도록 한다.
    # chmod +x jdk-6-linux-i586.bin
    # ./jdk-6-linux-i586.bin

    그러면 현재 디렉토리에 jdk1.6.0이란 디렉토리가 만들어지고, 이 밑에 자바프로그램들이 깔리게 된다. 이제 이 디렉토리를 적당한 위치로 옮기면 된다. /usr/local/java로 옮기도록 하자.
    # mv jdk1.6.0 /usr/local/java

    각종 자바 실행 프로그램들은 /usr/local/java/bin 밑에 설치가 된다.

    리눅스 운영체제는 환경변수 PATH에 지정된 경로에 대해서 실행파일을 찾는다. 그러므로 /usr/local/java/bin이 환경변수 PATH에 등록되어 있어야 여러가지 자바 프로그램들을 실행시킬 수 있다. 우선 설정되어 있는 PATH 변수에 어떤 경로가 지정되어 있는지 확인해 보도록 하자.
    $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11

    환경변수에 Java 실행경로가 지정되어 있지 않으니, 다음과 같은 방법으로 PATH에 추가시키도록 한다.
    # export PATH=$PATH:/usr/local/sbin

    패스경로가 제대로 지정되어 있는지 확인하기 위해서 직접 자바 프로그램을 실행시켜 보도록 하자.
    $ javac
    Usage: javac <options> <source files>
    where possible options include:
    -g Generate all debugging info
    -g:none Generate no debugging info
    -g:{lines,vars,source} Generate only some debugging info
    ...

    간단한 자바프로그램 작성

    자바 소프트웨어를 설치했으니, 이제 간단한 프로그램을 만들어 보도록 하자. 다음 프로그램은 컴퓨터 모니터에 Hello World!!!를 출력시키는 일을 한다. 자세한 설명은 나중에 하도록 하겠다.
    class Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello World!!!");
    }
    }
    프로그램은 vi와 같은 편집기를 통해서 작성하도록 하자. 만약 vi가 익숙치 않다면 노트패드와 비슷한 환경을 제공하는 kate, gedit와 같은 프로그램을 사용할 수 도 있다. 다음은 kate에디터를 이용한 편집 화면이다. 가능하면 vi를 이용하는게 여러모로 편할 것이다.
    보내는 사람 Java

    이제 이 소스 프로그램을 하드디스크에 파일 형태로 저장하도록 하자. 파일의 이름은 Hello.java로 한다. 반드시 이 이름으로 저장해야 한다는 점에 주의 하도록 한다.

    소스 프로그램은 텍스트 파일로 프로그래밍 언어로 씌여진 문자들을 포함한다. 이 파일은 문자 정보들을 가지고 있기 때문에 컴퓨터 시스템에 의해서 바로 실행될 수 없다.

    문제
    소스 프로그램이 컴퓨터 시스템에서 실행되기 위한 두가지 방법을 나열하시오.

    ByteCodes

    소스 프로그램은 Translation과정과 Interpretation두 가지 방식을 통해서 실행될 수 있다. 자바는 두가지 방법을 결합해서 사용한다. 자바 소스 프로그램은 실행되기 전에 bytecodes로 변환 (translated)이 된다.
    자바 바이트코드는 자바 프로세서를 위한 machine instruction이다. 즉 가상의 기계를 만들고 그 위에서 가상의 기계를 위한 바이트 코드를 해성하는 방식이다. 이 자바로된 가상기계를 보통 자바가상머신이라고 부른다.
    이러한 디자인은 자바가상머신이 설치되어 있다면, 컴퓨터 프로세스나 운영체제의 종류에 관계없이 프로그램이 실행될 수 있다는 장점을 가진다.

    자바 프로그램은 자바 프로세서 위에서 작동을 한다. 그러므로 우리는 소스 프로그램을 바이트코드로 변환해야만 한다. 아래의 그림은 Hello.java가 바이트코드로 변환되는 과정을 보여주고 있다. 변환된 바이트 코드는 Hello.class라는 이름의 파일로 하드디스크에 저장된다.

    Figure05-1.gif

    그림에서 소스 프로그램인 Hello.Javajavac라는 프로그램에 넘겨진다. javac는 소스프로그램을 바이트코드로 변환하기 위한 컴파일러(translator)로 소스프로그램을 바이트코드로 변환해서 Hello.class라는 이름의 파일로 저장한다.

    자바 컴파일러는 Intel System 이든지, Macintosh 시스템이든지에 관계 없이 동일한 바이트코드를 만들어내며, 이러한 특징으로 Intel 컴퓨터에서 만들어진 바이트코드라 할지라도 다른 종류의 컴퓨터에서 그대로 실행될 수 있다.

    문제
    당신의 컴퓨터에 자바 프로세서가 설치되어 있다면, 바이트코드로 된 프로그램을 실행시킬 수 있습니까 ?

    Java Virtual Machine

    http://chortle.ccsu.edu/java5/Notes/chap05/ch05_10.html

    여러분이 자바 프로세서라는 하드웨어를 가지고 있는 건 아니다. 여러분은 PC 혹은 Apple 컴퓨터를 가지고 있을 뿐이다.

    여기에서 확실해 해 두어야 할 것은 자바 프로세서는 하드웨어가 아닌 소프트웨어라는 점이다. 이 소프트웨어는 소스 프로그램을 읽어 들여서 바이트코드로 변환하는 일을 한다. 이렇게 변환된 자바 바이트코드는 자바 interpreter에 의해서 실행이 된다. 다음은 이러한 과정을 보여주는 그림이다.

    Figure05-2.gif

    그림에서 Java Interpreter는 컴퓨터 시스템에서 실행되는 프로그램이며, 각각의 컴퓨터 시스템 마다, 거기에 맞는 자바 인터프리터를 가지고 있다. Actual Processor은 컴퓨터 프로세서의 하드웨어 칩이다.

    자바 인터프리터는 컴퓨터 시스템 위에서 작동하는데, 하드웨어 프로세서 처럼 자바 바이트코드를 번역한다. 이렇게 기계처럼 작동하는 특징 때문에, 이것을 자바 가상 머신 혹은 자바 가상 기계라고 부른다.

    자바 인터프리터가 설치되어 있다면, 컴퓨터의 종류에 관계없이 자바 바이트코드를 실행할 수 있다. 이것은 자바 인터프리터가 컴퓨터 시스템에 맞도록 만들어져있기 때문이다.

    문제
    새롭게 구입한 애플컴퓨터에서 자바 프로그램을 실행시킬려고 한다. 이때 필요한 것은 무엇인가 ?

    Portability

    애플컴퓨터가 인터프리터를 가지고 있다면, 모든 자바프로그램을 실행시킬 수 있다. 여기에는 다른 어떤 프로그램도 필요하지 않다.

    컴퓨터의 종류에 관계없이 동일한 바이트코드 프로그램을 실행시킬 수 있다는 이런 점 때문에, 자바 프로그램을 Portable 하다고 말한다. 또한 소스 프로그램역시 자바 컴파일러가 설치되어 있다면, 어디에서든지 바이트 코드를 생성해 낼 수 있다. 역시 동일한 소스 프로그램을 어떠한 변경도 하지 않고 다른 컴퓨터에서 그대로 사용할 수 있다.

    컴퓨터나 운영체제의 종류에 따라서 프로그램이 실행되거나 실행되지 않는 다른 프로그래밍언어에 비해서 자바가 가지는 두드러진 특징이라고 할 수 있다.

    문제
    바이트코드를 인터넷을 통해서 다른 컴퓨터로 전송할 수 있는가 ?

    Applets

    applet는 웹브라우저에서 실행되는 자바 바이트코드 프로그램이다. 최신의 모든 웹 브라우저는 자바 인터프리터를 포함하고 있다. 웹브라우저를 통해서 웹페이지를 호출하게 되면, 웹서버 컴퓨터는 웹 페이지와 함께 자바 바이트코드를 넘겨준다. 그러면 웹브라우저에 내장된 인터프리터가 자바 바이트코드를 실행하게 된다.

    애플릿은 실시간 상호작용이 가능한 유저 인터페이스, 그래픽, 애니메이션등을 위해서 사용한다. 애플릿에 대한 자세한 내용은 후반에 다루도록 할 것이다. 웹 브라우저에서 실행되는 애플릿과 달리 당신의 키보드를 통해서 입력을 받고 그 출력결과를 모니터에 출력하는 프로그램을 자바 프로그램이라고 한다. 자바 프로그램은 자바 애플리케이션 프로그램이라고 부르기도 한다.

    문제
    자바는 애플릿과 자바 프로그램을 만들기 위해서 같은 방법을 사용하는가 ?

    자바 소스 프로그램의 작성

    이제 vi 에디터를 이용해서 Hello.java 프로그램을 만들어 보도록 하자. 이 소스 프로그램은 다음과 같은 문자들을 포함하고 있다. 키보드로 부터의 입력을 전달하기 위해서, 리눅스는 터미널 프로그램을 제공한다. xterm 과 konsole와 같은 프로그램들로, 이들 프로그램을 실행시키면 아래와 같은 창이 뜨고, 프롬프트를 이용해서 사용자의 입력을 대기하게 된다.

    konsole.jpg

    vi 로 Hello.java 파일 열기
    # vi Hello.java

    Hello.java 파일의 내용
    class Hello
    {
    public static void main ( String[] args )
    {
    System.out.println("Hello World!");
    }
    }

    최근의 리눅스 운영체제는 윈도우즈와 마찬가지로 GUI 화면을 제공해 주므로, 메뉴를 브라우징해서 터미널 프로그램과 같은 응용 프로그램을 실행시킬 수 있다. 또한 바탕화면에 클릭시 바로 실행할 수 있는 단축아이콘을 등록할 수도 있다.

    터미널을 통한 명령 실행

    konsole.jpg

    위의 그림은 컴퓨터와 상호작용하기 위한 터미널 프로그램중 하나인 konsole이다. 터미널 프로그램을 실행시키면 사각형의 조그마한 상자가 대기 하고 있는걸 볼 수 있는데, 이를 프롬프트라 고 한다. 프롬프트가 있다는 것은 현재 터미널이 사용자의 키보드입력을 받아들일 준비가 되어있다는 것을 의미한다. 여기에서 실행한 명령을 입력하고 엔터키를 누르면 입력된 문자열이 전달되고 실행경로에 해당 문자열과 동일한 이름을 가진 실행파일이 있는지 찾아서 실행하게 된다.

    예를 들어서 /home 디렉토리로 이동하고 있다면, cd /home을 입력하고 엔터키를 누르면 된다.
    문제
    새로운 디렉토리를 생성할 수 있습니까 ?

    vi의 실행

    터미널 프로그램을 실행시키고 프롬프트 상에서 vi를 입력하고 엔터키를 누르면 된다.
    # vi Hello.java
    그러면 다음과 같은 실행화면을 보게 될 것이다.

    konsole2.jpg
    문제
    리눅스 명령과 vi에 대한 더욱 자세한 내용이 필요합니까 ?

    vi

    vi를 실행시키고 코드를 제대로 입력했다면, 다음과 비슷한 화면을 볼 수 있을 것이다.

    konsole3.jpg

    vi의 사용법을 잘 모르겠다면, vi 사용하기문서를 먼저 읽어 보기 바란다.

    문제
    파일을 열고, 내용을 입력하고 저장할 수 있습니까 ?

    프로그램의 실행

    이제 당신은 터미널 프로그램을 실행시킬 수 있으며, 프롬프트가 의미하는 바를 알고, vi를 실행시켜서 소스 프로그램을 작성할 수 있게 되었다. 이제 /home/UserID/java 디렉토리로 이동해서 Hello.java 소스 프로그램을 만들어 보도록 하자.
    UserID는 시스템 계정이름이다. 당신이 wow라는 시스템 계정을 가지고 있다면, /home/wow 로 이동하면 된다. java라는 디렉토리는 mkdir(1) 이라는 시스템 명령을 통해서 생성해야 한다.

    # cd /home/wow
    # mkdir java
    # cd java

    이제 ls(1) 명령을 이용해서 현재 디렉토리에 어떤 파일이 있는지 확인해 보도록 하자.
    # ls -al *
    -rw-r--r-- 1 onnet onnet 103 2007-01-23 20:24 Hello.java

    이제 javac컴파일러를 이용해서 소스 프로그램으로 부터 바이트코드를 생성하도록 한다.
    # javac Hello.java

    성공적으로 바이트코드가 생성되었다면, java인터프리터를 이용해서 바이트코드를 실행시킬 수 있다.
    $ java Hello
    Hello World!
    문제
    이 프로그램이 어떤일을 하는지를 기술하시오.

    예제 자바 프로그램의 분석

    만약 당신이 실행시킨 프로그램이 컴파일 과정에서 에러가 발생했다면, 거의 분명히 오타에 의한 때문일 것이다. 아마도 ", (, {을 잘못 처리했을 가능성이 높다. 혹시 오타가 있는지 확인해 보기 바란다.

    지금은 원문과 비교해서 어디에 오타가 있는지 정도를 확인하는 정도로 소스 프로그램을 잘못짯는지 확인할 수 있을 뿐, 왜 그게 문제가 되는지는 아직 정확히 이해하지 못할 것이다. 차차 알아나가게 될테니 이에 대해서 걱정할 필요는 없을 것이다.
    :::
    2007/04/17 01:02

    번역] 자바와 함께 하는 컴퓨터 과학 4장

    어느덧 4장이군요 (사실은 8장진행중이지만) 원문은 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Java/Documents/ComputerScienceUsingJava/Chapter04


    프로세서

    http://chortle.ccsu.edu/java5/Notes/chap04/ch04_1.html

    지금까지의 문서를 통해서 컴퓨터 시스템을 이루는 주요한 하드웨어 구성요소가 아래와 같다는 것을 배웠다.
    • 프로세서
    • 메인 메모리
    • Secondary 메모리 장치
    • 입출력 장치

    이번 장에서는 컴퓨터시스템의 두뇌에 해당되는 프로세서에 대해서 알아보도록 하겠다. 이번장에서 배우고자 하는 것은 컴퓨터의 두뇌가 어떻게 인간인 여러분이 짠 프로그램을 해석해서 작업을 수행하는가에 대한 것이다. 이를 위해서 다음과 같은 큰 주제들을 다루도록 하겠다.
    • 기계 수행 (Machine Operations) 와 기계어(Machine language)
    • 기계어의 예
    • 다양한 종류의 프로세서 칩
    • 고 수준 프로그래밍 언어들
    • 컴파일러(compiler) 언어들
    • interpreter 언어들

      문제
      프로그램의 수행에 직접적으로 관여하는 컴퓨터 시스템의 구성요소는 무엇인가 ?

    프로세스의 전자적 명령 수행 (Electronic Operations of a Processor

    http://chortle.ccsu.edu/java5/Notes/chap04/ch04_2.html

    컴퓨터 프로세서에 의해서 프로그램이 실행되게 되면, 프로세서는 짧은 시간에 매우 많은 작은 단위의 전자적인 명령을 수행하게 된다. 예를 들어 프로세서에게 메인메모리로 부터 1byte의 데이터를 읽어들이는 일을 맡겨지게 될경우, 각 바이트의 bit값이 1인지를 검사하게 된다. 거의 대부분의 프로세서가 이러한 간단한 일을 일초에 수백만번씩 수행하게 된다.

    Intel Pentium 프로세서
    보내는 사람 Java

    믿음이 가지 않을지 모르겠지만, 이런 단순한 작업들이 컴퓨터가 할 수 있는 모든 것들이다. 이러한 작은 작업들이 모이고 모여서 주어진 명령을 수행하게 되는 것이다. 프로세서가 할 수 있는 기본단위의 일들이 워낙에 작기 때문에 수백만 수천만번 이러한 일을 반복수행해야 그럴듯한 결과를 보여줄 수 있다. 다행히 현대의 컴퓨터들은 초당 수백만번의 이러한 연산을 어려움없이 해낸다.

    그러나 우리는 엄청난 수의 작은단위의 일을 제어하는 방법을 알고 있어야 프로그램을 작성할 수 있는건 아니다. 다행스럽게도 우리에게는 'Java, C와 같은 고수준 프로그래밍 언어들을 가지고 있다. 우리는 큰 수준에서의 일을 제어하는 방식을 알고 있으면 된다. 나머지는 프로그램 언어가 알아서 해결해 준다.

    문제
    웹브라우저를 통해서 하이퍼 링크를 클릭해서 새로운 페이지를 화면에 뿌려주기 위해서 프로세서는 얼마나 많은 전자적 명령을 수행해야 할까요 ?
    • 1
    • 10
    • 100
    • 100,000

    기계 명령

    http://chortle.ccsu.edu/java5/Notes/chap04/ch04_3.html

    자가용을 몰고 서울에서 부산까지 달리기 위해서는 매우 복잡한 과정을 거쳐야 한다. 도로표지판을 읽을 줄 알아야 하고, 신호를 보고 가속, 감속, 정지, 방향전환을 해야 한다. 그러나 이러한 복잡한 일들도 사실상 핸들, accelerate, break을 이용한 회전, 앞뒤 방향이동과 같은 단순한 패턴의 반복으로 이루어진다. 이러한 단순한 일이 수천 수만번 일어나는 것이다. 프로세서도 마찬가지다. 몇개의 명령들의 수많은 반복으로 그림을 보여주거나, 음악을 들려주는 것과 같은 일들을 해낸다.

    프로세서에 의해서 수행되는 이러한 각각의 조그마한 전자적 수행을 machine operation 이라고 부른다. 이러한 machine operation은 한번에 하나만 수행될 수 있다. 대신 초당 수백만번 수행이 된다.

    기계명령 프로세서가 하나의 machine operation을 수행하기 위해서 읽어들이는 메모리에 저장된 몇개의 바이트의 조합이다. 프로세서는 기계명령을 읽어서 수행하고, 다음에 저장된 기계명령을 읽어서 수행하는 식으로 작동한다. 메모리에 저장된 이러한 기계명령의 조합을 우리는 기계어 프로그램 (machine language program) 혹은 실행가능한 프로그램 (executable program) 이라고 한다.

    이해하기 힘들다고 해서 공황상태에 빠질 필요는 없다. 차차 알아나가게 될거다.
    문제
    프로그램이 실행될 때, 기계어 프로그램과 데이터는 모두 메인 메모리에 위치합니까 ?

    기계어의 예제

    http://chortle.ccsu.edu/java5/Notes/chap04/ch04_4.html


    우리가 사용하는 전동치솔에 프로세서와 메인메모리가 있다고 가정해 보자. 이 프로세서는 칫솔을 좌우로 회전시키고, on/off 스위치를 체크하는 등의 일을 할 수 있어야 한다. 기계명령은 하나의 byte로 이루어지다. 각각의 명령은 machine operations (기계 수행)에 대응된다.

    Machine Instruction Machine Operation
    0000 0000 Stop
    0000 0001 칫솔을 왼쪽으로 회전
    0000 0010 칫솔을 오른쪽으로 회전
    0000 0100 프로그램의 시작위치로 이동
    0000 1000 만약 스위치가 off되면 다음명령을 skip한다.

    주소 Machine Instruction
    0 ______
    1 ______
    2 ______
    3 ______

    스위치를 올리면 바로 On 상태인 것으로 가정하자. 프로세서는 한번에 하나의 명령만을 실행할 수 있을 뿐이다. 처음에는 0번 주소에 있는 명령을 실행하고, 실행이 끝나면 1번 주소에 있는 기계명령을 실행할 것이다. 스위치를 켜면, off 상태가 되기 전까지는 칫솔을 좌우로 움직이는 기계명령을 수행해야 할 것이다.

    문제
    전동치솔을 제어하기 위한 기계명령을 위의 테이블에 채워넣어라.

    기계어 프로그램 (Machine Language Program)

    여기에 앞의 전동치솔 문제의 해답이 있다.
    0 0000 0001 칫솔을 왼쪽으로 회전한다
    1 0000 0010 칫솔을 오른쪽으로 회전한다
    2 0000 1000 만약 스위치가 0ff라면 다음을 건너뛴다
    3 0000 0100 프로그램의 시작위치로 간다
    4 0000 0000 프로그램을 종료한다

    위의 전동칫솔 프로그램은 메모리 상에 다음과 같은 비트의 연속으로 저장되어 있을 것이다.
    0000 0001 0000 0010 0000 1000 0000 0100 0000 0000

    프로세서가 시작되면 각 코드의 명령을 수행하게 된다. 물론 위의 예는 교과서적인 설명을 위한 예제다. 컴퓨터 프로세서로 제어되는 전동치솔은 아직 시중에 판매되고 있지 않다. 또한 실제 컴퓨터에 사용되는 프로세서들은 훨씬 복잡한 작업을 수행한다. 그렇지만 이 예제를 통해서 프로세서가 프로그램을 어떤방식으로 실행하는지에 대한 기본적인 아이디어는 얻었을 것이다.
    • 기계어 프로그램은 메인메모리에 저장되어 있는 연속된 기계어 명령을 실행한다.
    • 기계어 명령은 하나 이상의 바이트의 조합으로 이루어진다.
    • 프로세서는 한번에 하나의 기계 명령만을 수행할 수 있다.
    • 모든 기계들은 그들을 제어하기 위한 machine operation 셋을 가지고 있다.

    만약 전동칫솔의 스위치를 켜게 되면 프로그램은 off버튼을 누를때까지, 무한 반복으로 왼쪽 오른쪽으로 움직이는 작업을 수행할 것이다. 이와 마찬가지로 실제 컴퓨터가 다루는 프로그램들도 많은 작은 임무를 수행하는 기계명령을 반복하는 형식으로 주어진 일을 처리하게 된다.


    문제
    위의 전동치솔에서 off버튼을 누르면 어떤일이 발생하는가 ?

    명령의 실행

    http://chortle.ccsu.edu/java5/Notes/chap04/ch04_6.html

    실행(execute) 라는 말은 보통 instruction(명령)에 의해서 machine operation이 수행되는 과정을 의미한다. 위의 전동치솔을 예로 들어보자면, 0000 0000 명령을 실행해서 칫솔을 멈춘다, 혹은 초당 수백만번의 기계명령이 실행된다로 실행을 묘사할 수 있다.

    모든 기계어 프로그램은 명령의 연속적인 실행을 통해서 작동을 한다. 실제 컴퓨터에 있어서는 초당 수백만번의 명령이 실행될 것이다. 컴퓨터가 더 좋으면 좋을 수록 (Hz 숫자가 높을 수록) 더 짧은 시간에 더 많은 명령을 실행할 수 있다.

    전동칫솔의 예에서 기계명령은 실행이 된후 종료 명령이 내려지기 전까지 좌우로 회전하는 반복되는 명령의 모음들로 이루어져 있다. 일반 컴퓨터역시 마찬가지이며 이러한 반복적인 실행을 loop라고 부른다.

    우리가 흔히 접하는 컴퓨터에 사용되는 프로세서들은수백만개의 트랜지스터들을 가지고 있는데, 이들은 integrated circuit (집적 회로)라 고 불리우는 조그만 실리콘 웨이퍼위에 놓여 있다. 전동치솔을 위한 프로세서는 매우 간단해서, 아마도 몇백개 정도의 트랜지스터 정도면 주어진 일을 해내는 프로세서를 만들어 낼 수 있을 것이다. 집적회로는 프로세서뿐만 아니라 메인 메모리의 메모리칩과 같은 컴퓨터의 다른 부분들에도 사용된다.

    문제
    Apple 컴퓨터와 IBM 호환 컴퓨터는 동일한 프로세서 칩을 사용할까 ?

    다른 종류의 프로세서들

    컴퓨터 시스템에는 여러가지 종류의 프로세서들이 사용된다. 여러분들은 이미 Intel 회사의 프로세서들에 (486, Pentium, Pentium II ...) 대해서 잘 알고 있을 것이다. 또한 Apple 컴퓨터에 사용되는 프로세서의 이름도 알고 있을 것이다. 컴퓨터는 그 디자인된 목적에 따라서 거기에 맞는 프로세서를 가지게 된다. 오실로스코프와 같은 다른 전자장치들은 거기에 맞는 형태의 프로세서들을 가지고 있다. 1

    애플의 파워 매킨토시와 Dell의 프로세서들은 그 디자인에 있어서 많은 차이를 보여준다. 프로세서가 다르면 서로 다른 machine operation을 가지게 된다. 그러므로 Dell 컴퓨터에서 돌아가는 기계 프로그램은 Apple 컴퓨터에서 실행되지 않는다. 이러한 차이는 동일한 회사에서 만든 컴퓨터에서도 나타나게 된다. 486과 Pentium 은 인텔에서 만든 프로세서이므로 비슷한 machine operation을 가지지만, 약간의 차이가 발생하게 된다. 때문에 486에서는 잘돌아갔던 프로그램이 Pentium에서 돌아가지 않는 경우가 발생한다. 이럴 경우에는 새로운 프로세서를 위해서 작성된 최신 버전의 프로그램을 설치해야 한다.

    그러나 어도비사의 포토샵과 같은 프로그램은 Pentium기반의 컴퓨터와 Apple 컴퓨터 모두에서 작동한다. 이 둘은 486과 Pentium에 비견할 수 없을 정도로 많은 간격을 가지고 있는데, 어떻게 실행이 될까 ? 비록 두개의 프로세서간의 많은 차이가 있지만, machine operations의 대부분은 비슷하기 때문에 이러한 일이 가능해진다. 지프와 스포츠카가 매우 다르지만 핸들, 브레이드, 악셀레이터등의 기본적인 구성이 같기 때문에, 약간의 훈련으로 움직일 수 있는 것과 마찬가지다. 물론 그렇다고 하더라도 각각의 프로세서에 맞도록 프로그램이 다시 만들어져야 할 것이다.

    프로세서가 어떤 구조 (architecture)를 가질 것인가 하는 것은 어떠한 machine operations를 가지도록 만들어질 것인가에 따라서 선택되어진다. 어떠한 machine operations를 가질 것인가 하는 것은 프로세서가 어떤 용도에 쓰일 것인가에 따라 달라질 것이다. 프로세서의 구조에 관한 내용은 컴퓨터 과학의 또다른 분야이기 때문에 여기에서는 자세히 다루지 않도록 하겠다.

    고급 언어

    전동치솔의 경우를 봐서 알겠지만 기계 언어를 사용해서 프로그램을 작성하는 것은 인간에게 불편한 작업이다. 그나마 전동치솔은 간단하기라도 했지만, 실행가능한 파일 (직업 수행되는 기계명령어로된 프로그램) 들은 수백에서 수천의 기계 언어로 된 명령으로 이루어져 있다. 기계어로 인간이 원하는 프로그램을 작성하는 건 거의 불가능에 가깝다고 봐야 할 것이다. 0과 1의 비트조합으로 계산기를 만든다고 가정해 보라.

    기계어를 써서 프로그램을 작성하는게 어렵기 때문에 대부분의 프로그램들은 C, C++, Java와 같은 high level programming language (고급언어)를 통해서 만들어진다. 이러한 고급언어를 이용하면 프로그래머는 복잡한 일을 수행하는 프로그램을 만들어 낼 수 있다. 나중에 이들 프로그램은 많은 machine operation들로 이루어진 기계어로 변환이 되어서 프로세서가 직접 실행시키게 된다.

    다음은 C언어 프로그램의 간단한 예이다.
    int sum = 0;

    machine operation으로 나타내 보자면, 메인 메모리의 특정한 영역에 숫자 0을 저장을 수행하라 라는 명령이 된다. 아주 간단한 일처럼 보이겠지만 기계어를 이용해서 직접 작성할려면 0과 1로 이루어진 알아먹기가 거의 불가능한 수백개의 machine operation을 사용해야 한다. C를 이용하면 단한줄로 이러한 일을 끝낼 수 있다.
    문제
    프로그래머에게 시간당 50$를 지불하는 회사가 있다고 가정해 보자. 회사는 기계어를 이용해서 프로그램을 작성하는 프로그래머를 원할까. 아니면 고급언어를 사용하는 프로그래머를 원할까.


    소스 프로그램

    프로그래머는 고급언어를 이용해서 프로그램을 만든다. 고급언어로 만들어진 프로그램은 문서작성기를 통해서 입력된 여러 줄의 문자들로 이루어지며, 파일 형태로 하드디스크에 저장된다. 다음은 C언어로 작성된 완전한 프로그램이다.
    #include <stdio.h>
    int main()
    {
    int sum = 0;
    sum = 2+2;
    printf("%d\n", sum);
    }
    이러한 내용을 가진 프로그램은 addup.c와 같은 이름으로 하드디스크에 저장된다. 이 파일은 연속된 바이트의 조합으로 이루어져 있으며, 이 바이트들이 문자데이터로 읽혀지게 된다. 여러분은 에디터를 통해서 문자의 형태로 읽어오고, 프린터를 통해서 출력할 수 있을 것이다. 그러나 이들 바이트에는 기계 명령이 포함되어 있지 않다. 이 바이트들이 메인메모리로 복사된다고 하더라도 어떠한 일도 수행할 수 없게 된다.

    소스 프로그램 (혹은 소스파일)은 고급언어로 씌여진 명령들로 이루어진 문서 파일을 의미한다. 이 것은 변환 과정이 없이는 실행이 될 수 없다.

    소스 프로그램이 실행되기 위해서는 기계어로 번역되는 과정을 필요로 한다. 이렇게 소스파일을 입력받아서 실행가능한 기계어 프로그램으로 바꾸어주는 일을 하는 응용 프로그램을 translater이라고 한다. C 프로그램인 addup.c가 번역되는 과정을 거쳐서 실행 프로그램이 되는 것이다. 이렇게 번역과정을 거친 프로그램은 addup.exe등의 이름을 가진 실행가능한 프로그램의 형태로 하드디스크에 저장이 된다. 이 프로그램은 메인메모리로 저장이 되서 실행될 수 있다.

    프로그래머는 보통 소스 프로그램을 번역하는 과정을 translate한다 라고 하는대신에, compile한다라고 말한다. 즉 소스프로그램은 컴파일 과정을 거쳐서 실행 프로그램이 된다라고 바꿔 말할 수 있다.

    문제
    이상에서 우리는 소스프로그램이 번역과정을 거쳐서 실행된다는 것을 알았다. 그러나 프로그램은 원하지 않는 방향으로 잘못 실행될 수도 있다. 1부터 100까지 더하는 프로그램을 만들었는데, 1부터 99까지 더하는 프로그램을 만들었다면 프로그램을 수정해야 할것이다. 소스 프로그램을 수정해야 하는가. 아니면 실행 프로그램을 수정해야 하는가.

    프로그램 번역

    다음 그림은 C에 의해서 만들어진 프로그램이 어떻게 실행파일로 만들어지는지를 보여주고 있다. (Java는 다른 과정을 거친다. 이에 대해서는 다음장에서 다루도록 하겠다.

    Figure4-1.gif

    1. 소스파일은 문서작성기를 통해서 만들어진다.
      • 여기에는 고급언어 명령이 포함되어 있다.
      • 문자로된 byte 정보들이 포함되어 있다.
    2. 소스파일은 하드디스크에 저장된다.
    3. 소스파일은 메인 메모리로 올라간다고 하더라도 프로세스에 의해서 실행될 수 없다.
    4. 컴파일러(번역기) 프로그램이 소소 파일을 실행파일로 번역한다.
      • 소스파일은 변경되지 않은체, 새로운 실행파일이 생성된다.
      • 컴파일러 자체도 C 언어와 같은 고급언오로 만들어지며, 목표로 하는 프로세서와 운영체제에서만 작동한다. 영어 번역가는 영문서만 번역할 수 있는 것과 마찬가지다.
    5. 실행파일 역시 하드디스크로 저장된다.
    6. (키보드를 통해서)프로그램을 실행을 명령하면, 운영체제는 실행파일을 메인메모리로 카피하고 실행시킨다.

    위의 방식은 Ada, Pascal, C, C++, FORTRAN 등의 많은 언어들이 사용하고 있다. Java는 이들과는 약간 다른 방식을 채택하고 있는데, 다음장에서 자세히 다루도록 하겠다.

    문제
    C언어로 만들어진 소스코드파일을 팬티엄 컴퓨터에서 애플 매킨토시 컴퓨터로 복사했다. 이들 컴퓨터에서 프로그램을 실행시키려면 어떻게 해야 하는가.

    Portability

    이론적으로 고급언어를 통해서 만든 프로그램은 다른 여러 종류의 프로세서에서 실행되게 할 수 있다. 퀘이크를 예로 들어보자면, 윈도우즈와 매킨토시를 위한 별도의 소스파일을 만들 필요 없이 하나의 소스파일만 가지고, 양쪽에서 동일하게 실행되는 실행파일을 만들 수 있다. 물론 소스파일을 해당 프로세서에 맞도록 번역할 수 있는 컴파일러 프로그램이 존재한다는 조건이 따른다.

    이렇게 하나의 소스파일을 유지하면서도 서로 다른 프로세서에서 실행가능하게 됨으로써, software portability를 높일 수 있다. 단지 고급언어를 사용해서 프로그램을 작성할 수 있기만 하면 된다. 나머지 작업은 컴파일러가 알아서 해준다.

    그러나 불행하게도 고급언어를 사용하더라도 서로 다른 프로세서에서 동일하게 작동하는 프로그램을 짜는건 그리 만만한 일이 아니다. 다른 시스템에서 돌아가게 하려면, 운영체제의 특성, 버전등과 같은 상당히 많은 것들에 대해서 신경을 써야한다. 많은 것을 해결해 주기는 하지만 여전히 portability 한 소프트웨어를 만들기 위해서는 상당한 인간의 노력을 필요로 하는 것이다. 자바를 사용하면 portability한 소프트웨어를 만들기 위해서 필요로 하는 상당한 인간의 노력조차 자바에서 해결해 주므로 훨씬 적은 노력으로 portability한 소프트웨어를 만들 수 있다.

    문제
    프로그래머에게 시간당 50$를 주는 회사가 있다. 이 회사는 애플과 인텔 컴퓨터 모두에서 작동되는 프로그램을 만들려고 한다. 이 회사는 Java와 다른 고급언어 프로그래머들 중 어느쪽을 선호 할 거라 생각되는가

    Interpreter

    고급언어로 씌여진 프로그램은 절대 프로세서에 의해서 곧바로 실행될 수 없다. 컴파일러를 통해서 소스 프로그램을 실행가능한 (기계어로 된) 프로그램으로 번역해야 한다.

    여기에서는 interpreter방식을 사용하는 다른 언어들을 소개하고자 한다.

    인터프리터는 그 자체가 프로세서 처럼행동해서, 고급언어로 작성된 프로그램을 직접 실행시킨다.

    다음은 인터프리터의 작동방식을 나타내는 그림이다.

    Figure4-2.gif

    위의 그림에서 소스프로그램은 program.bas이 며, BASIC 프로그래밍 언어로 만들어졌다. 이 프로그램을 BASIC interpreter에 넘기면, 소스프로그램을 넘겨 받은 interpreter가 직접 실행시킨다. BASIC 인터프리터는 소스프로그램을 라인단위로 읽어서 실행을 하는데, 컴파일러가 번역기라면 인터프리터는 동시통역기라고 생각하면 될 것이다.

    인터프리터는 많은 곳에서 사용되는데, WOW와 같은 게임에도 사용된다. 이러한 게임은 자체적으로 인터프리터를 가지고 있어서, 캐릭터의 행동방식, 마법데미지, UI등을 결정할 수 있다. 이러한 인터프리터는 자체적인 명령어셋과 체계를 가지고 있는데, 이를 지킨다면 쉽게, UI, 캐릭터행동, 데미지 등의 변경이 가능하다. UI같은 경우에는 프로그래머가 아니더라도 실시간으로 변경이 가능하다. 만약 내부적으로 인터프리터를 사용하고 있지 않다면, UI, 마법데미지, 행동방식의 변경이 있을 때마다 프로그램을 새로 컴파일해서 패치시켜주는 작업이 필요할 것이다.

    Virtual Machine (가상기계)

    BASIC 소스 프로그램을 인터프리터를 통해서 실행시키면, 인터프리터와 소스프로그램이 모두 메모리에 올라가게 된다. 이 인터프리터는 하드웨어에서 직접실행기 가능한 기계 명령으로 구성되어 있다. BASIC 소스프로그램은 BASIC 인터프리터가 이해할 수 있는 명령어들의 조합으로 이루어져 있다. 달리말하자면 BASIC 인터프리터가 가상의 프로세서인 것처럼 작동을 해서 BASIC 프로그램을 직접 실행시키게 되는 것이다.

    Figure4-3.gif

    위의 그림은 인터프리터를 설명했을 때 사용한 그림과 비슷해 보이지만 약간의 차이가 있다. Basic 인터프리터와 프로세서를 하나로 묶고 있는데, 이렇게 베이직 인터프리터가 프로세스를 그 하부에 감추고 있으므로, 베이직 프로그래머는 가상의 기계위에 있는 것처럼 프로그래밍을 할 수 있다. 이런 이유로 우리는 베이직 인터프리터를 베이직 가상기계라고 부르기도 한다. 영화 메트릭스 에서 메트릭스를 통해서 가상의 세계를 구성함으로써, 인간들로 하여금 하나의 세계에 있는 것처럼 느끼는 것과 마찬가지라 할 수 있겠다.

    문제
    베이직 소스 프로그램을 실행파일로 변경할 수 있을까 ?

    속도

    컴퓨터 언어는 크게 두 종류로 나눌 수 있음을 알 수 있다. 그럼 인간의 언어 활동과 비교해서 이 둘의 차이점을 설명해 보도록 하겠다.
    • Translator : 책을 번역하는 것과 비슷한 행위다. 영어로 된책은 한글로 완전히 번역이 되어서 출판이 된다.
    • Interpreter : 동시 통역기이다. 한쪽에서 영어로 말을 하면, 통역가가 그 즉시 한글로 통역을 해서 알려준다.
    영어로 된 책을 통역가가 번역을 한다음에 읽어주는 것보다는 이미 번역을 끝마친 책을 보는게 훨씬 빠를 것이다. 컴퓨터 언어도 마찬가지다. 인터프리터기는 프로그램을 한줄씩 읽어서 해석하고 기계어로 변경해서 실행을 한다. 때문에 즉시 실행되는 컴파일과정을 거친 프로그램보다 느릴 수 밖에 없다.
    문제
    프로그램이 빠르게 작동할 수 있어야 한다는 것은 항상 중요한 문제가 되는가 ?
    :::
    2007/04/17 00:12

    번역]Coumpter Science Using Java 2장

    번역]Coumpter Science Using Java 2장

    수정 | 삭제

    원문 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Java/Documents/ComputerScienceUsingJava/Chapter02

    1.1 아날로그와 바이너리 신호 Analog and Binary Signals


    여러분도 알다시피 컴퓨터는 디지털 기계이며, 2진수를 이용해서 필요한 계산을 한다. 아마 중학교 교과 과정에서 배웠을 것이다. 그런 이유로 디지털과 이진수가 무엇을 의미하는지 어느 정도는 이해 하고 있으리라 생각된다. 하지만 어셈블리 프로그래밍을 하기 위해선 이러한 의미들에 대해서 좀더 명확히 하고 넘어갈 필요가 있다. 이번 장에서는 다음과 같은 주제들을 다루게 될 것이다.

    이장의 논제들:

    • 이진수의 신호 Binary signals.
    • 아날로그 신호 Analog signals.
    • 이진수의 장점들Advantages of Binary.
    • 비트 Bits.
    • 노이즈 신호들 Noisy signals.

    컴퓨터에 진짜로 어떠한 일이 일어나는지 알고 싶다면 이러한 주제를 주의깊게 공부를 해야 한다.


    질문: 태엽과 기어로 작동되는 아날로그 시계와 달리, 전기의 힘만으로 작동되는 시계를 디지털(전자) 손목시계라고 부른다. 왜 디지털이라는 수식어가 붙는가 ?


    프겔러들의 수다
    안방거사 Traditional watches have hands but digital watches have digits to tell the time. 뭐 그렇단 이야기요.


    1.2 바이너리(이진수적인) Binary

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_2.html

    답: 아날로그 시계는 시계바늘의 위치를 측정(measure)해야만 시간을 알 수 있다. 디지털 시계는 명확한(definite) 숫자를 사용해서 시간을 보여준다.

    이진수 혹은 바이너리(Binary) 는 2가지의 상태가 있다는 것을 의미한다. 두가지 상태는 "1" 과 "0" 의 상태일 수 도 있고 "참" 과 "거짓" 의 상태일 수 도 있고 "켜진것" 과 "꺼진것"의 상태일 수 도 있다. 하나의 바이너리(이진수)가 2 가지 가능한 상태 중에 하나의 상태를 나타낸다는 것이 이진수적인 특징이다.

    하나의 비트(bit)은 "꺼짐/켜짐" 둘중에서 하나 의 값을 갖는다. 불을 껏다 켰다 하는 스위치가 좋은 예이다. 스위치로는 "켜거나" 또는 "끄거나"만 할 수 있다. 중간쯤 켰다와 같은 다른 작동이란 있을 수 없다. 하나의 비트(bit) 정보는 스위치로 불을 껏다 켯다 하는 일 같은 것을 담을 수 있다.

    이와 달리 불빛 조절계(light dimmer)는 바이너리 장치가 아니다. "꺼짐"과 "완전히 켜짐"사이에 무수한 상태가 가능하다. 만일 여러분이 불의 밝기를 25% 정확히 맞추고자 한다면, 여러분은 힘을 들여가며 주의깊게 불빛 조절계를 조정해야만 할 것이다. 우리는 이러한 여러가지 기계적 상태가 존재하는 장치를 아날로그장치 라고 한다.


    질문:
    다음 중에 어떤것이 바이너리 장치일까요?

    • 자동차 점화 스위치
    • 시계의 시침
    • 전자계산기의 입력버튼
    • 스테레오에서 둥그런 볼륨 조정장치.


    프겔러들의 수다
    안방거사 개념적으론 점화 스위치가 더 가까울 것 같소. On and Off 가 명확히 있으니 말이요. 전자계산기의 단추는 글쎄요. 전자 계산기 나름일 것 같소. 옛날엔 아날로그 형도 있었던 것 같소.
    자바하는넘 좀 코에 걸면 코걸이 귀에걸면 귀걸이 측면이있죠. 아예 점화 스위치를 빼버릴까 생각도 듭니다.
    푼내기 답 두 개지 말입니다. 점화 스위치는 눌러질 때 익니션이고 누르는 중에 익니션 준비라던가 반만 익니션이라는 상태가 없으니 점화 스위치도 바이너리 장치
    yundream 불을 침침하게 하는 디머라는 장치라기 보다는 그냥 온도조절장치 정도로 의역하는게 훨 와 닿을거 같어. 디머?라고 하면 좀 그렇잖아.
    자바하는넘 아무래도 그렇지 거 단어 생각나는것도 없고. 껄끄러웠는데
    자바하는넘 그런데 이 사람이 불빛 조정기(dimmer)의 예를 너무 많이들고 있네....난 구글해 보니까 걍디머는 디머라고 써서 썼는데... 불빛조정기로 그냥 갑시다. 전기 스위치와 대조도 되고 문맥상.
    푼내기 우리나라 같이 형광등을 많이 쓰는 나라에서는 디머를 거의 쓰지도 않고 쓸 수도 없는데 미국은 형광등보다 백열등이 훨씬 많아서 침실이고 거실이고 할 꺼 없이 온/오프 스위치 옆에 디머가 있거나 스탠드 라이트에 부착

    1.3 왜 컴퓨터는 이진수를 사용하나 Why Computers use Binary



    답:
    자동차의 점화스위치 => 아니다.
    시계의 시침 => 아니다.
    계산기의 버튼 => 그렇다
    스테레오의 볼륨 콘트롤 => 아니다.

    자동차의 점화 스위치는 개별적(discrete) 이다 - 점화 스위치는 명백하게 정의된 상태들을 가지고 있다 - 그렇지만 2가지 이상의 상태를 가지고 있다 (꺼진상태,달리는 상태,시작상태, 가속상태....).
    계산기의 단추는 이진수적인 장치이다. 계산기의 단추는 누르거나 또는 안누르거나 두가지의 상태만 있다. 보통은 안누른 상태이다. 여러분이 버튼을 눌렀을때, 그것은 "누른상태"가 된다.
    여러분이 손을 땔때 버튼은 "안누른 상태"로 돌아온다. 그런점에 있어서 전구를 껏다 켰다 하는 스위치와같이 이진수적인(binary) 장치 이다. 이진수를 사용하는데에는 많은 장점들이 있다.

    여기에 이진수를 사용하는 4가지 이유를 나열해 본다.(서로 중첩될 수 도 있다.)
    1. 간단하다. 만들기 쉽다.
    2. 신호가 명확하다. 그렇기 때문에 잡음(noise)을 최소화할 수 있다.
    3. 완벽한 복제물을 만들 수 있다.
    4. 형태를 가진 모든 것을 "비트(bit)의 형태"로 표현할 수 있다.

    벨 전화 연구소의 수학자였던 클라우드 셰논(Claude Shannon)은 1948년 논문 "통신에서의 수학적인 이론(A Mathematical Theory of Communication)"에서 이러한 이진수적인 특징을 명확히 했다. 이 논문은 정보이론과 컴퓨터 과학의 기초에 많은 영향을 주었다.

    질문:
    어떤 것이 제조 하기 쉬울까요?

    • "껏다"/"켰다" 스위치
    • 불빛 조절계(ligth dimmer)

    프겔러들의 수다
    안방거사 뭐 원시적인 스위치를 생각하면 on/off이겠지요. binary의 효율성은 좀 의심이 가오. 현재의 기술수준으로 보면 그렇겠지만 당장 생물의 gene을 보면 4가지 정보로 되어있소.
    자바하는넘 gene 을 복사하는걸 영어로 transcription이라고 하나요 프로테인을 만드는걸 translation이라고 하죠. 서양횽들 용어사용하는것 봐도 재미있는것 같에요. 컴한다는게 어케보면 프렉탈적인게 있는것 같에요... 로고스에대한 인간의 욕망표출 같기도 하고...
    sparrow 어려운말 쓰지 맙시다....ㅡ,.ㅡ;;
    자바하는넘 미안 좀 있어보이려고 주름잡았는데. 원래 아는거 별로 없는사람이 어려운말써요. 있어보이려고.
    안방거사 3 state 혹은 4 state를 사용하면 더 재미있는 정보를 함축하오. 옛날에 러시아인이 쓴 논문을 한번 본적 있는데 내용은 이미 가물가물하오. 4 state system으로 보면 Octal number는 1bit 가 1 digit이 될 것 같은데 말이요. 그리고 이동네에서 좀 있어보이려면 NP Hard, NP complete 뭐 그런 것이 좋지 않겠소 ^^
    자바하는넘 제가 원래 문과 출신 입니다. 그쪽으론 구라를 잘 못치죠.
    푼내기 아우 P, NP 나오면 머리아파지지 말입니다.
    안방거사 미 국쪽도 IS쪽은 문과 출신들 꽤 되오. 내 개인적으론 NP Complete 문제들중 일반 문제에서 NP Complete 문제 (3 set problem)로 reduce하던 것이 젤로 힘들었던 것 같소. 뭐 Program correctness proof도 만만치 않았지만 말이요. 그놈의 튜링머신이나 URM써서 밤새 숙제하던 아련한 기억이 있으오.. 허허



    1.4 바이너리의 장점 1 단순하다 그래서 쉽게 만들수 있다 Advantages of Binary 1 : Simple; easy to build


    답 : 켯다/껏다 하는 스위치

    켯다/껏다 하는 스위치는 단순하며 만들기 쉽다.
    켯다/껏다 하는 스위치는 2개의 금속체를 붙게하거나 떨어지게 한 것이다.
    불빛 조절계(light dimmer) 천천히 부드럽게 빛이 도달하도록 전류를 조절 해야만 한다.
    불빛 조절계는 껏다/켰다 하는 스위치 보다 더 많은 부품이 필요하고 조심스럽게 조립해야 한다.
    25%가 정확히 25%를 의미하는 아주 정밀한 불빛 조절계를 만드는 것은 정말 어렵다.

    실리콘 칩안에 있는 작은 장치들의 경우에도 똑같은 사실이 적용 된다.
    켰다/껏다 하는 스위치들은 비교적 제조하기 쉽다. 실리콘 칩에서 "쉽게 만들 수 있다"는 것은 싸고,작고, 믿을만한 수십만 개의 켯다/껏다 장치를 작은 공간에 채워넣을 수 있다는 것을 의미한다.

    질문:
    책을 만드는 다음 방법들중에 어떤 방법이 가장 쉽고 단순할까요?

    • 점토에 그려넣어 책을 한 권씩 만든다.
    • 종이에 펜과 잉크로 한자 한자 직접써서 한 권씩 만든다.
    • 평평한 나무에 글자를 새겨낸후 책을 찍어 낸다.
    • 활자를 만들어 책을 찍어 낸다.


    프겔러들의 수다
    안방거사 질문뒤의 의도는 뭘까? 뭔가 말할려고 도입하는 것 같은데.
    제4의눈 분명한건 어셈블리로 윈도 어플리케이션을 만드는건 바이너리 에디터로 모나리자 그림의 JPG파일을 만드는 거나 비슷하다는것.
    푼내기 종이에 쓰는게 젤 쉽고 단순한건데 답은 그게 아니네 -.-;;;
    책 몇권을 만드느냐에 따라 틀리지.
    푼내기 문제가 답을 유도해내는게 아니고 답이 문제를 유도해낸다 -.-;;; 이 교수 왜 이러는거지? 모호한 문제 내서 학생들 낚는게 취민가? -.-;;

    1.5 바이너리의 장점 2. 신호가 명확하다. Advantages of Binary 2:Unambiguous Signals


    나무 한토막을 깍아서 책 한페이지를 만들어 내는 대에는 굉장히 고급의 기술과 예술적인 기교가 필요하다.
    그런 일은 복잡하고 노력이 많이 들어간다. 작은 실수가 전체 책을 다 망칠 수도 있기 때문이다.
    르네상스시대의 나무깍는 기술자들이 아마 나무깍는 기술자들 중에서는 최고의 기술을 가졌었던 사람들 이었을 것이다.

    활자를 맞추는 일은 그에 비하면 쉬운 일이다.
    예술적이거나 기능적인 기술이 조금만 있으면 누구나 할 수 있다.
    각각의 활자를 맞추어 책을 만드는 방법은 실수가 적고 믿을만 하다.
    혹 실수가 있더라도 쉽게 고칠 수 있으며 활자를 여러번이라도 다시 사용할 수 있다.

    기술의 진보가 종종 단순한 방법으로 향한다는 것은 역설적인 사실이다.
    나무깍기는 복잡한 일이다 그렇지만 활자를 맞추는것은 쉬운일이다.
    컴퓨터의 혁명(1950)은 구텐베르그(Gutenberg 1450)의 활자 혁명과도 비교 할 수 있다.

    바이너리의 장점을 복습해 봅시다.

    1. 단순하다. 그래서 만들기 쉽다.
    2. 신호가 명확하다 (그래서 노이즈에 저항력이강하다)
    3. 완벽한 복사가 가능하다.
    4. 패턴으로 표현될 수 있는 모든것이 bits 패턴으로 표현 될 수 있다.

    질문: 어떤일 이 더 쉽겠습니까?

    • 불의 밝기를 정확히 알아내는 일
    • 불이 꺼졌는지 켜졌는지 알아내는 일

    프겔러들의 수다
    자바하는넘 [한줄 요약:팔만대장경과 직지심경(1372) 생각하시면됨]
    안방거사 목판파기는 칼 하나만 있으면 되는데 활자는 한자 한자 다 만들어 놔야지요. 그래야 그 다음이 쉽죠.
    자바하는넘 나름대로 연금술도 발달해야 하고 뭔가가 있어야 되겠죠.
    here4you 연금술은 일단 약초 채접과 함께...(죄송 =.=)


    1.6 올드 노스 빗 Old North Bit


    답:불이 꺼졌는지 켜졌는지 알아내는 일

    신호가 분명해야 된다는 것을 염두해두고 다음의 이야기를 생각해보자. 폴 리비에(미국의 독립운동가)는 영국군을 공격하고자 공격 준비를 하고 첩보를 기다리고 있었다.
    첩보는 영국군이 어떻게 공격해 올지를 가리켜주는 것이었다. 미리한 약속에 따라 북쪽 교회의 탑에서 전등 불빛으로 신호가 오기를 기다리고 있었다.
    그런데 불빛신호가 만약 1.32456 만큼 밝으면 육로로 공격할거라하고 1.71922 만큼 밝으면 바다로 공격할거라 했다고 상상해보자.

    교회에서 불빛 신호가 보이기 시작한다! 만약에 폴 리비에가 그 때 불빛신호 밝기가 얼마나 밝았는지 알아내려고 끙끙대었다면 폴 리비에의 유명한 공격은 몇 시간씩 지체되었을 것이다.
    신호가 분명하다는 것은 엄청난 장점이다.


    1775년 그 밤에 폴 리비에가 기다리고 있던 신호는 불빛이 하나면 육로로 공격이고 불빛이 둘이면 해로로 공격이라는 뜻이었다.


    누구든 쉽게 해석할 수 있는 신호이다. 숫자만 세면된다. 그러한 신호들을 우리는 이산적(discrete) 신호라고 부른다. 왜냐하면 이산적(discrete) 신호들은 고정된 숫자로 정의된 상태들을 가지고 있기 때문이다.
    때때로 디지털이라는 단어도 같은 문맥에서 사용된다.


    질문: 왜 주판을 일종의 "디지털 컴퓨터"로 간주할 수 있을까요?

    프겔러들의 수다
    안방거사 주판알을 digit으로 보고 1 column을 1개 code로 보아서 column을 모으면 number가 된다나 뭐라나...

    1.7 아날로그 신호 An Analog Signal

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_7.html

    답: 주판에서 계산은 주판알을 일정하게 정의된 위치로 옴기는 것이다. 주판알을 셈에 쓰일때는 숫자의 일부분으로 간주되는 위치에 놓고 그렇지 않을때는 숫자로 간주되지 않는 위치에 놓는다. 주판은 이와같이 신호가 분명한 이산적인 장치이다.


    아날로그 신호에서는 측정값들이 지속적으로 변화할 수 있다. 측정값은 일정한 영역내에서 불특정한 어떤 값일 수 있다 . 또한 아날로그 신호를 측정할 때 특정한 순간에 정확한 값을 측정하는 것은 대단히 중요하다.
    아래 그림은 아날로그 신호를 표현하고 있다. 그림은 특정 순간에 측정된 정확한 값들에 대한 정보를 담고 있다. 우리는 "T2"라는 순간에 어떤 값을 가지는지 정확히 알 수 있다.

    Figure2-1.gif


    자 이제 여러분이 전선의 전압을 관 찰한다고 생각해 보라. 그리고 경계점을 정하고 경계점보다 낮은 전압일 때는 "off"로 간주하고 경계점보다 높은 전압일 때는 "on"으로 간주했다고 생각해보자.

    질문:

    "T2"에서의 신호는 "on" 신호 입니까 "off" 신호 입니까?

    1.8 바이너리 신호 Binary Signal

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_8.html

    답:
    아날로그 신호가 전압에따라 변하긴 변하지만 T2 지점에선 정밀한 측정 없이도 경계점(threshold) 위에 있다는 것이 명백하다.

    아날로그 신호의 측정값은 끊어짐 없이 변한다. 경계점(threshold)을 이용하여 아날로그 신호를 "켯다/껏다" 같은 바이너리 정보로 표현할 수 있다. 경계점을 정해 전압의 위와 아래를 정하는 방법은 사람 뿐만 아니라 전기기기(electronic device)에게도 편하고 빠른 방법이다.
    아래 그림은 꺼짐(off) 이후에 켜짐(on)을 전송하는 신호다.
    T1과 T2에서 신호를 측정했다.

    Figure2-2.gif

    질문 8:
    신호가 T1에서 꺼짐(off)이고 T2에서 켜짐(on)이라는 것이 명확합니까?

    프겔러들의 수다
    yundream 보통 threshold를 임계영역/임계값/임계치 등으로 번역하잖아. 임계치를 넘으면 오류.. 넘지 않으면 정상 뭐 이런식으로
    자바하는넘 걍 경계값 경계치 경계영역하면 안될까?
    yundream 경계값으로 해도 되겠네.. ㅎㅎ 내가 원자력 출신이라서.. 임계치란 단어에 익숙하다 보니... ㅎㅎ
    졸려. threshold는 그냥 역치라고 번역하는게 좋지않을까? 경계값이라고 해도 무리는 없지만 schmitt trigger같은 개념이 도입되면 threshold가 2개가 되기도 하니까 좀 부족하지.
    자바하는넘 역치도 감이 좀 안오네... 이게 좀 입문글인데... 내가 뭐 한자래도 보고 그게 팍감이오면 쓰겠는데... 내가 쓸줄모르고 이해못하는 한자 쓰기가 그렇네용 참... 네이버 단어장에 이걸로 나오는데 역치(値)[명사] 생물의 감각에 반응을 일으키게 하는 최소한의 자극의 강도(强度).

    1.9 불완전한 전송 Imperfect Transmission


    답 : 명확합니다.

    위에 장에서 신호를 경계영역(threshold)을 두게해서 "켜진상태(ons)"와 "꺼진상태(offs)"로 구분하는 것을 명확히 파악할 수 있었다. 경계치를 넘으면 켜짐 넘지 못하면 꺼짐으로 하면 되기 때문이었다.
    만일 신호를 긴 전선을 통해 전송시키면서 그 전선 근처에서 어떤 사람이 진공청소기를 켜고 청소를 한다고 가정해 보자. 아래 그래프는 신호를 전송받은 쪽에서의 신호를 보여준다.

    비록 신호가 아날로그 수준으로 잡음(noise)이 많더라도, 바이너리 값은 완벽히 전송 된다.
    전기기기적인 측면에서나 또는 여러분이 직접 보아도 T1 에서의 신호는 꺼짐(off)을 말하고 T2 에서의 신호는 켜짐(on)인것이 분명하다. 신호를 받는 쪽에선 이진수의 값만 받으면 된다.

    Figure2-3.gif

    오직 켜짐(on)이냐 꺼짐(off)이냐 라는 정보만 의미가 있기 때문에, 아날로그 신호의 노이즈는 무시할 수 있다. 이진수 값으로 규정된 원래 의도한 신호는 정확히 전달 된다.

    질문:
    만일 신호가 아날로그 신호라고 가정하고 그리고 정확한 측정값이 중요한 것이라고 가정해 봅시다. 만약에 이렇게 잡음이 많다면 아날로그 신호에선 중요한 정보가 손상 되겠습니까?

    1.10 바이너리의 장점 3. 완벽한 복사물을 만들 수 있다. Advantages of Binary 3: Flawless copies can be made.

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_10.html
    답: 손상된다. 신호가 가수의 목소리를 재현하는 신호라고 가정해보자. 신호가 잡음이 많을 경우에 가수의 노래는 당연히 잡음이 많게 들릴것이다. 신호 복사과정에서 잡음으로 인해 목소리가 담고 있는 정보를 잃은 것이다.

    바이너리의 장점을 복습해 보자.

    1. 단순하다. 그래서 만들기 쉽다.
    2. 신호가 명확하다 (그래서 잡음에 저항력이 강하다)
    3. 완벽한 복사가 가능하다.
    4. 형태가 있는 모든 것은 비트의 형태로 표현 될 수 있다.

    완벽한 복사가 가능하다. 신호를 받는 쪽은 0이냐 1이냐 같은 바이너리 값에만 관심이 있다. 신호가 기준점 위냐 밑이냐만 확인하면 된다. 잡음이 대단히 심하지 않다면 바이너리 값은 완벽하게 전달 될 수 있다.
    예를들어, 아래 그림은 "on"/"off" 값을 잡음이 많은 신호속에서도 완벽히 재현한 그림이다.

    Figure2-4.gif

    그림과 같이 원래의 신호가 잡음속에서도 완벽히 회복될 수 있다. 또한 이러한 과정을 매번 완벽한 복사물이 필요할 때마다 몇번씩 반복할 수 있다. 컴퓨터 시스템에서 1과 0의 또는 on과 off같은 비트 형태들이 일초에 수백만번씩 프로세서와 메모리속에서 이리저리로 복사하는 과정을 거치는데 이런 과정속에서 연산이 정확하게 이루어지기 위해선 복사물이 완벽해야 된다는 점은 필수적인 요소이다.

    질문:
    뭔가 이상하지 않습니까. 시간 "x" 지점에서 신호가 켜짐(on) 일까요 꺼짐(off) 일까요? 쉽게 말할 수 가 없습니다. 또한 그 "x" 지점에서 잡음이 크다면 답이 틀려지기 쉽습니다.
    이런 문제는 디지털에서 어떻게 해결할까요? (힌트: 모든 지점에서의 신호값을 다알고 있어야만 할까요?)



    1.11 클럭 Clocks

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_11.html

    답: 컴퓨터 시스템은 전체 신호 값을 다 테스트 하는것이 아니고 특정한 순간에 신호 값을 측정 하도록 고안 되었습니다. 신호가 바뀌는 일도 이런 측정값들 사이에서 일어 나도록 고안 되었다.

    디지털 시스템에서 "on"과 "off" 같은 이진수(binary) 값은 어떤 지정된 순간에만 측청된다. 그렇게 함으로써 측정시간 사이에 여유를 줄수있고 트랜지스터나 전선에서 이진수 값이 변화할 기회를 준다.
    이것이 왜 컴퓨터 시스템이 "클럭(clock)"을 가지고 있는 이유이다. 클럭에 따라 모든 측정 시간들이 맞추어 질 수 있다. 클럭 수가 더 크다는말 또는 클럭이 더 빠르다는 말은 초당 더 많은 측정을 할 수 있다는 말이다.
    그렇게 더 많은 측정이 가능하기 때문에 전체 시스템이 더 빠르다.

    우리는 종종 컴퓨터를 프로세서와 칩의 클럭 속도로 묘사한다. 클럭 속도는 Hertz(헤르츠)단위로 측정 된다. 1 Hertz는 초당 1 클럭 사이클을 말한다. MHz(메가 헤르츠)는 초당 백만 번의 클럭 사이클을 말한다.
    700 MHZ 펜티움 프로세서는 바이너리 값을 초당 7억 번 측정한다. 그런 측정 시간들 사이에 바이너리 값이 바뀌거나 정해질 수 있다.
    프로세서의 칩이 빠르면 빠를 수록 초당 더 여러번 값들이 0 또는 1인지 측정 될 수 있고 초당 더 많은 값들이 정해질 수 있다.

    질문:
    400 MHZ 펜팁 프로세서와 800MHZ 프로세서 둘 중에 어떤 것이 더 빠르겠습니까?

    1.12 바이너리의 장점 4. 어떤것도 다 표현할 수 있다. Advantages of Binary Representation 4 : Representing Anything

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_12.html

    답: 800 MHZ 프로세서가 두배로 더 빠르다. 초당 8억만번의 값을 측정할 수 있다. 그렇지만 이것은 프로세서의 종류가 같을 경우에만 해당한다. 프로세서의 종류가 다를 때는 클럭 속도 이외에 다른 요소를 고려 해야한다.

    바이너리의 장점을 기억해보세요:

    • 패턴 또는 형태로 표현될 수 있는 어떤 것이든 0과 1을 사용해서 0과 1의 형태로 재현할 수 있다.

    온갖 종류의 데이터가 똑같은 전기적 방법을 이용해 컴퓨터의 주메모리나 보조메모리 같은 메모리에 저장 된다. 그렇게 메모리에 저장 될 수 있다는 것은 컴퓨터가 온갖 종류의 데이터나 프로그램을 무수히 완벽하게 복사 할 수 있다는 것을 의미한다.

    추상적 상징으로 표현될 수 있는 어떤 시스템도 0과1의 비트의 형태로 해석할 수 있다.
    예를 들자면 우리는 영어의 글자들을 8 비트의 형태로 표현할 수 있다.
    어떤 비트의 형태가 특정한 영어글자를 표현한 것 이다라고 동의한 기준을 ASCII(American Standard Code for Information Interchange)라고 부른다.
    컴퓨터 시스템의 기계와 소프트웨어는 일반적으로 데이터가 "문자 텍스트(text)"인경우 이러한 동의한 기준을 따른다. 나중에 더 문자 텍스트에 대해 배울 것이다.
    데이터가 문자가 아닌 경우에는 다른 방식을 사용해 표현한다.

    질문: 영어가 아닌 다른 글자도 0과1의 비트형태로 표현이 가능할까요?

    1.13 바이너리 또는 이진수로 모든 것을 표현 할 수 있다라는 것에 대해 더 생각해 보기 More on Representing Anything in Binary

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_13.html

    답: 물론이다. 어떤 문자도 바이너리 형태로 나타낼 수 있도록 규정할 수 있다.

    일본 문자나 중국문자도 비트의 형태로 표현할 수 있다. 컴퓨터들은 영어 알파벳이 아닌 다른 문자들도 ASCII처럼 쉽게 문자 기호들(symbols)을 조작할 수 있다.
    유니코드(unicode)는 16 비트를 사용해서 문자를 비트형태로 어떻게 표현할 것인가를 국제 위원회를 통해 만들어진 기준 또는 동의안(agreement)이다.
    여기 16 비트 111110011111110 가있습니다 그리고 이 16 비트의 형태는 유니코드(unicode)에서 茶 로 표현된다.
    만약에 국제위원회에서 새로운 한자를 표현하도록 결정했다고 가정하자. 어떻게 이것을 컴퓨터로 표현하는 것이 가능할까요?
    쉽습니다: 아직까지 어떤 기호(symbol)에도 사용되지 않았던 비트 형태를 찾아내 그 형태가 새로운 글자를 나타내는것으로 지정하면 된다.

    언어의 문자 기호(symbol)와 비트의 형태는 임의적인(arbitary) 것이다.
    여기서 유의할 점은 모든 언어가 갖는 문자기호들을 표현하고 담기위해서는 충분히 많은 비트가 필요하다는 점이다.


    질문: 음악 악보 같은 것을 바이너리 또는 이진수로 표현할 수 있을까요?

    1.14 기호와 패턴 Symbols and Patterns

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_14.html
    답: 물론입니다. 어떤 기호(symbols)도 표현이 가능합니다. 워드프로세서가 글자를 다루는 프로그램인것처럼 악보를 다루는 음악 프로그램도 있습니다.

    바이너리의 마지막 장점을 다시 기억해 봅시다:

    • 패턴으로 표현할 수 있는 어떤 것이든 비트의 패턴(pattern)으로 표현될 수 있다.

    언어의 문자같은 것이 아닌 추상적인 개념은 어떻게 바이너리로 표현 할까요? 아마도 이런 주제로 책 한 권을 써도될 것이다. 대략적 이나마 논점을 다음과 같이 설명해보자. 어떤 주제를 정해서 그것을 문장으로 서술해 보자. 그 문장을 ASCII 코드 같은 바이트 형태화된 문자들로 표현해 보자. 그렇다면 이제 주제는 바이너리로 일단 표현된 것이다. 만약 어떤 것이 언어로 표현될 수 있는 것 이라면, 곧 그것은 바이너리로도 표현될 수 있다.

    이것은 주제의 "의미"나 "이해"라는 차원과는 무관하다. 인쇄된 책이 그 책 자체가 담고 있는 내용을 이해 하는것은 아니다. cd-rom에 담겨질 수 있는 디지털 버전의 책도 책 자체가 그 책의 내용을 이해해서 그것을 담고 있는 것은 아니다. 사람이 이해할 때까지 정보를 담고 있을 뿐이다. 전자책은 그러한 정보를 비트 패턴으로 담고 있을 뿐이다.

    어느 누구도 이진수와 같은 바이너리 표현이 쓰기 쉽다고 하지는 않았다. 바이너리 표현 방식은 숫자 같은 것을 표현하는데 컴퓨터가 사용하기에 편한 것이지 사람이 이해하기는 어려운 것이다. 컴퓨터 과학자들이 하는 일 중에 많은 부분이 바이너리를 사용해서 쓸모있는 것을 어떻게 표현할 까를 고민한고 이해하는 것이다. 예를들어 지난 십년간 컴퓨터 공학에서 많은 부분의 작업들이 이미지와 오디오의 정보를 어떻게 최고로 표현할 것인가에 집중되었다.

    중요점:

    컴퓨터 메모리가 담고있는 모든 것이 1과0인 비트의 패턴이다. 그 비트 패턴들이 무었을 표현하는가는 사용하는 사람 마음이다.

    질문:

    사람들이 종종 "컴퓨터는 숫자만 다룰 줄 알지.숫자 이외의 것은 이해할 줄 모른다"라고 말을 합니다. 여러분은 이것이 맞다고 생각 하십니까?

    1.15 2 장 끝

    http://chortle.ccsu.edu/AssemblyTutorial/Chapter-02/ass02_15.html

    답: 전기기기적 차원에서 모든것이 이진수 즉 바이너리의 형태이다 이것을 가지고 사람들은 단지 숫자들 이라고 말할 수 있다. 그렇게 말하는 것은 어느 정도 맞는 표현 일 수 있다.
    그렇지만 숫자 뿐만 아니라 어떤 종류의 기호나 상징적인 데이터도 바이너리를 사용하여 표현할 수 있다는 점을 유념하자.

    알아야 될것:
    바이너리가 의미하는 것이 무엇인가.
    비트란 무엇인가.
    바이너리를 컴퓨터에서 사용할 때의 장점.
    아날로그란 무엇인가.
    경계영역 또는 임계영역(threshold)이 어떻게 사용 되었는가.
    컴퓨터에서 마스터 클럭이란.
    메모리는 비트 형태를 그 내용으로 담는다.

    2장 [http]퀴즈를 꼭 풀어봅시다.
    :::
    2007/04/16 23:50

    번역]Coumpter Science Using Java 1장


    최근에 번역 진행중인 Computer Science Using Java의 첫장입니다. 번역은 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Java/Documents/ComputerScienceUsingJava 에서 이루어지고 있습니다. 장단위로 완성되는 대로 올려볼 생각입니다.

    1 컴퓨터 시스템에 대한 소개

    컴퓨터는 다양한 종류의 소프트웨어와 하드웨어 컴포넌트의 조합으로 이루어진 복잡한 시스템이다. 이번 장에서는 다음과 같은 주제를 다룰 것이다.
    • 하드웨어와 소프트웨어
    • 컴퓨터 시스템의 구성요소
    • 네트웍스
    • WWW(월드 와이드 웹)


    질문 1:
    영화 몬스터주식회사에 대해서 어떻게 생각하십니까 ?


    1.1 하드웨어와 소프트웨어

    영화 몬스터주식회사에 나오는 괴물들에 대해서 생각해보자. 알고 있겠지만 영화는 무형의 정보로 이루어진다. 그것은 형태가 없는 정보로 움켜쥐거나 벽에 던지거나 할 수 없으며, 또한 무게 라든지 크기와 같은 구체적인 어떤 것들도 가지고 있지 않다. 괴물들은 물리적으로 존재하지 않는 것들이다. 괴물들은 VCR 테이프상에 기록되어서 존재하고 있을 뿐이다. 비록 테이프가 물리적인 것이긴 하지만 기록된 내용 자체는 무형의 정보들이다. '몬스터주식회사를 보고 이에 대해서 친구들에게 얘기 할때, 아마도 당신은 물리적으로 실존하는 테이프가 아닌, 테이프에 기록된 무형의 영화를 주제로 얘기를 할 것이다.

    몬스터주식회사를 보기 위해서는 TV역시 필요하다. 이것은 물리적으로 실존한다. 당신은 그것의 무게나 크기를 느낄 수 있으며, 열받을 경우 벽에 던져버릴 수도 있고, 망치로 내리쳐서 산산조각을 낼 수도 있다.

    hardware(이하 하드웨어)는 TV와 VCR테이프와 같은 물리적으로 실존하는 장치들을 일컫는다. 이러한 하드웨어를 통해서 상영되거나 동작하는 영화, 컴퓨터 프로그램과 데이터, 음악, 문서등의 무형의 정보를 소프트웨어라고 한다.

    TV를 제대로 활용하기 위해서는 반드시 무형의 소프트웨어인 TV프로그램과 조합이 되어야 한다. TV 그 자체 만으로 할 수 있는 것은 아무것도 없다. 컴퓨터 시스템 역시 마찬가지로, 컴퓨터가 제대로 활용되기 위해서는 하드웨어 구성요소와 소프트웨어 구성요소가 조화를 이룰 수 있어야 한다.

    질문 2:
    Imagine that you have a copy of Mark Twain's Tom Sawyer. You tear it to pieces and push the shreds through your garbage disposal. Have you destroyed Tom Sawyer?
    마크 트웨인의 톰소여의 모험을 한권 가지고 있다고 상상해보자. 책을 찢어 분쇄기에 넣어 돌린 후 쓰레기통에 버렸다고 해보자. 이럴때 톰소여의 모험을 없애버렸다고 할 수 있는가?

    1.2 컴퓨터 시스템의 구성요소

    컴퓨터 시스템은 하드웨어와 소프트웨어 양쪽의 구성요소들로 구성이된다.
    • 컴퓨터 시스템에서 하드웨어 구성요소는 전자회로들이다.
    • 소프트웨어 구성요소는 무형의 요소들로, 데이터와 컴퓨터 프로그램들이다.

    컴퓨터 시스템의 주요하드웨어 구성요소는 다음과 같다.
    • 프로세스
    • 메인 메모리
    • Secondary 메모리
    • 입력장치 (Input Device)
    • 출력장치 (Output Device)

    프로세서, 메인 메모리, Secondary 메모리, 전원 공급장치들은 시스템 유닛에 포함된다. 이들 시스템 유닛들은 통상 컴퓨터로 불리우는 금속으로된 케이스에 위치한다. 또한 컴퓨터는 다양 한 입력장치(키보드와 같은)와 출력장치(모니터 같은)을 추가할 수 있는 구조를 가진다. 이들 시스템 유닛은 컴퓨터 내부에서 가장 큰 면적을 차지하는 메인 서킷 보드에 붙게 된다. 이 메인 circuit 보드는 많은 다른 구성요소들을 포함하는데, 흔히 motherboard(마더보드)라고 브란다. 전원 공급장치 (Power supply)는 모든 구성요소에 전원을 공급하는 일을 한다.

    질문 :
    마우스는 입력장치인가 아니면 출력장치인가 ?

    1.3 하드웨어 구성요소

    input(입력) 과 output(출력)은 시스템 유닛으로의 데이터 흐름의 방향을 나타내기 위해서 사용한다. 다음그림은 컴퓨터 시스템에서의 주요 하드웨어 구성요소를 보여주고 있다. 화살표는 데이터 흐름의 방향을 보여준다.

    figure1-1.gif

    bus(버스)는 컴퓨터의 메인서킷보드에 있는 선들의 그룹이다. 이것은 각 구성요소간의 데이터흐름의 통로가 된다. 모든 장치(device)들은 장치들은 controller를 통해서 버스와 연결이 된다.

    processor는 1인치 정도의 크기를 가지는 전자장치이며, 플라스틱커버로 보호되고 있다. 이 사격형 전자기기의 내부는 실리콘으로 둘러싸인 수많은 전자적 장치로 구성이 된다. 하나의 프로세서는 수백만의 트랜지스터들로 구성이된다. 프로세서는 컴퓨터 시스템의 두뇌에 해당되며, 모든 다른 컴포넌트를 직간접적으로 제어하고 필요한 연산작업을 수행한다.

    이 프로세서는 Central Processing Unit으로 불리우며 간단하게 CPU라고 부른다. 이들 CPU는 컴퓨터의 특징에 따라 다양한 종류가 사용된다. 예를들어 여러분의 PC에는 Pentium 프로세서가, Sun의 워크스테이션에는 SPARC 프로세서가 탑제되어 있다.

    질문
    13과 27을 더하는 연산은 컴퓨터의 구성요소의 어느부분에서 수행되는가 ?

    1.4 메모리

    프로세서는 컴퓨터의 두뇌에 해당되며, 모든 컴퓨터는 하나이상의 프로세서를 가진다. 프로세서에서 연산된 또다른 계산을 위해서 저장되거나 혹은 다른 구성요소로 전달될 필요가 있다. 이러한 작업을 수행하기 위해서는 데이터가 저장될 공간이 필요하다. 그러나 프로세서는 이러한 저장공간을 가지고 있지 않다.

    연산과 함께 기억까지 동시에 할 수 있는 인간의 두뇌와는 달리, 컴퓨터는 연산을 위한 구역과 저장을 하기 위한 구역이 구분되어 있다. 물론 프로세서도 자체적으로 메모리를 가지고 있기는 하지만, 매우 작은 크기라서 특수한 용도외에 범용적으로 사용하기는 힘들다. 그래서 컴퓨터는 별도의 메모리 영역을 가지게 된다. 컴퓨터 시스템은 두가지 타입의 메모리 구성요소를 가진다.
    • 메인 메모리 :
      • 프로세서와 직접 연결되어 있다.
      • 내용은 빠르고 쉽게 바뀔 수 있다.
      • 프로세서는 초당 수백만회 정도 메모리에 대한 접근을 할 수 있다.
    • Secondary 메모리 :
      • 버스와 컨트롤러를 통해서 메인 메모리와 연결된다. (프로세서와 물리적으로 멀리 위치한다)
      • 내용은 빠르고 쉽게 바뀔 수 있으나, 메인메모리의 그것 보다는 느리다. (물리적으로 멀리 떨어져 있기 때문에)
      • 프로그램이나 데이터를 오랜시간 저장하기 위해서 사용한다.
      • 이들 데이터가 이용되기 위해서는 반드시 메인 메모리로 복사가 되어야 한다.

      질문
      메인메모리와 Secondary메모리중 어느게 빠른가.

    1.5 메인 메모리

    메인메모리는 활성화된 프로세서가 프로그램과 데이터를 저장하기 위해서 사용된다. 프로그램과 데이터가 생성이되면, 이것들은 Secondary 메모리에서 메인메모리로 복사가 되고, 프로세스가 이용할 수 있게 된다. 메인 메모리는 프로세스와 가까운 위치에 있으므로, 프로그램과 데이터를 이동하는등의 작업을 빠른시간에 수행할 수 있다. 메인 메모리는 보통 RAM이라고 불리운다. RAM은 Random Access Memory의 줄임말이다. 여기에서 Random이 의미하는 바는 데이터의 위치에 관계없이 읽어들일 수 있음을 의미한다. 다른 예로 Tape와 같은 Secondary 메모리장치는 순차적으로 데이터에 접근할 수 있다. 만약 데이터가 테이프의 가장 마지막 부분에 저장되어 있다면, 마지막까지 테이프를 돌려야 한다.

    사람들은 흔히 내 컴퓨터는 512Mega Byte의 램을 가지고 있다라고 말하는데, 이는 메모리의 크기가 그 정도임을 의미하는 것이다. 1Mega byte는 대략 100만개의 문자를 저장할 수 있다. 메인메모리에 있는 데이터는 영속적인게 아니다. 데이터가 필요할 때까지만 존재하며, 어떤 데이터는 단 몇초만 존재하고 사라지기도 한다.

    질문
    컴퓨터를 이용해서 일기를 쓴다고 가정해보자.
    • 일기를 위해서 사용되는 워드프로세서 프로그램은 어디에 존재하는가 ?
    • 당신이 쓴 글자들은 어디에 위치하는가 ?

    1.6 Secondary 메모리

    Secondary 메모리는 오랜시간동안 데이터나와 프로그램을 저장할 필요가 있을 경우 사용한다. 아마도 현재 가장 널리 사용되는 Secondary 메모리 장치는 Hard Disk와 CD-RW일 것이다.
    • 하드디스크는 메인메모리에 비해서 거대한 크기의 저장공간을 제공한다.
    • 하드디스크는 보통 컴퓨터시스템의 내부에 하나의 유닛으로 포함된다. (외장 하드디스크와 같이 외부에 위치하는 것들도 있다)
    • 하드디스크는 데이터와 프로그램을 오랜시간 저장하기에 좋다.
    • 데이터와 프로그램은 하드디스크 상에 파일의 형태로 존재한다.

    개인 컴퓨터라고 하더라도 보통 100Giga가 넘는 크기의 하드디스크를 가지고 있는데, 이는 메인메모리의 100배에서 200배에 해당하는 크기다. 하드디스크는 메인메모리에 비해서 느리며, 컴퓨터 시스템이 느려지는 대부분의 이유는 느린하드디스크 접근속도에 기인한다. 다음은 메인 메모리와 Secondary 메모리 두가지 타입을 비교한 것이다.
    Primary Memory Secondary Memory
    빠르다 느리다
    작은 용량 큰 용량
    프로세서에서 직접 제어 간접제어

    모든 Secondary 메모리가 큰용량을 제공하는 것은 아니다, (지금은 거의 쓰이지 않지만) Floopy 디스크와 같이 매우 느리고, 적은 용량을 지원하는 것들도 있다. 한때는 데이터를 백업받기 위해서 플로피 디스크를 사용했지만 지금은 CD-RW 혹은 (일부)Tape를 사용한다.

    질문
    Doom III게임을 구입해서 컴퓨터에 인스톨 했다고 가정해 보자. 게임은 다음과 같이 구성되어 있다.
    • 프로그램
    • 데이터 (이미지와 같은 정보들)
    인스톨이 끝난뒤 프로그램과 데이터는 컴퓨터시스템의 어디에 위치하는가 ?

    1.7 입/출력 장치

    입력장치와 출력장치는 컴퓨터와 시스템 외부사이에 데이터를 움직일 수 있게 해주는 연결고리(Interface)역할을 한다. 입력장치(Input Device)는 시스템 내부로 데이터를 전달한다. 다음은 대표적인 입력장치의 종류들이다.
    • 키보드
    • 마우스
    • 마이크폰
    • 바코드 리더기
    • 타블랫(그래픽 디자이너를 위한)

    출력장치는 시스템에서 바깥으로 데이터를 내보니기 위해서 사용한다. 다음은 대표적인 출력장치들이다.
    • 모니터
    • 프린터
    • 스피커

    입력/출력 장치는 일반적으로 I/O Device (이하 입출력 자치) 라고 불리운다. 이들 장치는 device controller이라고 불리우는 시스템 유닛에 의해서 내부의 모듈들과 전기적으로 연결된다. 예를 들어, 멀티미디어 컴퓨터의 필수요소인 스피커는 audio card와 device controller로 연결이 된다.

    Secondary 메모리 장치로 분류되는 하드디스크 역시 입출력 장치가 된다.

    유저입장에서 입출력 장치란 시스템박스의 바깥에 있는 장치들이 되겠지만, 프로그래머 입장에서는 프로세스와 메인메모리를 제외한 모든 것들이 입출력 장치가 된다. 프로세서를 디자인하는 엔지니어 입장에서는 프로세서를 제외한 모든 것들이 입출력 장치가 될 것이다.

    특별하게 제작된 장치만을 제어하기 위해서 만들어진 프로그램을 탑제한 컴퓨터인 임베디드 시스템도 존재한다. 이러한 임베디드 시스템은 제어할 장치와 프로그램을 ROM (Read Only Memory)에 영구히 적재시킨 상태로 제작이 된다. 전체 프로세서 시장에서 임베디드용의 수요는 최근 증가세에 있다.

    질문
    현대의 모든 자동차는 컴퓨터에 의해서 제어된다. 자동차용 컴퓨터가 가지고 있는 것들에 대해서 생각해보자.
    • 입력 장치는 있는가 ?
    • 출력 장치는 있는가 ?
    • main 저장장치 있는가 ?
    • secondary 저장장치 있는가 ?

    1.8 소프트웨어

    컴퓨터 소프트웨어는 프로그램데이터로 구성된다. 프로그램들은 프로세스연산을 위한 명령어들의 목록을 가지고 있다. 데이터는 문자, 숫자, 이미지, 오디오 등과 같은 프로그램이 필요로 하는 정보들이다. 서로 다른 구성요소를 차지하고 있지만, 프로그램과 데이터는 컴퓨터 입장에서는 동일하게 취급된다.

    Fundmental Idea:
    프로그램과 데이터는 컴퓨터메모리에 동일한 방식으로 저장되며, 프로그램과 데이터사이에는 아무런 차이가 없다.

    프로그램과 데이터가 같은 전기적 방식으로 저장되고 사용된다는 점을 이해하는 것은 컴퓨터과학을 이해하는 가장 중요한 요소다.
    질문:
    다음중 플로피디스크에 저장할 수 있는 것들은 ?
    • 게임 프로그램
    • 숫자정보들
    • 오디오 데이터
    • 그래픽 데이터
    • 디지털 이미지들
    • 비디오 데이터

    1.9 프로그램의 종류

    프로그램은 크게 두종류로 나눌 수 있다. Application 프로그램 (이하 응용 프로그램)과 Systems 프로그램 (이하 시스템 프로그램이)이 그것이다. 전자는 사람이 사용하기 위한 목적으로 제작된 프로그램이고, 후자는 컴퓨터 시스템을 제어하기 위한 목적으로 제작된 프로그램이다. 사실 프로그램을 단순히 두개의 종류로 구분하기에는 애모모하한 면이 있기는 하지만, 편의상 이렇게 분류를 했다. 다음은 응용 프로그램과 시스템 프로그램의 차이점을 보여주는 표이다.
    응용 프로그램 시스템 프로그램
    워드 프로세서 운영체제(12)
    게임 프로그램 네트워크 시스템
    spreadsheets Database 시스템
    그래픽 프로그램 웹 서버
    웹 브라우저 프로그래밍 언어

    이 중 가장 중요한 프로그램은 시스템 프로그램인 운영체제(Operating System)일 것이다. 운영체제는 컴퓨터가 작동하는 동안은 항상 떠 있는 프로그램으로, 컴퓨터 시스템의 소스트웨어와 하드웨어 구성요소들을 제어하는 일을한다. 운영체제는 프로그램을 실행시키고, 실행된 프로그램이 요구하는 자원을 할당하는 일을한다. 여기에서 자원은 하드웨어 구성요소의 쓸수 있는 자원을 말한다. 여기에는 입력을 위한 키보드, 데이터를 저장하기 위한 쓸 수 있는 메모리영역, 결과를 화면에 보여주고 소리를 들려주기 위한 그래픽카드 및 사운드카드 등의 장치가 포함된다.

    최신의 운영체제들은 사용자가 운영체제를 편리하게 사용할 수 있는 유저 인터페이스를 제공한다. 이러한 유저인터페이스는 위해서 윈도우, 버튼, 아이콘, 마우스, 키보드등의 수단을 제공한다. Unix, Linux, Windows, System 10 등의 운영체제가 그러다.

    1.10 운영체제

    1 운영체제는 컴퓨터 시스템의 모든 하드웨어와 소프트웨어를 제어하는 기능을 가진 매우 복잡한 프로그램이다. 이 소프트웨어는 컴퓨터 시스템을 이루는 하드웨어와 소프트웨어들을 관리하며, 이들을 수행시킨다. 운영체제는 고객의 요청이라면 무엇이든지 수행하는 조그만 가게의 주인과 같은 위치에 있다. 가게주인이 요구하는 물건을 팔고, 물건이 부족하면 들여오고, 재고관리, 장부관리 등의 일을 하듯이, 운영체제도 이러한 일을 수행한다. 운영체제는 프롬프트라는걸 통해서 사용자의 입력을 받아들여서 필요한 일을 한다.

    모든 컴퓨터 시스템은 자신의 목적에 맞는 운영체제를 가지고 있다. 예를 들자면, Pentium기반의 컴퓨터는 Linux나 윈도우즈와 같은 운영체제를 가지고 있다. 일반적으로 하나의 컴퓨터시스템에는 하나의 운영체제만 설치되지만, 2개 이상의 운영체제를 설치해서 운용하기도 한다. Vmware와 같은 소프트웨어를 사용하면 하나의 컴퓨터 시스템에서 두개이상의 운영체제를 동시에 운용할 수 있지만, 보통은 한번에 하나의 운영체제만을 운용할 수 있으며, 다른 운영체제로 변경하기 위해서는 컴퓨터를 껏다 켜야 한다.

    1.11 프로그램 실행하기

    컴퓨터가 실행되면, 하드웨어에서 자동적으로 운영체제가 가동되고, 컴퓨터 시스템을 원할히 제어하기 위한 여러가지 작업을 수행하게 된다. 이러한 과정을 booting이라고 한다. boot의 사전적의미는 장화를 신다라는 뜻이다. 그러하니 booting는 장화를 신고 있는정도로 해석하면 될것이다. 이는 운영체제가 bootstrap라 는 프로그램에 의해서, 주기억장치에 올려지기 과정이, 장화를 신는 과정에 비견할 수 있기 때문으로, 컴퓨터가 운영체제를 신는 과정이라고 이해할 수 있다. 운영체제가 성공적으로 올라오게 되면, 비로서 다른 응용 프로그램들을 실행시킬 수 있는 상태가 된다.

    다음은 응용 프로그램이 시작될 때, 어떤일이 생기는지를 차례대로 나열했다. (운영체제는 이미 실행중에 있다고 가정한다.)
    1. 사용자가 응용 프로그램을 실행한다.
      • 이 과정은 아이콘을 클릭하거나, 프롬프트에 명령을 직접입력함으로써 이루어진다.
    2. 운영체제는 응용의 이름을 확인한다.
    3. 운영체제는 응용 프로그램이 하드디스크의 어디에 저장되어 있는지를 찾는다.
    4. 운영체제는 주 메모리에서 응용 프로그램을 실행시킬만한 (사용하지 않고 있는)충분한 공간이 있는지를 확인한다.
    5. 운영체제는 응용프로그램과 데이터를 메인메모리에 복사한다.
    6. 응용 프로그램을 위한 자원을 확보한다.
    7. 드디어 응용 프로그램이 시작된다.

    응용이 실행되면, 운영체제는 뒤에서 시스템의 자원을 관리하고, 응용 프로그램의 입출력을 관장한다 (키보드를 이용한 사용자의 입력을 받아들여서 응용에 전달하고, 처리된 결과를 모니터를 통해서 사용자가 볼 수 있도록 출력한다.)

    1.12 네트워크

    컴퓨터 네트워크는 두개 이상의 컴퓨터가 연결되어서, 데이터와 프로그램을 주고받을 수 있도록 구성된 상태를 의미한다. 컴퓨터가 이 네트워크에 참가하게 되면, 네트워크를 제어할 수 있는 프로그램에 의해서 네트워크로 연결되어 있는 다른 컴퓨터에 데이터를 보낼 수 있게 된다. 상업/산업용 컴퓨터들의 대부분은 네트워크에 연결된 상태로 운용된다. 이렇게 컴퓨터가 네트워크에 참여해서, 데이터를 공유하기위해서는 운영체제가 네트워크를 제어할 수 있는 기능을 가지고 있어야 한다. 현재 대부분의 운영체제는 이러한 네트워킹 기능을 가지고 있는데, 이러한 네트워크 기능을 사용할 수 있는 응용 프로그램을 이용해서 컴퓨터들간의 데이터를 공유하게 된다.

    비고적 가까운 거리에 수십개 정도의 컴퓨터가 연결된 상태를 Local-Arean Network 라고 한다. 줄여서 LAN이라고 부르며, 근거리 네트워크라고 부르기도 한다. LAN의 가장 일반적인 경우는 프린터를 공유하는 예가 될것이다. 이러한 네트워크 상에서 프린터나 하드디스크와 같은 자원을 제공하는 측을 Server라고 부른다. 파일 전송을 위한 FTP 같은 경우에는 파일을 저장할 하드디스크 공간을 제공하는 컴퓨터가 Server가 된다. 이는 Email, 웹과 같은 경우에도 동일하게 제공된다.

    각각의 컴퓨터는 Network Interface Card라는 컴퓨터 시스템 유닛에 의해서 네트워크에 연결된다. 이 장치는 케이블을 통해서 다른 컴퓨터의 Network Interface Card에 연결되며, 데이터의 입력과 출력을 담당하게 된다.

    1.13 WAN

    LAN이 비교적 가까운 거리의 소규모의 컴퓨터를 연결하는 네트워크라면, WAN은 수천, 수만의 먼거리에 있는 컴퓨터들을 연결하기 위한 네트워크다. Wide-Area Networks라고 불리우는 이 네트워크는 광케이블, 전화선, 전파, 인공위성 등으로 서로 연결된다. 각각의 컴퓨터는 네트워크상에서 식별되기 위해서 network address를 가진다.

    WAN은 수천, 수만의 컴퓨터가 연결되어 있고, 이들 사이의 데이터 흐름을 관리해야 하므로, 데이터 흐름을 관리하기 위한 특별한 장치가 필요하다. 이러한 장치들이 데이터의 흐름을 효과적으로 관리하기 위해서, protocol이라는 것을 사용한다. 이것은 일종의 규약으로, 편지를 보낼때, 우편번호를 어떻게 적어야 하는지를 약속하는 것과 동일한 것으로, 이런이런 약속에 의해서 데이터를 보내면, 원하는 곳까지 안전하게 보낼 수 있다는 것을 보장한다. 네트워크 상에서는 TCP/ IP라는 프로토콜을 사용한다. 이들 프로토콜은 수천/수만의 컴퓨터 사이에서 데이터가 원하는 목적지까지 흐를 수 있음을 보장한다.

    1.14 인터넷

    Internet는 많은 수의 WAN이 서로 연결된 worldwide(지구규모)의 네트워크다. 수천만 이상의 컴퓨터가 연결되어 있으므로, 각각의 컴퓨터는 유일한 network address를 가지고 있어야만 한다. 이 네트워크 주소를 IP address라고 한다. 우편주소 혹은 전화번호라고 볼 수 있다.

    IP 주소는 다음과 같은 형식을 가진다.
    149.152.18.25

    IP주소는 32비트의 크기를 가진다. 이것은 4294967296 개 정도의 컴퓨터에 유일한 번호를 부유할 수 있는 크기다. 그러나 이렇게 숫자로 나타내면 관리하기가 어렵기 때문에, .을 구분자로 해서 8byte씩 4자리로 표기를 한다. 이렇게 하면 숫자보다는 관리하기 편하지만 역시 인간이 인지하기 쉽지 않기 때문에, 다음과 같이 문자로된 이름을 쓴다.
    chortle.ccsu.edu
    www.joinc.co.kr

    이러한 컴퓨터 이름은 IP 주소와 대칭된다. 웹브라우저등을 통해서 위의 주소를 입력하면 최종적으로는 32bit 숫자주소로 변환이 되어서 컴퓨터의 주소를 식별하게 된다.

    1.15 World Wide Web


    일단 다음의 주제를 다시 상기해 보도록한다. (앞에서 이미 다루었었다)
    컴퓨터 메모리상에서 프로그램과 데이터는 같은 방식으로 저장된다. 이 둘을 구분하기 위한 어떠한 장치도 가지고 있지 않다.

    컴퓨터에 있어서 프로그램과 데이터간의 차이가 없다는 명제는 다른 모든 정보에 공통적으로 적용된다. 네트워크를 통해서 전달될 때도 마찬가지다. 인터넷상에서 데이터의 전송은 우편서비스와 매우 유사하다. 우편물을 제대로 전달하기 위해서 보내는 주소와 받을 주소를 명시하는 것처럼, 인터넷상의 데이터도 동일한 방식으로 전달된다.

    인터넷은 World Wide Web (이하 WWW)에서 기계와 정보의 종류에 상관없이 정보를 전달할 수 있도록 다양한 프로토콜을 제공한다. 예를들어 웹페이지 서비스를 받는다고 가정해보자. 웹페이지를 볼 수 있도록 하기 위해서 HTML이 라는 프로토콜이 사용되는데, 이 프로토콜이 사용되면, 여러분이 윈도우를 사용하건 리눅스를 사용하건 혹은 솔라리스가 설치되 Sparc 컴퓨터를 사용하건간에 관계없이, 웹브라우저를 통해서 웹페이지를 볼 수가 있다. HTML 프로토콜을 따라서 만들어진 문서는 이렇게 표시하면 된다라고 약속으로 정해져 있기 때문이다.

    1.16 Hyperlinks

    웹 페이지는 hyperlink를 통해서 연결된다. 당신이 웹상에서 문서를 읽는 도중에, 참고문서를 연결해야할 경우 hyperlink를 사용할 수 있다. 이렇게 해서 문서와 문서가 서로 연결이 된다.

    웹 브라우저는 사용자가 hyperlink를 색상이나 밑줄등으로 구분할 수 있도록 한다. 사용자가 하이퍼링크위로 마우스를 이동하면 마우스포인터가 변경되며, 클릭하면 연결된 웹페이지로 이동을 한다. 이 웹페이지들은 URL(Uniform resource Locator)로 불리우는, 웹페이지에 직접 대응되는 특별한 이름을 가지고 있다.
    :::