소스 파일명: TestArguments.java

  1. public class TestArguments {
  2.     // C 언어의 main 함수에 준하는 Java 언어의 main 메소드
  3.     public static void main(String[] args) {
  4.         double sum = 0.0;    // 초기화
  5.         // 명령행 인자(command-line argument) 개수 출력
  6.         System.out.println("Count of arguments: " + args.length);
  7.         for (int i = 0; i < args.length; i++) {
  8.             // 스트링을 배정밀도 부동소수점수로 변환하여 누적
  9.             sum += Double.parseDouble(args[i]);
  10.         }
  11.         // 출력 값이 ".0"으로 끝나는 경우 꼬리 제거하기
  12.         String strSum = "" + sum;
  13.         if (strSum.endsWith(".0"))
  14.             strSum = strSum.substring(0, strSum.length() - 2);
  15.         // 누적된 값을 출력한다.
  16.         System.out.println("The sum of arguments is " + strSum);
  17.     }
  18. }

컴파일> javac -d . TestArguments.java

실행> java TestArguments 1 2 3 4
Count of arguments: 4
The sum of arguments is 10

실행> java TestArguments 1 2.1 3 4.5
Count of arguments: 4
The sum of arguments is 10.6





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,
<iostream.h>는 C++의 표준안이 확립되기 전에, 관습처럼 사용되던 표준 입출력 라이브러리의 헤더였습니다. 현재의 C++표준안이 확립된 것은 1998년으로, 최초의 C++표준 문서는 ISO/IEC 14882:1998 이었죠. 따라서, 1998년 이전에 출시된 개발 툴은 관습적으로 <iostream.h>헤더를 포함하여 나왔습니다.



표준안 논의 과정에서 네임스페이스가 포함되고, 모든 표준 라이브러리의 요소를 std 네임스페이스에 넣어야 한다고 결정함에 따라, 기존 헤더에 선언되어 있던 전역 요소들 때문에 더이상 같은 파일이름을 사용해서는 안되는 상황이 된 것이죠. 즉, 어떤 환경에서는 <iostream.h>파일을 포함하면 cout이 std 네임스페이스에 소속되어 있어서 cout 이라는 이름을 사용자가 사용하였는데, 다른 환경에서는 표준 스트림 라이브러리의 cout이 전역에 소속되어 있다면, 당연히 컴파일시 에러를 내겠죠. 이러한 문제 때문에 기존에 사용되던 모든 C++표준 라이브러리에 있던 모든 요소는 std 네임스페이스에 넣고 .h 확장자를 제거하여 헤더를 제공하는 것으로 표준안이 마련되었습니다. 더불어 기존 C 표준라이브러리의 요소 역시 std 네임스페이스에 소속시키고, .h확장자를 제거하고 c접두어를 붙인 헤더에 담아 제공하게 되죠. 즉, <stdio.h> => <cstdio> , <math.h> => <cmath> 와 같은 식의 헤더 역시 기존 C스타일 헤더와 더불어 제공합니다. 물론, C++표준 라이브러리의 헤더는 확장자가 없는 표준 헤더만을 제공하죠.



결론적으로, .h 확장자가 붙는 헤더는 과거, 1998년 이전의 관습을 따르던 것이며, .h확장자가 없는 것이 1998년에 제정된 표준을 따르는 표준 헤더입니다. 이 두 헤더 사이의 결정적인 차이점은, 구성 요소의 이름이 std네임스페이스에 소속되어 있느냐 아니냐의 차이이죠. 표준헤더(<iostream>)는 std 네임스페이스에 선언되어 있으며, 이전의 관습적 헤더(<iostream.h>)는 전역으로 선언되어 있습니다.


<iostream>을 선언하고
using namespace std; 를 사용하면 cin cout을 사용할 수 있다.

<iostream>만 선언할 경우에는 scanf, printf와 같은 함수를 사용할 수 있다.

Posted by Scripter
,

C++ 언어는 C언어와 달리 객체지향(obeject oriented) 언어이다.
C++ 언어에서 클래스(class) 라고 하는 것은 C 언어의 구조체(struct) 개념을 확장한 것이다.
C 언어의 구조체(struct)는 자료(데이터)만 가질 수 있지만, C++ 언어의 클래스(class)는 자료 뿐만이 아니라 자료를 핸들링하는 메소드도 가질 수 있다.
메소드란 클래스에 소속된다는 것이 C 언어의 함수와 구별된다.

클래스 변수를 선언험과 동시에 클래스에 속한 자료와 메소드는 동적으로 로딩되어 힙(heap)이라는 메모리에 탑재된다.

C 언어의 구조체 정의 구문 양식:
  struct 구조체명 {
      타입 변수명1;
      타입 변수명2;
          ...........
      타입 변수명n;
};

