C++·Î ¸®´ª½º ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö

By Rob Tougher

Çѱ۹ø¿ª ÀüÁ¤È£

ÀÌ ±ÛÀº Çѱ۹ø¿ªÆÇÀÔ´Ï´Ù. ¿ø¹®Àº ¿©±â¿¡¼­ º¼ ¼ö ÀÖ½À´Ï´Ù.


Á¦¸ñ/¸ñÂ÷

1. ¼Ò°³
2. Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ Åë½Å °³¿ä
3. °£´ÜÇÑ ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® ±¸Çö
3.1 ¼­¹ö - ±â´Ù¸®´Â ¼ÒÄÏ ¸¸µé±â
3.2 Ŭ¶óÀ̾ðÆ® - ¼­¹ö·Î ¿¬°á
3.3 ¼­¹ö - Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ ¹Þ¾ÆµéÀ̱â
3.4 Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö - ÀÚ·á ÁÖ°í¹Þ±â
4 ¸¸µç Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö¸¦ ÄÄÆÄÀÏÇÏ°í Å×½ºÆ®
4.1 ÆÄÀÏ ¸ñ·Ï
4.2 ÄÄÆÄÀÏ°ú Å×½ºÆ®
5. °á·Ð

1. ¼Ò°³

¼ÒÄÏÀº ÇÁ·Î¼¼½º°£¿¡ ÀڷḦ ±³È¯ÇÏ´Â ¼ö´ÜÀÌ´Ù. ÇÁ·Î¼¼½º´Â °°Àº ÄÄÇ»ÅÍ¿¡ Àְųª ³×Æ®¿÷À¸·Î ¿¬°áµÈ ¼­·Î ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ ÀÖÀ» ¼ö ÀÖ´Ù. ¼ÒÄÏÀÌ ¿¬°áµÇ¸é ÇÑÂÊÀÌ ¿¬°áÀ» ´ÝÀ» ¶§±îÁö ¾çÆí ¸ðµÎ ÀڷḦ º¸³¾ ¼ö ÀÖ´Ù.

³ª´Â ÀÛ¾÷ÁßÀÎ ÇÁ·ÎÁ§Æ®¿¡ ¼ÒÄÏÀÌ ÇÊ¿äÇؼ­ ¼ÒÄÏ API ÇÔ¼ö¸¦ °¨½Î´Â C++ Ŭ·¡½º¸¦ °³¹ßÇÏ°í ´Ùµë¾ú´Ù. ÀϹÝÀûÀ¸·Î ÀڷḦ ¿äûÇÏ´Â ÇÁ·Î±×·¥À» Ŭ¶óÀ̾ðÆ®, ¿äû¿¡ ÀÀ´äÇÏ´Â ÇÁ·Î±×·¥À» ¼­¹ö¶ó°í ÇÑ´Ù. ³»°¡ ¸¸µç ClientSocket°ú ServerSocket, ÁÖµÈ µÎ Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°¡ ¼­·Î ÀڷḦ ±³È¯ÇÒ ¼ö ÀÖ´Ù.

ÀÌ ±ÛÀÇ ¸ñÇ¥´Â ÇÁ·Î±×·¥¿¡¼­ ClientSocket°ú ServerSocket Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¾Ë¸®´Â °ÍÀÌ´Ù. ¸ÕÀú Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ Åë½Å¿¡´ëÇØ °£´ÜÈ÷ ´Ù·é ´ÙÀ½, ÀÌ µÎ Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© °£´ÜÇÑ ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® ¿¹Á¦¸¦ ¸¸µé °ÍÀÌ´Ù.

2. Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ Åë½Å °³¿ä

ÄÚµå·Î µé¾î°¡±âÀü¿¡ ÀüÇüÀûÀΠŬ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ ¿¬°á ´Ü°è¸¦ °£´ÜÈ÷ »ìÆ캸ÀÚ. ´ÙÀ½ Ç¥´Â ´Ü°èµéÀ» º¸¿©ÁØ´Ù.

¼­¹ö Ŭ¶óÀ̾ðÆ®
1. ±â´Ù¸®´Â ¼ÒÄÏ(listening socket)À» ¸¸µé°í Ŭ¶óÀ̾ðÆ®¿¡¼­ ¿¬°áÀ» ±â´Ù¸°´Ù.  
  2. Ŭ¶óÀ̾ðÆ® ¼ÒÄÏÀ» ¸¸µé°í ¼­¹ö·Î ¿¬°áÀ» ½ÃµµÇÑ´Ù.
3. Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ¸¦ ¹Þ¾ÆµéÀδÙ.  
4. ÀڷḦ ÁÖ°í¹Þ´Â´Ù. 4. ÀڷḦ ÁÖ°í¹Þ´Â´Ù.
5. ¿¬°áÀ» ´Ý´Â´Ù. 5. ¿¬°áÀ» ´Ý´Â´Ù.

±âº»ÀûÀ¸·Î´Â ÀÌ·¸´Ù. ¸ÕÀú ¼­¹ö°¡ ±â´Ù¸®´Â ¼ÒÄÏÀ» ¸¸µé°í Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ¸¦ ±â´Ù¸°´Ù. Ŭ¶óÀ̾ðÆ®°¡ ÀÚü ¼ÒÄÏÀ» ¸¸µé°í ¼­¹ö¿Í ¿¬°áÀ» ½ÃµµÇÑ´Ù. ¼­¹ö´Â ¿¬°áÀ» ¹Þ¾ÆµéÀÌ°í, ÀÚ·á ±³È¯ÀÌ ½ÃÀ۵ȴÙ. ¼ÒÄÏ ¿¬°áÀ» ÅëÇØ ¸ðµç ÀÚ·á°¡ Àü´ÞµÇ¸é ¾çÂÊ Áß Çϳª°¡ ¿¬°áÀ» ´Ý´Â´Ù.

3. °£´ÜÇÑ ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® ±¸Çö

ÀÌÁ¦ ÄÚµå·Î µé¾î°¥ ½Ã°£ÀÌ´Ù. ÀÌÁ¦ºÎÅÍ °³¿ä¿¡¼­ ´Ù·é ´Ü°è¸¦ ¸ðµÎ ¼öÇàÇϴ Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö¸¦ ¸¸µç´Ù. ¿ì¸®´Â ÀϹÝÀûÀ¸·Î ÀϾ´Â ¼ø¼­´ë·Î - ¿¹¸¦ µé¾î ¸ÕÀú ¼ÒÄÏÀ» ±â´Ù¸®´Â ¼­¹ö ºÎºÐÀ» ¸¸µç ´ÙÀ½ ¼­¹ö·Î ¿¬°áÇϴ Ŭ¶óÀ̾ðÆ® ºÎºÐÀ» ¸¸µå´Â µî - ±¸ÇöÇÑ´Ù. Àüü ÄÚµå´Â simple_server_main.cpp¿Í simple_client_main.cpp¿¡¼­ º¼ ¼ö ÀÖ´Ù.

¹Ì¸® ¼Ò½ºÄڵ带 »ìÆ캸°í ½ÇÇàÇغ¸·Á¸é ¿©±â¸¦ ÀоîºÁ¶ó. ÇÁ·ÎÁ§Æ® ÆÄÀÏ ¸ñ·Ï°ú ¾î¶»°Ô ÄÄÆÄÀÏÇÏ°í Å×½ºÆ®ÇÏ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.

3.1 ¼­¹ö - ±â´Ù¸®´Â ¼ÒÄÏ ¸¸µé±â

ù¹ø° ÇÒ ÀÏÀº Ŭ¶óÀ̾ðÆ®¿¡¼­ µé¾î¿À´Â ¿äûÀ» ±â´Ù¸®´Â °£´ÜÇÑ ¼­¹ö¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ´ÙÀ½Àº ¼­¹ö ¼ÒÄÏÀ» ¸¸µå´Â ÄÚµåÀÌ´Ù.

¸ñ·Ï 1 : ¼­¹ö ¼ÒÄÏ ¸¸µé±â ( simple_server_main.cppÀÇ ÀϺΠ)
#include "ServerSocket.h"
#include "SocketException.h"
#include <string>

int main ( int argc, int argv[] )
{
  try
    {
      // Create the server socket
      ServerSocket server ( 30000 );

      // rest of code -
      // accept connection, handle request, etc...

    }
  catch ( SocketException& e )
    {
      std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
    }

  return 0;
}


À̰͸¸À¸·Î ³¡³µ´Ù. ServerSocket Ŭ·¡½ºÀÇ »ý¼ºÀÚ´Â ±â´Ù¸®´Â ¼ÒÄÏÀ» ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ¼ÒÄÏ API¸¦ ºÎ¸¥´Ù. ÀÚ¼¼ÇÑ »çÇ×À» °¨Ã߱⶧¹®¿¡ ·ÎÄà Æ÷Æ®¿¡ ±â´Ù¸®±âÀ§ÇØ ÀÌ Å¬·¡½º °´Ã¼¸¦ »ý¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù.

