2010년 2월 22일 월요일

MS949 로 한글 엔코딩

보통의 경우에는 euc-kr 또는 ksc5601 로 한글엔코딩을 해주면 문제가 없지만.

아주 특별한경우(?)에는 MS949로 한글엔코딩을 해주어야만 한다.

대개의 경우에는 로그창에 엔코딩되지 않은 문장를 찍어보면

#$%... 와 같은 특수문자형식으로 문자열이 찍혀지지만,

#12345;#67890; . . . . 과 같은 일정한 배열의 형식으로 문자열이 찍히는 경우가 있다.

이런형식의 문자열의 경우에는 euc-kr이나 ksc5601의 변환이 적용이 되질 않는다.

그것에 대한 정확한 설명은.. 지식이 부족한 탓에 할수가 없음이 안타깝지만

개인적인 생각으론 기본적인 문자열의 형식이 다르기 때문이라고 생각된다.

그럼 MS949 라는 형식을 통해 한글엔코딩 하는 방식을 알아보자.

========================================================================================

page1 ---> page2 로 한글파라미터를 넘기는 경우.

대부분 JSP페이지 상단에 <%@ page contentType="text/html;charset=euc-kr" %>이라는 코드가

삽입이 된다.

이것을 page1에서는 <%@ page contentType="text/html;charset=MS949" %>를 삽입하고,

page2 에서는 <%@ page pageEncoding="MS949" %> 를 삽입하여 기존의 코드를 대체한다.

그런후 page2에서 받은 파라미터를 아래와 같이 euc-kr이나 ksc5601로 한글엔코딩을 하면

String str = new String(param.getBytes("8859_1") ,"ksc5601");

정상적인 한글로 문자가 변환된다.

 

2010년 2월 19일 금요일

C++ Coding Conventions

version      : v0.6

최종수정일 : 2007.10.15

최종수정자 : 이주현

 

형상품목별 적용언어#

  • C++을 사용한다.

간격#

  • 프로그램에서 서로 다른 기능을 수행하는 블록이나 서브루틴 사이에는 1행 이상의 빈 줄을 삽입한다.
  • 각 블록이나 서브루틴은 적절한 탭 간격으로 들여쓰기를 하고, 블록의 open문과 closer 괄호는 열을 맞추어 프로그램의 이해와 식별을 쉽게 한다.
  • 하나의 탭은 공백 4칸에 맞도록 간격을 설정한다.

문자 사용의 규칙#

  • 소스 코드를 프린터로 출력할 때는 크기 9의 Courier New 폰트를 사용한다.
  • 기술자료 작성 및 규격화에 사용되는 워드프로세서는 한글로 하며, 문자는 굴림체, 크기는 11, 줄 간격은 180%, 문단 위 간격은 5(pt)로 한다. 기타 언급되지않은 사항은 별도의 기술자료 작성 지침서를 따른다.

파일 레이아웃#

  • 파일이름은 첫문자와 각 단어의 첫자는 대문자로 하며, 나머지는 소문자로 한다. ex) ClientSocket.h, ClientSocket.cpp
  • 각각의 소스 파일과 헤더 파일은 아래의 템플릿을 참고한다.

헤더 파일 레이아웃#

  • 인클루드 중복 방지용 #ifdef, #endif 문은 다음과 같이 작성한다.
  • 레이아웃은 아래의 예제와 같은 순서로 기입한다. 하지만, 필요에 따라 각각의 레이아웃에 다른 지정자를 넣거나 선언을 할 수 있다.
  • 아래 예제의 파일의 이름은 Header.h 이다. 주석에 대한 자세한 설명은 다음 장에 설명되어 있다.
  1. /**
     * @file  
     * @author  
     * @version     
     * @brief     
     *
     * @date       
     * @todo     
     */
    #ifndef _HEADER_H_
    #define _HEADER_H_
    /********************************** includes **********************************/

    /*********************************** defines **********************************/

    /********************************** typedefs **********************************/

    /***************************** class declarations *****************************/

    /****************************** extern variables ******************************/

    /*********************** inline function declarations *************************/

    /*************************** function declarations ****************************/


    #endif

