내가 Visual C++ 6를 아직도 쓰는 이유

VC++ 6.0을 쓰지 말아야하는 이유(http://minjang.egloos.com/1783328)” 라는 글을 읽고나서도 나는 별로 VC++ 6를 버리고 싶은 생각이 들지 않는다.
난 VC++ 6가 더 손에 착착 붙으니까.
익숙하지 않은 툴을 쓸 때의 그 느낌은 몸에 맞지 않는 옷을 입은 것처럼 코딩 작업을 매우 불편하게 한다. 물론 그 이후 버전에 익숙하지 않은 것은 내 천성적인 게으름 탓일 수도 있을거다. 흐흐흐..
그러나 MFC Application을 만들 때 굳이 VC.NET 이후 버전을 써야 할 이유를 느끼지 못한 것도 한 이유다. 그렇다고 그 이후 버전을 써야만 만들 수 있는 프로그램을 만드는 것도 아니었기 때문에.. 굳이 새버전이라는 이유로 내 손에 익은 단축키와 툴들을 버리고 굳이 옮기고 싶은 마음은 들지 않는다.
게다가, “VC++ 6.0을 쓰지 말아야하는 이유” 에서 쓰고 있는 이유들, 대부분이 아직 잘 와닿지 않는다.

“1. 보다 안전한 프로그래밍”에서의 _s버전의 함수를 쓰라는 건 나보고 특정 플랫폼의 함수에 종속되란 말로 들리고, 특히나 strcpy 같은 함수를 잘 사용하지 않는 나로서는 특별히 신경쓰이지 않는다. strcpy의 버퍼오버 플로우 같은 문제는 해묵은 문제이고 이와 관련된 이야기는 많이 들은 문제 아닌가?;

“2. 유니코드 프로그래밍” 같은 문제는 사실 프로그래머의 문제지 툴의 문제가 아니라고 생각한다.

“3. 보다 뛰어난 인텔리센스”는 VC++ 6의 인텔리센스 기능에도 만족해 했던 나로서 별로..;; Visual Assist를 써도 좋고..

“4. STL의 (거의) 완벽한 지원” 의 이유는 좀 써볼만하다고 생각하긴 한다.

“5. 뛰어난 IDE 매크로 사용”은 별다른 매크로를 사용하지 않아서인지도 모르겠다. 글에 나왔던 .cpp와 .h를 연결해주는 매크로 같은건 VC++ 6에서도 만들어쓴다. 나 같은 경우는 매크로를 쓰다가 Wndtabs에 아예 내장기능으로 들어가 있는 걸 보고 그 기능을 사용하는 중이다.

“6. 더 훌륭해진 컴파일러”는 약간 수긍. 그러나 더 빠른 컴파일러가 필요할 정도로 크리티컬한 상황을 MFC App.를 짜면서는 별로 느껴보지 못했다. 빠른 컴파일러가 필요하다면 인텔 컴파일러가 최고 아닐까?

“7. 더 괜찮아진 IDE” 는 개인차일 수 있으나, 난 VC++ 6의 IDE가 더 맘에 든다. 예전, C++ Builder의 IDE가 나중에 VC.NET의 인터페이스와 비슷해진 걸 써보고, “으.. 난 전꺼가 더 좋은데…” 한탄했던 기억이.. 게다가 클래스 위저드의 기능을 사용할 수 있다고 하나, “클래스 위저드를 사용하는 것”과 “클래스 위저드의 기능이 있는 것” 과는 매우 다르다.

“8. 멀티 코어의 사용”은 내가 아직 대규모 프로젝트에 투입되지 않아봐서 그런걸까.. 하지만, 컴파일 시간이 그만큼 길다는 것은 그 프로젝트의 구성 자체가 문제일 가능성이 더 높다.

“9. MFC/ATL의 변화” 는 MFC의 클래스들을 MFC 이외에서 사용하고 싶은 욕심이 없어서일까..;;

써야 하는 이유의 대두분이 나한테는 아직 써야하는 이유로 다가오지 않으므로, 고로, 그래서, 나는 아직 VC++ 6를 쓸란다.

그리고, 또 다른 이유는 “내가 좀 많이 게으르다.” 라는 것이다. 흐흐….

..라고는 하지만 이렇게 결론내기 좀 부끄러워 몇마디 더 하자면, 툴은 익숙한 툴이 좋고, 상황에 맞는 툴을 골라서 사용할 줄 아는 것이 현명하다는 것이다. 그리고 현재 내 상황은 아직 VC++ 6이 가장 적합한 툴이다. 흐흐..

재밌는 블로그를 발견했다!~ art.oriented(http://minjang.egloos.com/)

우연히 멤버십 인트라넷을 보다가 다른 지역 게시판엔 뭐가 있을까 하고 보던 중에 대구 멤버십의 자유게시판에서 재밌는 글을 발견하고는 그 링크를 따라갔더니 재밌는 블로그가 나왔다. art.oriented(http://minjang.egloos.com/)
맨 처음 본 글은 “C로도 얼마든지 객체
지향이 가능합니다.
“이다. 보던 중 정말 srand, rand가 전역변수를 쓰나? 나라면 static으로 scope를 줄텐데 하면서 glibc도 까보기도 하고, 글 내에 링크된 스레드 관련 부분에 관한 내용에 고개를 끄덕이기도 하고 하면서 재밌게 읽었다.
또, 컴퓨터 라는 분류에 재밌는 글들이 많은데 “gcc STL map iterator의 버그(?)” 라는 글에서는 왜 이 사람이 map을 iterator로 순회하면서 begin() 부터 –연산자를 써서 코딩하는 걸까 생각해보게 되었다. 저렇게 써도 되는건가? 그리고 저런 식의 코드를 만들어야 하는 상황이 생길까? 그런 상황은 무엇일까? 저렇게 쓰면 안되는거 아닌가? map을 쓰는 데 있어 저런 방식은 비정상적인거 같은데… map 자체가 저렇게 쓰라고 만든게 아닐텐데.. 등등..
다른 글들도 읽어보면서 얼마간은 좋은 생각거리들을 만들어 줄 수 있을 듯 하다.

Subversion-Installation

Subversion은 지금까지 정말 열심히 쓰고 있는 버전 관리 툴이다. 필요에 의해 쓰게 되었고, 필요에 의해 익히게 된 유용한 툴이다. Subversion없는 프로젝트, 코딩은 이제 생각할 수도 없다. 그 초기에 설치하면서 썼던 설치기..
——————————————————————————————————–
목차
    1 소개
    2 설치
        2.1 우분투 리눅스 설치
        2.2 네트워크 설정
        2.3 Subversion 설치
        2.4 서비스 설정
            2.4.1 xinetd 설치
        2.5 저장소(Repository) 설치
        2.6 Apache2와 연동
    3 사용

1 소개

이 글은 내가 우분투 Breezy 를 설치 후 Subversion 을 설치해서 사용하기까지의 삽질을 정리하기 위한 페이지이다. 개인적인 목적으로(KLDP 에는 미안하지만 😉 ) 정리한 글임을 일러둔다.

클라이언트는 Microsoft Windows 에서 TortoiseSVN 을 이용한다.

2 설치

2.1 우분투 리눅스 설치

    * 우분투 한국 사용자 모임 을 참조한다.
    * 처음 사용자 ID 는 svnadmin 으로 설치하였다.

2.2 네트워크 설정

    * 내부 네트워크에 192.168.0.166 으로 설정하였다.

2.3 Subversion 설치

    * 시냅틱 패키지 관리자에서 Subversion 관련 패키지(Subversion, Subversion-tools, Subversion-helper-scripts(설치안해도 무방할 것 같으나 일단 추가))를 설치한다.

2.4 서비스 설정

2.4.1 xinetd 설치

   1. 시냅틱 패키지 관리자에서 xinetd 패키지를 설치한다.
   2. /etc/xinetd.d/ 밑에 svn 파일을 만들어 내용을 채운다.
         1. sudo vi /etc/xinetd.d/svn

            # Default : On
            # Subversion server

            service svn
            {
                sockettype  = stream
                protocol    = tcp
                user        = svnadmin
                wait        = no
                disable     = no
                server      = /usr/bin/svnserve
                server_args = -i
                port        = 3690
            }

2.5 저장소(Repository) 설치

   1. /home/repository 디렉토리 만듦.
   2. cd /home/repository
   3. svnadmin create ProtoHan
   4. /home/repository/ProtoHan/conf/passwd 를 참고하여 ProtoHan 프로젝트를 진행할 사람들의 계정과 비밀번호를 /home/svnadmin/SvnPasswd/JDL-740aDev 로 만든다.
   5. /home/repository/ProtoHan/conf/svnserve.conf 을 편집한다.
         1. vi /home/repository/ProtoHan/conf/svnserve.conf

            [general]
            anon-access = none
            auth-access = write
            password-db = /home/svnadmin/SvnPasswd/JDL-740aDev

   6. Subversion 에서 추천하는 trunk/, branches/, tags/ 디렉토리를 만든다.
         1. svn mkdir svn://localhost/home/repository/ProtoHan/trunk
         2. 편집기로 Log 작성
         3. 리비전 증가
         4. svn mkdir svn://localhost/home/repository/ProtoHan/branches
         5. 편집기로 Log 작성
         6. 리비전 증가
         7. svn mkdir svn://localhost/home/repository/ProtoHan/tags
         8. 편집기로 Log 작성
         9. 리비전 증가

2.6 Apache2와 연동

   1. 시냅틱 패키지 관리자에서 Apache2 설치
   2. Apache2 를 통해 ProtoHan 에 접근할 계정 설정
         1. mkdir /home/svnadmin/ApachePasswd
         2. cd /home/svnadmin/ApachePasswd
         3. htpasswd -c JDL-740aDev <계정명>
         4. <Password> 입력
   3. /etc/apache2/mods-available/dav_svn.conf 편집
         1. sudo vi /etc/apache2/mods-available/dav_svn.conf

            <Location /ProtoHan>
              DAV svn
              SVNPath /home/repository/ProtoHan
              AuthType Basic
              AuthName “JDL-740a(ProtoHan) Repository”
              AuthUserFile /home/svnadmin/ApachePasswd/JDL-740aDev
              #<LimitExcept GET PROPFIND OPTIONS REPORT>
                Require valid-user
              #</LimitExcept>
            </Location>

   4. sudo /etc/init.d/apache2 restart

3 사용

   1. TortoiseSVN 다운로드(http://tortoisesvn.tigris.org/download.html) 후 설치
   2. Repository 는 svn://192.168.0.166/home/repository/ProtoHan/trunk 혹은 http://192.168.0.166/ProtoHan/trunk 로 접근한다.

How to use Mantis for UTF-8

mantis는 웹 인터페이스의 버그 트래킹 툴이다. 회사 다닐 때 회사에 적용해보고 싶어서 좀 써봤는데, 실패했다-_- 암튼.. 이 글은 Mantis를 UTF-8로 사용하기 위한 팁이다. 근데 좀 오래되었네….;;;;

——————————————————————————————————–
목차
    1 차례
    2 Mantis 한글 설정(UTF-8)
        2.1 설치 환경
        2.2 설정 순서
        2.3 그래도 안보인다면!

2 Mantis 한글 설정(UTF-8)

2.1 설치 환경

    * 우분투 5.10 Breezy 의 mantis 패키지(따라서 모든 경로는 우분투 기준!)

2.2 설정 순서

   1. mantis 의 설정 파일을 수정하기 위해 연다.

      sudo vi /etc/mantis/config.php

   2. $g_default_language 와 $g_fallback_language 를 ‘korean_utf8’ 로 수정한 후 저장한다.

              $g_default_language     = ‘korean_utf8’;
              $g_fallback_language    = ‘korean_utf8’;

   3. /usr/share/mantis/gui/config_defaults_inc.php 를 연다.

      sudo vi /usr/share/mantis/gui/config_defaults_inc.php

   4. $g_language_choices_arr 에 ‘korean’ 밑에 ‘korean_utf8’ 을 추가한다.

              …

              # list the choices that the users are allowed to choose
              $g_language_choices_arr = array(
                      ‘auto’,

                      …

                      ‘korean’,
                      ‘korean_utf8’,
                      ‘turkish’,
                      ‘ukrainian’

                      …
              );

              …

   5. $g_language_auto_map 에 “‘ko’ => ‘korean'” 를 “‘ko’ => ‘korean_utf8′” 로 수정한 후 저장한다.

              …

              $g_language_auto_map = array(
                      ‘en-us, en-gb, en-au, en’ => ‘english’,
                      ‘zh-cn, zh-sg, zh’ => ‘chinese_simplified’,
                      ‘zh-hk, zh-tw’ => ‘chinese_traditional’,
                      ‘cs’ => ‘czech’,
                      ‘da’ => ‘danish’,
                      ‘nl-be, nl’ => ‘dutch’,
                      ‘et’ => ‘estonian’,
                      ‘fi’ => ‘finnish’,
                      ‘fr-be, fr-ca, fr-ch, fr’ => ‘french’,
                      ‘de-de, de-at, de-ch, de’ => ‘german’,
                      ‘hu’ => ‘hungarian’,
                      ‘it-ch, it’ => ‘italian’,
                      ‘ja’ => ‘japanese_sjis’,
                      ‘ko’ => ‘korean_utf8’,
                      ‘lt’ => ‘lithuanian’,
                      ‘no’ => ‘norwegian’,
                      ‘pl’ => ‘polish’,
                      ‘pt-br’ => ‘portugese_brazil’,
                      ‘pt’ => ‘portugese_standard’,
                      ‘ro-mo, ro’ => ‘romanian’,
                      ‘ru-mo, ru’ => ‘russian’,
                      ‘sr’ => ‘serbian’,
                      ‘sk’ => ‘slovak’,
                      ‘sl’ => ‘slovene’,
                      ‘es-mx, es-co, es-ar, es-cl, es-pr, es’ => ‘spanish’,
                      ‘sv-fi, sv’ => ‘swedish’,
                      ‘tr’ => ‘turkish’
              );

              …

2.3 그래도 안보인다면!

    * /etc/php5/apache2/php.ini 파일을 열어 default_charset 가 지정되어 있는 부분을 주석처리한다. 😛

티스토리로 이전하였습니다.

텍스트큐브의 버그를 해결하다가 링크를 몇 번 날려먹고는 결국 티스토리 이전을 결정했습니다.

아마도 “/etc” 등 /이후의 글자가 있으면 저장이 안되는 문제는 EUC-KR과 UTF-8 문제 인듯 한데, 몇 번의 삽질로도 잘 해결이 안되네요-_-… 링크는 자꾸만 날라가고…….

좀 편하게 살기로 하고 티스토리로 옮기렵니다.

그동안 서버를 제공해주셨던 jachin님께는 다시한번 감사의 말씀을 전합니다. 지금까지 정말 감사히 잘 썼습니다. 감사해요!

제가 제 블로그에 자주 오는 이유 중 하나는 다른 블로그의 RSS 리더로써의 역할도 있었는데.. 이건 어디서 써야할지.. 흐흐..

암튼 새 둥지로 옮겼으니 또 많이 게을러질 것 같습니다. ^^;;

Using POP3, SMTP with SSL

예전에 회사다닐 때 메일 서버 관리할 때 썼던 글인 듯 하다.
언젠가 도움이 되지 않을까 해서 KLDP에 썼던 글을 블로그에도 옮겨둔다.
——————————————————————————————————-
Using POP3, SMTP with SSL

1. 문서의 목적

이 문서는 OpenSSL 을 이용해서 POP3S 와 SMTP 서비스를 시작한 내 경험을 정리하기 위해 만들어졌다.

2. 문서의 소개

이 문서는 OpenSSL 을 이용해 POP3S 와 SMTP 서비스를 사용하는 절차에 대해 설명한다. 레드햇 8.0 을 기준으로 하며 MTA 로는 Sendmail 을 사용한다. POP3S 서비스는 xinetd 하에서 서비스된다. CA 인증은 자체 인증 방식을 사용한다. 모든 작업은 root 로 수행한다. 이 문서는 양정석(dasomoli (at) gmail.com)이 작성하였다. 🙂

3. 본문

3.1. 인증서 만들기 & 설치

    * CSR 을 만든다.
      # openssl req -new > cert.csr

    * common name 에 도메인 이름 입력(예:jinyangind.com)

    * RSA 키를 만든다.
      # openssl rsa -in privkey.pem -out cert.key

    * CSR 에 자체 서명키로 CA 인증서를 만든다.
      # openssl x509 -in cert.csr -out cacert.crt -req -signkey cert.key -days 365

    * RSA 키와 CA 인증서를 붙여 pem 파일을 생성한다.
      # cat cert.key cacert.crt > cert.pem

    * 생성한 파일을 root 외에 읽을 수 없게 한다.
      # chmod 600 cert.pem cacert.crt cert.key(여기는 cert.pem 빼고는 내 추측)

    * SSL 의 certs 디렉토리에 옮긴다.
      # mv cert.pem /usr/share/ssl/certs

      # mv cacert.crt /usr/share/ssl/certs

      # mv cert.key /usr/share/ssl/certs

    * pop3s 의 pem 파일도 만든 것으로 사용
      # cp /usr/shar/ssl/certs/cert.pem /usr/shar/ssl/certs/ipop3d.pem

    * smtps 의 pem 파일도 만든 것으로 사용
      # cp /usr/shar/ssl/certs/cert.pem /usr/shar/ssl/certs/sendmail.pem

3.2. pop3s 서비스 시작하기.

    * #vi /etc/xinetd.d/pop3s

      service pop3s
      {
          disable         = no
          socket_type     = stream
          wait            = no
          user            = root
          server          = /usr/sbin/ipop3d
          log_on_success  += USERID
          log_on_failure  += USERID
      }
        
    * # /etc/init.d/xinetd.d restart

3.3. sendmail 설정하고 재시작하기.

    * # vi /etc/mail/sendmail.mc, 다음 내용을 추가한다.

      define(`confCACERT_PATH’,`/usr/share/ssl/certs’)dnl
      define(`confCACERT’,`/usr/share/ssl/certs/cacert.crt’)dnl
      define(`confSERVER_CERT’,`/usr/share/ssl/certs/sendmail.pem’)dnl
      define(`confSERVER_KEY’,`/usr/share/ssl/certs/cert.key’)dnl
      DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s’)dnl
      Cwjinyangind.com

    * # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
    * # /etc/init.d/sendmail restart

3.4. Client 설정.

    * cacert.crt 배포, 인증기관에 추가.

3.4.1. Outlook

    * 받는 메일 서버, 보내는 메일 서버에 SSL 체크, 보내는 메일서버 포트 : 465, 받는 메일서버 포트 : 995

3.4.2. Thunderbird

    * Outlook 과 거의 같음.

계획과 추정과 측정

계획이 있기 위해서는 그를 뒷받침하는 추정이 있어야 한다.
추정이 있기 위해서는 과거 행위에 대한 측정이 있어야 한다.

나는 참 계획적인 사람이었는데, 언젠가부터 그 추정이 난해해짐으로써 계획이 뒤틀어지는 일이 많아져 계획세우기가 줄어들었다.
추정을 위한 과거 행위에 대한 측정치들이 불규칙했기 때문인 듯 하다.
불규칙한 측정치에 대한 측정들로 인해 추정을 포기하게 되었고,
그 추정치가 불확실함에 따라 계획성이 없어졌다.

그래서 결론적으로 뭔 소리냐 하면.. 무계획적인 삶을 살아가고 있단 얘기지…-_-;;;;;

Professional 소프트웨어 개발

스티브 맥코넬의 “Professional 소프트웨어 개발” 이란 책을 읽었다.
책의 각 장마다 철학자의 명언이나 논문의 문구 등을 적어놓았는데, 말 그대로 ‘명언’이다.

감명받은 몇 개의 문구를 적어보자면..

직접 시도해 보기 전엔 뻔해 보일 것이다.
                                                       – IEEE SOFTWARE

내가 직접 프로그래밍하기 전에 나는 그 문제를 얼마나 가볍게 여기는가! 다른 사람이 한 업적을 얼마나 시시하게 생각했던가! 내 자신에게 반성의 계기를 준 그 문구!

확신으로 시작하는 사람은 의문으로 끝날 것이고, 의문으로 시작하는 사람은 확신으로 끝날 것이다.
                                                       – 프란시스 베이컨

한 문장안에서 저런 비교라니!~ 그렇다. 실세계는 그리고 프로그래밍은! 정말 저렇다!

아는 것이 힘이다
                                                       – 프란시스 베이컨

아는 것이 힘이다. 여기 저기에서 많이 접한 이 말은 그 사람이 어느 범위와 어느 깊이까지 아는 지에 따라 할 수 있는 능력, 즉 힘이 된다는 말이다!

몇 개 더 있지만, 크게 느낀 것은 저 세 개이다. 특히나 “직접 시도해 보기 전엔 뻔해 보일 것이다” 는 며칠동안 계속 머리속을 맴돌았다.

철학자인 베이컨의 말들이 많이 인용되었는데, 윤리 시간에 배웠던 베이컨의 말들이 이렇게 직접 적절한 곳에 쓰여진 것을 보니 신기하기도 하고, 재밌기도 하고.. ㅎㅎ

아무튼, 많은 것을 생각하게 해 준 그 책. “Professional Software 개발”!

서울특별시의회 전자회의시스템 프로젝트 프로그램 개발자 폭행사건

시의회에서의 폭행 사건 같은 건 평소의 나라면 그냥 그러려니.. 하고 넘어갔을 지도 모르지만,
이렇게 화가 나는건 폭행 사건 피해자가 개발자라는 이유때문인지도 모르겠다.
프로그램의 요구사항 파악, 진행 등과 관련된 이 뒤에 감춰진 어떤 이유를 들더라도, 폭행이라니..

다음은 프로젝트를 진행했던 폭행 피해자인 개발자가 데브피아에 올린 글이다.

서울특별시의회 전자회의시스템 프로젝트 프로그램 개발자 폭행사건(http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=69&MAEULNo=28&no=11212)

다음은 네이버에 떴던 관련 뉴스의 내용이다.

서울시의회 사무처 직원, 납품업체 직원 폭행 논란(http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=102&oid=003&aid=0002349070)

“폭행은 없었다”는 내용이 아주 가관이다..

그리고 다음은 KBS 뉴스의 관련 뉴스이다.

서울시의회 간부, 시민 폭행 물의(http://news.kbs.co.kr/article/society/200810/20081028/1658647.html)

음! 화난다-_-!

Visual C++ 6 SP6에서의 명시적 형변환을 믿지마세요(?)

#include <iostream>

using namespace::std;

int main(void)
{
    float f = 1234567890;
    int i = f;
    int i2 = float(1234567890);
   
    cout << i << endl;
    cout << i2 << endl;

    return 0;
}

위 코드에서 i와 i2가 다를까요? 네. 다릅니다. Visual C++ 6를 쓰신다면요..;;

발견하게 된 계기는 다음과 같습니다.

“The C++ Programming Language” 의 C.6.2.6 부동소수점 실수-정수 변환 절에는 다음과 같은 절이 나옵니다.

반대로, 정수를 부동소수점 실수 타입으로 바꾸는 것은 하드웨어가 허용하는 한 수학적으로 정확히 보장된다. 단, 정밀도가 손실되는 경우는 주어진 정수를 해당 부동소수점 실수 타입으로 정확히 표현할 수 없을 때이다.
    int i = float(1234567890);
int와 float를 32비트로 처리하는 컴퓨터에서는 i에 1234567936이 들어간다.

제 컴퓨터는 int와 float를 32비트로 처리합니다. 따라서 같은 결과를 예상하고 다음과 같은 코드를 작성합니다.

#include <iostream>

using namespace::std;

int main(void)
{
    int i = float(1234567890);
   
    cout << i << endl;

    return 0;
}

결과는?

1234567890

허걱! 뭐야..;; float 형을 32비트로 처리 안하나? sizeof 로 확인해보니 4 랍니다. 그럽 32비트 맞겠죠? float형 정밀도가 저 범위를 모두 처리할 수 있나? 1비트 사인비트에 8비트 지수, 23비트로 mantisa를 처리하니.. 안될텐데;; 1234567890 은 2진수로 “1001001100101100000001011010010” 니까 31비트인데..;; 뭐지..;; 책 내용은 맞는 것 같은데… 까지 생각하고 혹시 컴파일러 문제인가? 하고 2005를 띄웁니다.

같은 코드에 결과는 책과 같은 결과가 나옵니다.

으음.. 그럼 얘는 뭘까 형변환을 명시적으로 안하는 건가 라고 생각하고 그냥 float 형에 넣어봅니다.

#include <iostream>

using namespace::std;

int main(void)
{
    float f = 1234567890;
    int i = f;
   
    cout << i << endl;
 
    return 0;
}

이제서야 책과 같은 결과가 나옵니다. 헐……….. 뭘까요… 얘…..