try/catch ¹®À» ÁÖ¸ñÇ϶ó. ServerSocket°ú ClientSocket Ŭ·¡½º´Â C++ÀÇ ¿¹¿Üó¸® ±â´ÉÀ» »ç¿ëÇÑ´Ù. Ŭ·¡½º ÇÔ¼ö°¡ ¾î¶² ÀÌÀ¯¿¡¼­°Ç ¹®Á¦°¡ »ý±â¸é SocketException.h¿¡ Á¤ÀÇµÈ SocketException ÇüÀÇ ¿¹¿Ü¸¦ ¹ß»ýÇÑ´Ù. ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÏÁö ¾ÊÀ¸¸é ÇÁ·Î±×·¥ÀÌ ³¡³ª±â¶§¹®¿¡ ó¸®ÇØÁÖ´Â °ÍÀÌ ÁÁ´Ù. À§¿¡¼­Ã³·³ SocketExceptionÀÇ description() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¿À·ù¹®À» ¾òÀ» ¼ö ÀÖ´Ù.

3.2 Ŭ¶óÀ̾ðÆ® - ¼­¹ö·Î ¿¬°á

ÀüÇüÀûÀΠŬ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ ¿¬°áÀÇ µÎ¹ø° ´Ü°è´Â Ŭ¶óÀ̾ðÆ®°¡ ¼­¹ö·Î ¿¬°áÀ» ½ÃµµÇÏ´Â ÀÏÀÌ´Ù. ÄÚµå´Â ¹æ±Ý Àü¿¡ º» ¼­¹ö ÄÚµå¿Í ºñ½ÁÇÏ´Ù.

¸ñ·Ï 2 : Ŭ¶óÀ̾ðÆ® ¼ÒÄÏ ¸¸µé±â ( simple_client_main.cppÀÇ ÀϺΠ)
#include "ClientSocket.h"
#include "SocketException.h"
#include <iostream>
#include <string>

int main ( int argc, int argv[] )
{
  try
    {
      // Create the client socket
      ClientSocket client_socket ( "localhost", 30000 );

      // rest of code -
      // send request, retrieve reply, etc...

    }
  catch ( SocketException& e )
    {
      std::cout << "Exception was caught:" << e.description() << "\n";
    }

  return 0;
}


ClientSocket Ŭ·¡½º °´Ã¼¸¦ ¸¸µé±â¸¸ÇÏ¸é ¸®´ª½º ¼ÒÄÏÀ» ¸¸µé¾î¼­ »ý¼ºÀÚ¿¡ ÁÖ¾îÁø È£½ºÆ®¿Í Æ÷Æ®·Î ¿¬°áÇÑ´Ù. ServerSocket Ŭ·¡½º¿Í °°ÀÌ »ý¼ºÀÚ°¡ ¾î¶² ÀÌÀ¯¿¡¼­°Ç ¹®Á¦°¡ »ý±â¸é ¿À·ù°¡ ¹ß»ýÇÑ´Ù.

3.3 ¼­¹ö - Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ ¹Þ¾ÆµéÀ̱â

Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ ¿¬°áÀÇ ´ÙÀ½ ´Ü°è´Â ¼­¹ö¿¡¼­ ÀϾ´Ù. ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ¸¦ ¹Þ¾ÆµéÀ̸é, µÎ ¼ÒÄÏ ¾ç´Ü°£ Åë½Å ä³ÎÀÌ ¿­¸°´Ù.

¿ì¸®´Â °£´ÜÇÑ ¼­¹ö¿¡ ÀÌ ±â´ÉÀ» Ãß°¡ÇØ¾ß ÇÑ´Ù. ´ÙÀ½Àº ¼öÁ¤µÈ ¹öÀüÀÌ´Ù.

¸ñ·Ï 3 : Ŭ¶óÀ̾ðÆ® ¿¬°á ¹Þ¾ÆµéÀ̱â ( simple_server_main.cppÀÇ ÀϺΠ)
#include "ServerSocket.h"
#include "SocketException.h"
#include <string>

int main ( int argc, int argv[] )
{
  try
    {
      // Create the socket
      ServerSocket server ( 30000 );

      while ( true )
	{
	  ServerSocket new_sock;
	  server.accept ( new_sock );

	  // rest of code -
	  // read request, send reply, etc...

	}
    }
  catch ( SocketException& e )
    {
      std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
    }

  return 0;
}