소스 파일 레이아웃#

  • 소스 파일에 대한 레이아웃은 아래와 같다. 주석에 대한 자세한 설명은 다음 장에 설명되어 있다.
  1. /**
  2.  * @file  
  3.  * @author  
  4.  * @version  
  5.  * @brief        
  6.  *
  7.  * @date        
  8.  * @todo       
  9.  */
  10. /********************************** includes **********************************/
  11. /*********************************** defines **********************************/
  12. /********************************** typedefs **********************************/
  13. /****************************** global variables ******************************/
  14. /****************************** local variables *******************************/
  15. /***************************** class definitions ******************************/
  16. /**************************** function definitions ****************************/

 

주석에 대한 표준#

  • 기본적으로 doxygen 스타일을 준수한다.

    • @tag + [tab] + 내용 으로 서술한다.
    • 리스트 사용시 공백은 [tab]으로 구분을 하며, 한단계 하위로 내려갈 때 마다 [tab]을 추가한다.
  • 프로그램의 파일 의 주석

    • header 및 source 주석은 각 프로그램 파일의 시작 부분에 위치하며, 다음 사항을 포함한다. 볼드체는 반드시 기입해야 하는 내용이며, 나머지는 상황에 맞추어 추가/삭제 할 수 있다.

      • 파일명 : 현재 파일 명
      • 작성자 : 홍길동
      • 버전 번호 : V0.0(변경사항이 많거나 중요한 경우 소수점 앞의 정수를 1씩 증가시키고, 변경사항이 적거나 중요하지 않은 경우 소수점 뒤쪽의 값을 1씩 증가시킨다.)
      • 파일 설명 : 프로그램에 대한 요약 설명. 구성 모듈, 사용된 알고리즘, 가정, 제한사항, 부작용 등을 기록
      • 변경 이력 : 최초 파일 생성일자경 이력 : YYYY.MM.DD + [tab] + 수정자 이름 + [tab] + 간략한 수정 사항 기록
      • 해야 할 일 : 개선 사항이나 앞으로 추가되어야 할 내용을 기록한다.

 

  1. /**
     * @file       TBCodingConvention.h
     * @author     홍길동
     * @version   V0.1
     * @brief     파일에 대한 간략한 설명을 기술한다.
     *
     * 상세한 설명은 이곳부터 시작한다.
     *
     * @date      
     *   - 2007.10.13   이주현   알고리즘 수정
     *   - 2007.09.10   이주현   먼가를 수정하였음
     * @todo      
     *   - 유니코드에 대비할 것
     *   - 버그를 잡을 것
     */

 

 

  • 클래스에 대한 주석

    • 사용자가 개발한 클래스에 대한 주석은 클래스에 대한 기능을 설명하기 위해 작성되는 것으로서 모든 클래스에 적용되어야 한다. 클래스가 선언된 곳 바로 위에 사용한다. 볼드체 부분은 필수적으로 기입해야 하며, 그외의 항목은 선택적으로 기입한다.
    • 기술 순서는 다음과 같다.

      • friend 클래스
      • 클래스 내부에서 쓰이는 typedef
      • enum 타입 변수
      • public -> protected -> private 순으로 기술하며, 각각 내부에서는 attribute -> contructor & destructor -> operation 순으로 한다. attribute와 operation의 경우, instance 용을 먼저 기술하고 class 용을 나중에 기술한다.
    • 헤더 파일에서는 각 메쏘드에 대한 설명은 하지않고, 소스파일에서 자세히 기술한다.
    • public, protected, private 등의 지시자는 클래스 블럭({) 와 같은 레벨로 들여쓰기를 한다.

 

  1. /**
     * @brief     클래스에 대한 설명을 기술한다.
     *
     * 보다 자세한 설명을 기술한다.
  2.  * @todo
     */
    class CTBCodingConvention
    {
    /// friend 클래스
        friend class CFriendCodingConvention;
     
    /// typedef 타입은 언더스코어를 가지는 대문자이다.
        typedef unsigned int TB_BYTE;

  3. /// enum 타입, EState에 대한 간략 설명
        enum EState
        {
            STATE_APPROVED = 0,     ///< STATE_APPROVED 에 대한 설명
            STATE_REJECTED          ///< STATE_REJECTED 에 대한 설명
        };
     
    public:
    // Attributes 
        // 상수는 모두 대문자이며, 언더 스코어를 가지는 대문자를 사용한다.
        string strCodeName;
        static const char *BASE_NAME    ///< BASE_NAME 상수에 대한 설명

  4. // Constructor & Destructor
        CTBCodingConvention();
        ~CTBCodingConvention();
           
    // Methods
        // 멤버 함수는 대소문자를 섞어 쓰며 동사로 시작하며 첫문자는 소문자이다.
        void printTBStandard(void);
        // Get 또는 Set 멤버함수는 설정하거나 얻어오는 멤버 변수를 이름으로 사용하며, Get 또는 Set 키워드로 시작한다.
        void setNameOfStandard(string name);
        string getNameOfStandard(void);
        static int* getInstance();
    protected:
    // Attributes
       
    // Constructor & Destructor
        int nAccessibleByDerivedClasses   ///< 멤버 변수에 대한 설명
       
    // Methods
       
    private:
    // Attributes
        string strNameOfStandard          ///< 멤버 변수에 대한 설명
        CInfo* pBaseStandard;             ///< 간략한 설명
        static CTBCodingConvention *pInstance;    ///< 간략한 설명

  5. // Methods
        void setInternalHandler(CTBCodingConvention *t_variable);
    };

 

  • 함수에 대한 주석

    • 사용자가 개발한 Function에 대한 주석은 함수 기능을 설명하기 위해 작성되는 것으로서 모든 함수에 적용되어야 한다. 다음과 같은 정보들이 표현되어야 한다. 함수 바로 위 상단에 다음과 같은 사항을 기록한다. 볼드체로 된 항목은 필수적으로 기입해야 하며, 그 외의 항목은 선택적으로 기입한다. 단 인자가 없거나, 리턴 타입이 void일 경우는 생략할 수 있다.

      • 함수 설명 : 함수의 목적을 적는다. 필요한 경우 알고리즘의 설명을 기입한다.
      • 작성자 : 최종 개정한 사람의 이름을 적는다.
      • 최종 수정일 : 최종 개정한 날짜를 적는다.
      • 입력 데이터 : 입력되는 매개변수를 적고, 값의 범위가 중요한 경우 범위를 기입한다.

        • @param + [tab] + 인자이름 + [tab] + 인자에 대한 설명
      • 출력 데이터 : 반환 값의 간략한 설명을 적고, 값의 범위가 중요한 경우 범위를 기입한다.

        • @return + [tab] + 리턴타입(e.g. int, long, so on) + [tab] + 리턴 값에 대한 설명
    • 주석은 반드시 해당 함수 위에 기술되어야 하며, 빈 줄을 삽입하지 않는다.

 

  1. /**
     * @author     함수를 작성한 사람
     * @brief     함수에 대한 설명을 기술한다.
     * @param      name 이름에 대한 설명을 기술한다. 인자가 없다면 생략해도 된다.
     * @return     리턴하는 값에 대한 설명을 기술한다. 리턴하는 값이 없다면 생략해도 된다.
     * @exception  함수에서 발생할 수 있는 예외상황에 대해 기술한다.
     */
    void TBCondingStandard::SetNameOfStandard(string name)
    {
        // 함수의 바디
    }

 

  • 중요한 블록(Block)에 대한 주석

    • 프로그램에서 중요한 코드 블록들은 블록의 상단에 기능 설명을 하는 주석이 반드시 선행되어야 한다.
    • 함수 내부의 소스 코드에 수행하는 작업과 그 순서가 표현되도록 다음과 같이 주석을 작성한다.  형식은 '/// 숫자. 기술내용' 으로 구성된다.

 

  1. /// 1. XXX를 수행한다.
    ...
    /// 2. XXX를 수행한다.
    ...
    /// 3. XXX를 수행한다.
  2. ...

 

  • 라인(Line)에 대한 주석

    • Doxygen으로 파싱되길 원하지 않으면서, 프로그램의 설명이 필요하다고 판단되는 연산(Computation)문과 할당(Assignment)문에는 '//' (슬래시 두개) 주석을 넣는다.
    • 라인 주석은 하나의 라인 뒤에 위치하며 해당 라인의 행위나, 선언된 변수의 설명을 기입한다. 단, 실행문 뒤에 주석을 기입할 수 없는 경우는 실행문 위에 주석을 기입한다.
    • 선언된 변수 값의 범위가 중요할 경우 범위를 기입한다.

 

  1. int nId;           // The player id < MAX_PLAYER

    // 사격이라는 윈도우 화면을 달도록 메시지 전송
    TheApp.m_pMainWnd->SendMessage(WM_CLOSEFRAME, (unsigned int)"사격");
  2. SelectSides(nId);  // Choose partners and positions

 

  • 매크로에 대한 주석

    • 다음 세가지 중 한가지 방법을 택하여 주석을 단다.
  1. /// X와 Y 중 큰 값을 리턴하는 매크로
    #define MAX(X, Y) ((X) > (Y) ? (X) : (Y))

    #define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) ///< X와 Y 중 큰 값을 리턴하는 매크로

    /// @brief X와 Y 중 큰 값을 리턴하는 매크로
    /// 두 인수를 같은 타입으로 줘야 안전할 것이다.
    #define MAX(X, Y) ((X) > (Y) ? (X) : (Y))

 

  • 주석에 리스트 만들기

    • 칸을 맞추어 '-' 를 사용하면 된다. 여기서는 [tab]으로 들여쓰기를 맞춘다.
  1. /**
     * @brief    간단한 설명
     *
     * 자세한 설명은 이곳에서 부터 이다.
     *  - <b>10 11 12</b>
     *   모든 것이 순서대로 왔다. LastID는 매번 증가한다.
     *
     *  - <b>11 10 12</b>
     *    먼저 LastID가 11로 증가한다. 9->11로 변했으므로, 10의 값이 OmitList에
     *    추가된다. 다음으로 10이 오면 리스트에 존재하므로, 실행한다. 그리고
     *    리스트에서 데이터를 삭제한다. 12는... 정상적이므로 실행한다.
     *
     *  - <b>10 10 11</b>
     *    제일 처음 오는 10은 당연히 정상적으로 실행된다. 두번째로 오는 10은
     *    LastID값에 의해서 무시된다. 11은 다시 정상적으로 실행된다.
     */

 

명칭에 대한 표준#

  • 객체의 역할을 나타내는 Full Name의 표준 군사용어를 사용한다.
  • 언더바("_")로 시작되는 이름은 사용하지 않는다.  단, 단어 전체를 대문자로 표기하며 2개 이상의 단어를 조합하여 사용하는 경우 각 단어 사이에 밑줄(??_??)로 구분하여 사용한다.
  • 변수명

    • 변수의 명명은 '범위(전역일 경우에만 g_ 을 붙이고, 멤버 변수일 경우 m_을 붙인다.) + 접두사 + 설명적인 본체'로 이루어진다. 변수가 지역 변수인 경우의 명명은 범위를 생략한다.
    • 범위 : 변수의 전역 변수 여부를 나타낼 수 있도록 한다.

      • 예제 : 전역(g_), 멤버(m_)
    • 접두사 : 변수명에 그 변수의 타입을 나타내는 접두사를 붙여 표기하는 헝가리언 표기법을 사용한다.
    • 설명적인 본체

      • 첫글자는 대문자로 시작하며 나머지는 소문자를 사용한다. 두 단어 이상일 경우 각 단어의 첫 글자는 대문자로 쓴다.     g_iCountButton, m_pInstance
    • 포인터의 경우 p+[해당형 접두어]를 붙여 사용한다. m_piVar, m_pstrName
접두어 접두어의 의미
a 배열
b bool 형 변수
ch char 형 변수
uch unsigned char 형 변수
d double 형 변수
f float 형 변수
h handle 형 변수
l long 형 변수
p pointer 형 변수
pfn 함수 포인터
s short 형 변수
us unsigned short 형 변수
st 구조체 형 변수(객체)
str string 형 변수
sz NULL로 끝나는 문자열
i int 형 변수
ui unsigned int 형 변수
n 개수를 의미하는 int 형 변수
e enum 형 변수
c class 형 변수
un UNION 형 변수(객체)
pv void *
vec vector 형 변수
mtx mutex 형 변수
sem semaphore 형 변수
mq message queue 형 변수

 

  • 함수명

    • 첫글자는 소문자로 시작하며 단어의 시작은 대문자로 나머지는 소문자를 사용한다.

      • 단 윈도우용 프로그램을 작성할 때는 윈도우 API의 작명법을 따라, 함수를 대문자로 시작한다.
    • 동사 + 명사의 순서로 조합한다.      countBattalion()
  • 클래스명

    • 클래스를 대표할 수 있는 단어를 사용하고, 첫 문자는 대문자 'C'로 시작한다.
    • 클래스 객체의 변수명은 소문자 'c'로 시작하며, 두 단어 이상일 경우 각 단어의 첫 글자는 대문자로 쓴다.

 

  1. class CButton
    {
        ...
    };

    CButton cButtonMouse;

 

  • 상수명

    • 모두 대문자를 사용하며, 두 단어 이상일 경우 언더바("_")로 단어를 구분한다.
  1. MAX_NIFV

 

기타 코딩 스타일#

  • 기본 규칙

    • 하나의 행위는 하나의 라인으로 구성한다.
    • 대괄호('{}')를 이용하여 블록을 구성할 때는 새로운 줄에 블록을 기입한다.
  1. // 지양
    while (m_nCount > m_nLineLen) newLine();

    // 권장
    while (m_nCount > m_nLineLen)
    {
        newLine();
    }

 

  1. // 지양
    while (nCount > nLineLen) {
        if (m_nId>1) {
            m_nPlayer --;
        }
        else
  2.     {
            m_nPlayer ++;
        }
    }

    // 권장
    while (nCount>nLineLen)
    {
        if (nId>1)
        {
            nPlayer --;
        }
  3.     else
        {
            nPlayer ++;
        }
    }

 

  • 상수의 선언

    • 상수의 선언은 하나의 파일 또는 파일의 상단에 모아서 선언할 수 있도록 한다. 또한 이때 수직 정렬을 할 수 있도록 한다.
  1. #define PACKET_SIZE     20    ///< chars in message packet
    #define BUF_SIZE_MAX    256    ///< max allocatable space for buffer

 

  • 분기 문 작성

    • 분기 문의 등식에 상수를 사용할 때에는 반드시 상수를 왼편에 두어 '='가 빠졌을 때 발생할 수 있는 오류를 컴파일러가 찾을 수 있도록 한다. 또한 이는 찾고자 하는 값을 즉시 발견할 수 있도록 해준다.
  1. if ( 6 == nErrorNum )

 

  • 'if' 구문 작성

    • if 구문을 작성할 떄는 반드시 else 문을 이용하여 예외 처리를 할 수 있도록 한다. else 문에 내용이 없으면 주석을 사용하여 내용이 없음을 인지할 수 있도록 한다.
  1. if ( nId > i )
    {
        nPlayer --;
    }
  2. else
    {
        // do nothing
    }

 

  • 'switch' 문 작성

    • 각각의 case 문에는 break 이용하여 격리 시킬 것을 권장하며, default 문을 사용하여 예외처리를 한다.
    • case 의 경우 switch 지시자보다 한단계 낮은 레벨의 들여쓰기를 사용한다.
  1. switch ( nCount )
    {
        case NUM1:
            // do something
            break;
        case NUM2:
            // do something
            break;
        default:
            // do something
    }

 

  • 'goto' 문 작성

    • goto 문을 부득이 사용해야 하는 경우에는 반드시 그 목적과 사용범위를 명시한다.

 

관례#

  • C/C++ 은 하나의 문장을 아주 복잡하게 만들 수 있다. 이는 프로그램의 수행시간 단축, 사용 공간의 축소의 이득은 있으나, 가독성을 해친다. 따라서 복잡한 하나의 문장은 여러 개의 문장으로 분리해서 작성하길 권장한다.
  • 대입 연산자 사용

    • 하나의 문장에는 하나의 대입연산자 만을 사용한다. 여러 개의 대입연산자를 사용함으로써 가독성을 해치기 때문이다.
    • 분기 문의 등식/부등식 내에서는 대입연산자의 사용을 피한다.
  • 매개변수

    • 함수에 매개변수를 전달할 때는 연산자의 사용을 자제한다.
    • if, for, while 등의 조건절에서 연산자의 사용을 자제한다.
  1. // 지양
    plotPoint(mouse_x + prev_mouse_x * x_factor, mouse_y + prev_mouse_y * y_factor);

    // 권장
    new_x = mouse_x + prev_mouse_x * x_factor;
    new_y = mouse_y + prev_mouse_y * y_factor;
    plotPoint(new_x, new_y);

    // 지양
    if ( (mouse_x + prev_mouse_x * x_factor ) < max_x )
    {
        // do something
    }
       
    // 권장
    new_x = mouse_x + prev_mouse_x * x_factor;
    if ( new_x < max_x )
    {
        // do something
    }

 

  • 구조체 및 공용체

    • 구조체 및 공용체의 선언은 typedef 문을 사용한다.
    • 구조체 형식의 자료형은 St 를 접두어로 사용하고, 공용체 형식의 자료형은 Un을 사용한다.
    • 구조체의 객체명은 소문자 'st'를 접두사로 붙여서 사용한다.
    • 공용체의 경우 객체명은 소문자 'un'를 접두사로 붙여서 사용한다.
  1. typedef struct
  2. {
  3. char name[40];

  4. int age;

  5. dougle height;

  6. } StPerson;
  7. StPerson stP1

 

  • 열거형

    • 열거형의 명은 대문자 'E'를 접두사로 붙여서 사용한다.
    • 열거형의 객체명은 소문자 'e'를 접두사로 붙여서 사용한다.
  1. typedef enum
  2. {
  3. WHITE = 0,
  4. BLACK
  5. } EColor;
  6. EColor eColor1;

 

예제 파일 #

2010년 2월 18일 목요일

setTimeout

setTimeout() 메소드

setTimeout() 은 지정된 시간후 특정 코드를 실행시켜주는 메소드입니다. 뒤에서 다룰 setInterval() 과는 달리 setTimeout() 메소드를 사용하면 지정된 코드는 한번만 실행 됩니다. 사용형식은 아래와 같습니다

 setTimeout(code,delay)

code : 일정시간 후 실행시킬 자바스크립트 코드를 포함한 문자열
delay : 문자열 code 내에 있는 자바스크립트 코드가 실행되기까지 걸리는 시간 (1/1000초 단위)

아래의 예는 3초 후에 alert()를 실행시키는 setTimeout()을 이용한 간단한 예문입니다

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       function Timer() {

10.    setTimeout("alert('3초후에, 안녕하세요')",3000); 

11.    }

12.    //-->

13.    </SCRIPT>

14.     

15.    </HEAD>

16.     

17.    <BODY>

18.     

19.    <p><input type=button onclick="Timer()" value="3초후에 인사하기">

20.     

21.    </BODY>

22.     

23.    </HTML>

이번에는 setTimeout()을 이용하여 입력상자에 실시간으로 작동하는 디지털시계를 만들어 보겠습니다

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       function Timer() {

10.    var now = new Date();

11.    var H = now.getHours();

12.    var M = now.getMinutes();

13.    var S = now.getSeconds();

14.    myForm.myText.value = "지금은 " + H + "" + M + "" + S + "";

15.    setTimeout("Timer()", 1000);

16.    }

17.    document.onLoad = setTimeout("Timer()",1000);

18.    //-->

19.    </SCRIPT>

20.     

21.    </HEAD>

22.     

23.    <BODY>

24.     

25.    <form name=myForm>

26.    <input type=text name=myText style="text-align:center">

27.    </form>

28.     

29.    </BODY>

30.    </HTML>

 

9~14번행에서는 26번행의 텍스트 입력상자에 현재시간을 보여주는 Timer() 함수를 정의한 코드입니다. 그냥 단순히 보여주기만 해서는 실시간으로 변화하는 시간을 알려줄 수가 없기 때문에 15번행에서 1(1000)후에 다시 Timer() 함수를 호출하여 현재시간을 표시하고 있습니다.

17번행에서 이렇게 재귀적으로 반복 호출되는 Timer() 함수를 페이지가 로딩되면 실행토록 하였습니다.


setInterval() 메소드

setInterval()은 지정된 시간후 특정 자바스크립트 코드가 포함된 문자열을 반복하여 호출하는 메소드입니다. setTimeout() 이 지정 시간 후 한번만 호출하는데 비해, 이 메소드는 반복하여 호출 됩니다

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       function myFunc() {

10.    setInterval("alert('안녕하세요')",1000);

11.    }

12.    document.onLoad = myFunc();

13.    //-->

14.    </SCRIPT>

15.     

16.    </HEAD>

17.     

18.    <BODY>

19.     

20.    <b>1초 간격으로 반복해서 경고창이 뜹니다

21.     

22.    </BODY>

23.    </HTML>

 

9~11번행에서 1(1000)마다 경고창을 띄우는 함수 myFunc()를 정의하고, 12번행에서는 이 함수를 문서가 로딩되면 실행되도록 호출하였습니다

window setInterval() 메소드를 이용하여, 우리가 자바스크립트에 관심을 갖게되는 가장 기본적인 자바스크립트 효과인 브라우저의 상태표시줄에 메시지 보여주기를 할 수 있습니다.
아래의 자세한 설명이 첨부된 예문을 보면서 배워 보기로 할까요?

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       // 메세지의 시작부분을 결정하는 변수를 설정 합니다

10.    var count = 0  

11.     

12.    // 공백 메세지를 설정 합니다

13.    var message = " "      

14.     

15.    // 메세지 앞에 보여줄 공백칸을 50개 입력 합니다

16.    // 이 공백은 메세지를 흐르게 하는 효과를 주기위한 메세지 시작 앞 부분에

17.    // 보여줄 공백 문자열 입니다.

18.    for(i=0; i<50; i++) {

19.            message += " "

20.    }

21.     

22.    // 실제 메세지들을 공백 메세지 뒤에 붙입니다

23.    message += "자바스크립트는 재미있습니다...."

24.    message += "즐거운 시간 되세요...."

25.     

26.    // 이제, 메세지들을 스크롤 시키는 함수를 정의 합니다

27.    function myScroll()            

28.    {      

29.    // 메세지 문자열에서 count 이후 부터, count + 150 개의 문자열을 추출하여 보여줍니다

30.    // substring(start,length) 메소드는 start 번째 이후부터 length 개의 문자열을 추출합니다

31.    window.status = message.substring(count, count + 150)

32.     

33.    // 이제 count 변수값을 1 씩 증가시켜 줍니다.

34.    // 그러면 substring(count, count + 150) 메소드에 의해

35.    // 초기에는 substring(0,150) 이므로, 첫번째 문자부터 150 번째 까지 보여주고,

36.    // 그 다음에는 substring(1,151)이 되므로, 두번째 문자부터 151번째 까지 보여주고,

37.    // 그 다음에는 substring(2,152)이 되므로, 세번째 문자부터 152번째 까지 보여주는 식으로 되겠죠

38.    count++;                               

39.     

40.    // 그렇게 해서 count가 문자열의 길이(message.length) 보다 커지면 메시지가 모두 출력된 것이므로

41.    // 메시지가 처음부터 다시 흐르도록 count 0을 다시 지정해 줍니다.

42.    if(count>message.length)      {

43.            count = 0;

44.    }

45.    }

46.    // 이제 이렇게 설정 된 myScroll( ) 함수를 setInterval() 메소드를 이용해 0.05 초 마다 호출합니다

47.    setInterval(함수,시간간격) 메소드는 지정된 시간간격 마다 함수가 반복해서 호출해 주는 역할을 합니다

48.    document.onload=setInterval("myScroll()",50);

49.    //-->

50.    </SCRIPT>

51.    </HEAD>

52.    <BODY>

53.    <H3 align=center> 아래 상태표시줄을 보세요 </H3>

54.    </BODY>

55.    </HTML>


window.closed

이 속성은 특정 윈도우가 닫여있는지 여부를 체크하여 true false 값으로 반환합니다.

아래 예문은 현재의 윈도우가 열려있는 상태인지 아닌지를 체크하여 메시지를 출력하도록 한 간단한 예문이지만, 팝업 윈도우를 열고 그 팝업 윈도우에서 opener 페이지(팝업윈도우를 열어준 페이지)를 참조하고자 할 때 이 closed 프로퍼티를 주로 사용합니다

1.       <SCRIPT LANGUAGE="JavaScript">

2.       <!--

3.       if (window.closed) {

4.       document.write("윈도우가 닫힌 상태입니다");

5.       }

6.       else {

7.       document.write("윈도우가 열려 있는 상태입니다");

8.       }

9.       //-->

10.    </SCRIPT>

3번행에서는 현재의 윈도우가 닫힌 상태이면 true , 열려있는 상태이면 false를 반환합니다. 당연히 여러분들이 보고 있는 이 윈도우는 열려있는 상태이므로 false를 반환받아 7번행을 리턴합니다

다음에서 오프너 윈도우가 열려있는지 여부를 알려주는 간단한 예문을 살펴보고 넘어가겠습니다. 이 예문은 현재윈도우(opener)에서 버튼을 클릭하면 열려지는 팝업 윈도우에 사용된 코드 입니다

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       function myFunc() {

10.            if (opener.closed) {

11.            alert("오프너 윈도우가 사라졌어요");

12.            }

13.            else {

14.            alert("오프너 윈도우가 아직 열려 있습니다");

15.            }

16.    }

17.    //-->

18.    </SCRIPT>

19.     

20.    </HEAD>

21.     

22.    <BODY>

23.     

24.    <input type=button onClick="myFunc();" value="확인하기">

25.     

26.    </BODY>

27.    </HTML>

현재의 창을 닫고 팝업윈도우에 있는 버튼을 클릭하면 11번째행의 구문이, 현재의 창이 있는 상태에서 버튼을 클릭하면 14번째행의 구문이 출력 됩니다


window.defaultStatus 속성

defaultStatus 프로퍼티는 윈도우의 상태표시줄에 메시지를 보여줍니다.일반적으로 문서내의 하이퍼링크에 마우스를 대면 상태표시줄에서는 해당 URL을 출력 해 주지만 마우스를 떼었을 때는 공백을 보여줍니다. 이 경우 defaultStatus를 설정 해 두면 마우스를 떼었을 때에도 상태표시줄에 기본값으로 설정한 defaultStatus 값을 출력 해 줍니다.

defaultStatus 속성은 읽기/쓰기가 가능하며 반영구적입니다. 일시적인 메시지를 출력 하려면 status 프로퍼티를 사용합니다

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       defaultStatus = "안녕하세요"

10.    //-->

11.    </SCRIPT>

12.    </HEAD>

13.    <BODY>

14.    <input type=button onClick="javascript:defaultStatus='반갑습니다';" value="바꾸기">

15.    <p>

16.    <a href="http://www.jasko.co.kr">JASKO</a>

17.    </BODY>

18.    </HTML>

 


opener 프로퍼티, name 프로퍼티

opener 프로퍼티는 팝업창에서 팝업창을 열어준 윈도우를 참조할 때 사용되는 프로퍼티입니다. 반대로 opener에서 팝업윈도우를 참조할 때는 팝업윈도우의 name 이 아닌, 팝업윈도우의 변수값을 참조한다는 점 기억해 두세요

아래 예문에서는 팝업윈도우를 열 때 myWin = window.open('sample61-2.html','popwindow','옵션') 의 코드로 열어주었으므로 오프너에서 팝업윈도우를 참조하려면 myWin 이라는 변수값을 사용해야 합니다

여기에서 사용된 팝업윈도우의 이름인 popwindow HTML 코드에서 타겟을 지정할 때처럼 타겟으로 사용됩니다.

오프너 페이지

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       <SCRIPT LANGUAGE="JavaScript">

8.       <!--

9.       function openWin() {

10.    myWin = window.open('sample61-2.html','popwindow','width=600,height=300');

11.    }

12.    //-->

13.    </SCRIPT>

14.     

15.    </HEAD>

16.     

17.    <BODY>

18.     

19.    <input type=button onclick="openWin();" value="팝업창 열기">

20.    <input type=button onclick="myWin.close();" value="팝업창 닫기">

21.     

22.    </BODY>

23.    </HTML>

9~11번행에서 정의된 openWin() 함수에서는 새로운 팝업윈도우를 myWin 이라는 변수에 담아 열어주는 함수입니다. 21번행에서 사용된 팝업윈도우 닫기 코드에서 사용된 myWin을 주의깊게 살펴 보세요

오프너 페이지에서 <a href="http://www.jasko.co.kr" target="popwindow"> 처럼 태그를 사용하면 팝업윈도우에 자스코 홈페이지가 열리게 됩니다

팝업 윈도우

1.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2.       <HTML>

3.       <HEAD>

4.       <META http-equiv="content-type" content="text/html; charset=euc-kr">

5.       <TITLE> Jasko Sample Script </TITLE>

6.        

7.       </HEAD>

8.        

9.       <BODY>

10.     

11.    <input type=button onclick="alert('현재창의 이름은 : ' + window.name)" value="현재창의 이름">

12.    <input type=button onclick="opener.location='http://www.jasko.co.kr'" value="오프너윈도우에 자스코페이지 열기">

13.     

14.    </BODY>

15.    </HTML>

window.name 프로퍼티는 현재윈도우의 이름값을 반환해 줍니다. 11번 행의 코드를 실행시키면 팝업윈도우의 이름인 popwindow를 반환해 줍니다

팝업윈도우에서 오프너 페이지에 다른 페이지를 불러오려면 참조값으로 opener 프로퍼티를 사용해야 합니다