C++ 언어의 클래스 정의 구문 양식:
  class 클래스명 {
     접근유형1:    // 접근 유형은 public, protected, procate 등
        타입 변수명1;
             ...........
        타입 변수명n;
        타입 함수명1;
             ...........
        타입 함수명n;

     접근유형2:
        타입 변수명1;
             ...........
        타입 변수명n;
        타입 함수명1;
             ...........
        타입 함수명n;
};



소스 파일명: forTestObject.cpp
------------------------------[소스 시작]
#include <iostream.h>

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();   // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    cout << dan << " x " << i << " = " << (dan*i) << endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

위의 소스에서 endl 은 C 언어의 개행 문자 "\n"에 해당한다.
컴파일은 Visual C++ 6.0을 써서 한다.

컴파일> cl forTestObject.cpp

(참고: 에러 없이 컴파일이 순조롭게 끝나면 현재 디렉토리에 forTestObject.obj라는 목적 파일과 forTestObject.exe라는 살행 파일이 존재할 것이다.)

실행> forTestObject
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


확장자명이 cpp인 소스도 (컴파일 과정 없이) Ch에 의하여 직접 실행된다.

Command> ch forTestObject.cpp
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18


위의 소스는 표준화되기 전의 C++ 소스이다. 1998년에 정해진 C++표준화에 따르면 헤더 파일 포함 구문이

        #include <iostream.h>
        #include <string.h>
        #include <math.h>
        등

으로 부터

        #include <iostream>
        #include <string>
        #include <cmath>
        등

으로 변경되었다. 이렇게 변경해야 표준 C++에서 printf 등을 쓸 수 잇다. 하지만 cout, cin 등은 std::cout, std::cin 등으로 써야 한다. 이것이 불편하다면 헤더 파일 포함(include) 구문이 끝난 후

        using namespace std;

라는 한 줄만 추가하면 된다.
(내부 참고:  C 유저를 위한 C++ 팁 모음)
(상세 외부 참고: 방법: 표준 C++ 프로그램 만들기)
    
다음 소스는 forTestObject.cpp 를 표준 C++에 따라 재작성한 소스이다.


소스 파일명: forTestObject2.cpp
------------------------------[소스 시작]
#include <iostream>

using namespace std;

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();  // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    cout << dan << " x " << i << " = " << (dan*i) << endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

컴파일은 Visual C++ 6.0을 써서 한다.

컴파일> cl /GX forTestObject2.cpp
   (또는) cl -GX forTestObject2.cpp
   (또는) cl /EHsc forTestObject2.cpp
   (또는) cl -EHsc forTestObject2.cpp

(실행 결과는 위와 같다.)

이 소스도 (컴파일 없이) 직접 Ch로  실행된다.

Command> ch forTestObject2.cpp
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



Linux(또는 Unix) 플랫폼에서 gcc나 g++gh 컴파일 하는 경우라면 main 함수만 다음 처럼 수정하면 된다. Linux(또는 Unix) 플랫폼의 경우에는 C++ 소스의 확장명을 보통 cc로 한다. 따라서 소스 파일명을 forTestObject2.cc로 저장하여 컴파일한다.

// main 함수
int main() {
  ForTestObject test;
  test.printDan(2);
  return 0;
}

컴파일> gcc -o forTestObject2 forTestObject2.cc
   (또는) g++ -o forTestObject2 forTestObject2.cc

실행> ./forTestObject2
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



다음 예제는 namespace std 를 사용하지 않은 C++ 소스이다.
이 경우에는 cout, cin, endl 대신에 정규화된 이름 std::cout, std::cin, std:endl을 써야 한다.
(참고: 정규화된 이름을 사용한 다음 소스는 Ch 5.5로는 실행되지 않는다.)

소스 파일명: forTestObject3.cpp
------------------------------[소스 시작]
#include <iostream>

class ForTestObject {
  public:
    ForTestObject();   // 생성자
    ~ForTestObject();  // 소멸자
    void printDan(int dan);
};      // 클래스 정의 구문은 반드시 세미콜론(;)으로 끝나야 한다.

// 생성자 정의
ForTestObject::ForTestObject() {
}

// 소멸자 정의
ForTestObject::~ForTestObject() {
}

// printDan() 함수 정의
void ForTestObject::printDan(int dan) {
  int i;
  for (i = 1; i < 10; i++) {
    std:cout << dan << " x " << i << " = " << (dan*i) << std::endl;
  }
}

// main 함수
void main() {
  ForTestObject test;
  test.printDan(2);
}
------------------------------[소스 끝]

컴파일> cl /GX forTestObject3.cpp
   (또는) cl -GX forTestObject3.cpp
   (또는) cl /EHsc forTestObject3.cpp
   (또는) cl -EHsc forTestObject3.cpp

(실행 결과는 위와 같다.)





Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,