¿¬°áÀ» ¹Þ¾ÆµéÀ̱âÀ§ÇØ accept ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. ÀÌ ÇÔ¼ö´Â ¿¬°á ½Ãµµ¸¦ ¹Þ¾ÆµéÀÌ°í, ¿¬°á¿¡ ´ëÇÑ ¼ÒÄÏ Á¤º¸¸¦ new_sock¿¡ ä¿î´Ù. ¿ì¸®´Â ´ÙÀ½ Àý¿¡¼­ ¾î¶»°Ô new_sockÀ» »ç¿ëÇÏ´ÂÁö º¼ °ÍÀÌ´Ù.

3.4 Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö - ÀÚ·á ÁÖ°í¹Þ±â

ÀÌÁ¦ ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ¿äûÀ» ¹Þ¾Æµé¿´°í, ¼ÒÄÏ ¿¬°áÀ» ÅëÇØ ÀڷḦ ÁÖ°í¹ÞÀ» ½Ã°£ÀÌ´Ù.

C++ÀÇ °í±Þ ±â´ÉÁß Çϳª°¡ ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ´Â - °£´ÜÈ÷ ¸»Çؼ­, ¿¬»êÀÚ°¡ ƯÁ¤ ÀÛ¾÷À» Çϵµ·Ï ¸¸µå´Â - ´É·ÂÀÌ´Ù. ³ª´Â ClientSocket°ú ServerSocket Ŭ·¡½ºÀÇ <<¿Í >> ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ¿©, ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¼ÒÄÏ¿¡¼­ ÀڷḦ ÀÐ°í¾µ ¼ö ÀÖ°Ô ¸¸µé¾ú´Ù. ´ÙÀ½Àº °£´ÜÇÑ ¼­¹öÀÇ ¼öÁ¤µÈ ¹öÀüÀÌ´Ù.

¸ñ·Ï 4 : °£´ÜÇÑ ¼­¹ö ±¸Çö ( simple_server_main.cppÀÇ ÀϺΠ)
#include "ServerSocket.h"
#include "SocketException.h"
#include <string>

int main ( int argc, int argv[] )
{
  try
    {
      // Create the socket
      ServerSocket server ( 30000 );

      while ( true )
	{

	  ServerSocket new_sock;
	  server.accept ( new_sock );

	  try
	    {
	      while ( true )
		{
		  std::string data;
		  new_sock >> data;
		  new_sock << data;
		}
	    }
	  catch ( SocketException& ) {}

	}
    }
  catch ( SocketException& e )
    {
      std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
    }

  return 0;
}

new_sock º¯¼ö´Â ¸ðµç ¼ÒÄÏ Á¤º¸¸¦ ÀúÀåÇÏ°í À־, Ŭ¶óÀ̾ðÆ®¿Í ÀڷḦ ±³È¯Çϴµ¥ »ç¿ëÇÑ´Ù. "new_sock >> data;" ÁÙÀº "new_sock¿¡¼­ ÀڷḦ Àо 'data'¶ó´Â ¹®ÀÚ¿­ º¯¼ö¿¡ ÀúÀåÇÑ´Ù"´Â ¶æÀÌ´Ù. ºñ½ÁÇÏ°Ô ´ÙÀ½ ÁÙÀº 'data'¿¡ ÀÖ´Â ÀڷḦ ¼ÒÄÏÀ» ÅëÇØ Å¬¶óÀ̾ðÆ®·Î º¸³½´Ù.

ÁÖÀǸ¦ ±â¿ï¿´´Ù¸é ¿©±â¼­ ¸¸µç °ÍÀÌ echo ¼­¹öÀÓÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. Ŭ¶óÀ̾ðÆ®°¡ º¸³½ ÀÚ·á´Â ¸ðµÎ ´Ù½Ã Ŭ¶óÀ̾ðÆ®¿¡°Ô ±×´ë·Î µÇµ¹·ÁÁø´Ù. ¿ì¸®´Â ÀڷḦ º¸³»°í ¼­¹öÀÇ ÀÀ´äÀ» Ãâ·ÂÇϴ Ŭ¶óÀ̾ðÆ®¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

¸ñ·Ï 5 : °£´ÜÇÑ Å¬¶óÀ̾ðÆ® ±¸Çö ( simple_client_main.cppÀÇ ÀϺΠ)
#include "ClientSocket.h"
#include "SocketException.h"
#include <iostream>
#include <string>

int main ( int argc, int argv[] )
{
  try
    {

      ClientSocket client_socket ( "localhost", 30000 );

      std::string reply;
      try
	{
	  client_socket << "Test message.";
	  client_socket >> reply;
	}
      catch ( SocketException& ) {}

      std::cout << "We received this response from the server:\n\"" << reply << "\"\n";;

    }
  catch ( SocketException& e )
    {
      std::cout << "Exception was caught:" << e.description() << "\n";
    }

  return 0;
}

¿ì¸®´Â ¹®ÀÚ¿­ "Test Message."¸¦ ¼­¹ö·Î º¸³»°í, ¼­¹öÀÇ ÀÀ´äÀ» Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù.

4. ¸¸µç Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö¸¦ ÄÄÆÄÀÏÇÏ°í Å×½ºÆ®

¿ì¸®´Â ClientSocket°ú ServerSocket Ŭ·¡½ºÀÇ ±âº»ÀûÀÎ »ç¿ë¹ýÀ» »ìÆìºÃ´Ù. ÀÌÁ¦ ÇÁ·ÎÁ§Æ® Àüü¸¦ ÄÄÆÄÀÏÇÏ¿© Å×½ºÆ®Çغ¸ÀÚ.

4.1 ÆÄÀÏ ¸ñ·Ï

¿¹Á¦´Â ¾Æ·¡ ÆÄÀϵé·Î ±¸¼ºµÈ´Ù.

±âŸ:
Makefile - ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ Makefile
Socket.h, Socket.cpp - ¼ÒÄÏ API ÇÔ¼ö¸¦ ±¸ÇöÇÑ Socket Ŭ·¡½º
SocketException.h - SocketException Ŭ·¡½º
¼­¹ö:
simple_server_main.cpp - ÁÖÆÄÀÏ
ServerSocket.h, ServerSocket.cpp - ServerSocket Ŭ·¡½º
Ŭ¶óÀ̾ðÆ®:
simple_client_main.cpp - ÁÖÆÄÀÏ
ClientSocket.h, ClientSocket.cpp - ClientSocket Ŭ·¡½º

4.2 ÄÄÆÄÀÏ°ú Å×½ºÆ®

ÄÄÆÄÀÏÀº °£´ÜÇÏ´Ù. ¸ÕÀú ¸ðµç ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» ÇÏÀ§µðÅطθ®¿¡ ÀúÀåÇÏ°í, ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.


prompt$ cd directory_you_just_created
prompt$ make

±×·¯¸é ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç ÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿© simple_server¿Í simple_client Ãâ·Â ÆÄÀÏÀ» ¸¸µç´Ù. µÎ Ãâ·Â ÆÄÀÏÀ» Å×½ºÆ®ÇϱâÀ§ÇØ ÇÑ ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡¼­ ¼­¹ö¸¦ ½ÇÇàÇÏ°í, ´Ù¸¥ ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡¼­ Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇÑ´Ù.


ù¹ø° ÇÁ·ÒÇÁÆ®:
prompt$ ./simple_server
running....



µÎ¹ø° ÇÁ·ÒÇÁÆ®:
prompt$ ./simple_client
We received this response from the server:
"Test message."
prompt$

Ŭ¶óÀ̾ðÆ®´Â ¼­¹ö·Î ÀڷḦ º¸³»°í, ÀÀ´äÀ» Àо À§¿¡¼­Ã³·³ Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù. Ŭ¶óÀ̾ðÆ®¸¦ ¿øÇϴ¸¸Å­ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¼­¹ö´Â ¸Å ¿äû¿¡ ÀÀ´äÇÑ´Ù.

5. °á·Ð

¼ÒÄÏÀº ÇÁ·Î¼¼½º°£¿¡ ÀڷḦ º¸³»´Â °£´ÜÇÏ°í È¿À²ÀûÀÎ ¹æ¹ýÀÌ´Ù. ÀÌ ±Û¿¡¼­ ¿ì¸®´Â ¼ÒÄÏ Åë½ÅÀ» »ìÆ캸°í ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ® ¿¹Á¦¸¦ ¸¸µé¾îºÃ´Ù. ÀÌÁ¦ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ ¼ÒÄÏ Åë½ÅÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù!

Rob Tougher

RobÀº c++ ¼ÒÇÁÆ®¿þ¾î °øÇÐÀÚ·Î ´º¿å½Ã¿¡ »ì°í ÀÖ´Ù. ÁÁ¾ÆÇÏ´Â Ç÷¡Æû¿¡¼­ ÄÚµùÇÏÁö ¾ÊÀ»¶§´Â º¸Åë ¿©ÀÚ Ä£±¸ Nicole°ú ¾Ö°ß Halley¿Í ÇÔ²² Çغ¯À» °Å´Ñ´Ù.


Copyright © 2002, Rob Tougher.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 74 of Linux Gazette, January 2002