· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Humble Little Ruby Book/Chap6


1. 6 ¶óÀ̺귯¸®ÀÔ´Ï´Ù


º¸¼Ì´Ù½ÃÇÇ ·çºñ¿¡´Â Á¢±ÙÇÒ ¼ö ÀÖ´Â ³»Àå Ŭ·¡½ºµéÀÌ ¸¹½À´Ï´Ù. °£´ÜÇÑ ÅؽºÆ® ÀÔÃâ·Â¿¡¼­ºÎÅÍ ³×Æ®¿öÅ·°ú ¸ÖƼ¹Ìµð¾î¿¡ À̸£±â±îÁö Á¤¸» ¸¹Àº ¶óÀ̺귯¸®µéÀÌ ÀÖ½À´Ï´Ù. Win32¿Í ³×Æ®¿öÅ© µî ¸î °¡Áö ¶óÀ̺귯¸®¸¦ ¼±ÅÃÇÏ¿© »ìÆ캸¾ÒÁö¸¸, Àâ´ÙÇÑ ¸î °¡Áö Ŭ·¡½ºµéÀ» »¡¸® »ìÆ캸´Âµ¥ ½Ã°£À» ÅõÀÚÇÏ°í ½Í½À´Ï´Ù.

1.1. ¹®ÀÚ¿­ ´Ù·ç±â


·çºñÀÇ ¹®ÀÚ¿­ Áö¿øÀº ÆÞÀ̳ª ´Ù¸¥ ¾ð¾îµé°ú °ßÁÙ ¼ö ÀÖ´Â ¼öÁØÀÔ´Ï´Ù. »ç½Ç»ó ·¡¸® ¿ùÀÌ Áý¿¡ °¡¸é ·çºñ ÇÁ·Î±×·¡¸Ó·Î Å»¹Ù²ÞÇÑ´Ù´Â ¸»µµ µéÀº ÀûÀÌ ÀÖ½À´Ï´Ù. Á¦°¡ ÀÌ·± °ÍÀ» ¾Ë·Áµå·È´Ù´Â °ÍÀ» ´Ù¸¥ »ç¶÷¿¡°Ô ¾Ë¸®Áö ¸¶¼¼¿ä. ¹®ÀÚ¿­À» ´Ù·ç´Âµ¥´Â µÎ °¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ½ºÆ®¸µ °´Ã¼ÀÇ ÀνºÅϽº ¸Þ¼Òµå¿Í Á¤±Ô½ÄÀÔ´Ï´Ù.

1.1.1. ÀνºÅϽº ¸Þ¼Òµå

·çºñ ½ºÆ®¸µÀº ¹°·Ð °´Ã¼ÀÌ°í, ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ±×°ÍÀ» ´Ù·ê ¼ö ÀÖ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÕ´Ï´Ù. ¸ÕÀú, Splice(Á¢ÇÕ)¶ó°í ÇÏ´Â °¡Àå ´Ü¼øÇÏ°Ô ´Ù·ê ¼ö ÀÖ´Â °ÍÀ» ¾Ë¾Æº¼ °ÍÀÔ´Ï´Ù. ù ¹ø°·Î Á¢ÇÕÇÏ´Â ¹æ¹ýÀº Á¢ÇÕ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ¹è¿­ ¿¬»êÀÚ ¾²´Â °Íó·³ ¾²½Ã¸é µË´Ï´Ù. °´Ã¼Ã·ÀÚÀÇ ÇüÅ·ΠƯÁ¤ ¿ø¼Ò¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°½À´Ï´Ù.

the_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
puts the_alphabet[0..2]
¡æ   ABC
puts the_alphabet["HIJ"]
¡æ   HIJ
puts the_alphabet[1,2]
¡æ   BC
the_alphabet[1] = "!"
puts the_alphabet
¡æ   A!CDEFGHIJKLMNOPQRSTUVWXYZ

´Ù¸¥ ¹æ¹ýÀ¸·Î´Â splice ¸Þ¼Òµå¸¦ »ç¿ëÇؼ­ ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î Á¢ÇÕÇÒ ¼ö ÀÖ½À´Ï´Ù.

puts the_alphabet.slice(0, 3)
¡æ   ABC
puts the_alphabet.slice(0..5)
¡æ   ABCDEF

¹®ÀÚ¿­À» ¿øÇϴ´ë·Î ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ºÙÀÌ°í ÀÚ¸£°í ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ë¼Ò¹®ÀÚ¸¦ ¹Ù²Ü ¼ö ÀÖ´Â ¸Þ¼Òµåµµ ÀÖÀ¸¸ç, ƯÁ¤ ³»¿ëÀ» ÆíÁýÇϰųª, ¹®ÀÚ¿­À» º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â ¿¹Á¦°¡ ÀÖ½À´Ï´Ù.

a_str = "I likE To MesS with STRINGS!"
a_str.downcase
¡æ   i like to mess with strings!
a_str.upcase
¡æ   I LIKE TO MESS WITH STRINGS!
a_str.swapcase
¡æ   i LIKe tO mESs WITH strings!
a_str.capitalize
¡æ   I like to mess with strings!
a_str.capitalize!
puts a_str
¡æ   I like to mess with strings!
a_str.squeeze
¡æ   I like to mes with strings!

Squeeze ¸Þ¼Òµå´Â °°Àº ¹®ÀÚ°¡ ¿¬´Þ¾Æ ÀÖ´Â °æ¿ì¿¡ ÀÌ°ÍÀ» ÇϳªÀÇ ¹®ÀÚ¸¸ ³ª¿Àµµ·Ï ¹Ù²Ù¾îÁִµ¥, ÀÌ°ÍÀ» Á¦¿ÜÇÏ°í ´Ù¸¥ ¸Þ¼ÒµåµéÀº À̸§¸¸ º¸¾Æµµ »ç¿ë¹ýÀ» ºÐ¸íÈ÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù. °¢ ¸Þ¼Òµå´Â capitalize!¿¡¼­ º¼ ¼ö ÀÖµíÀÌ, ±× ÀÚ¸®¿¡¼­ ¹®ÀÚ¿­À» º¯°æ½ÃÄÑÁÖ´Â ¸Þ¼Òµåµµ Á¦°øÇÏ°í ÀÖ½À´Ï´Ù.

insert ¸Þ¼Òµå¸¦ ÀÌ¿ëÇϸé ƯÁ¤ À§Ä¡¿¡ ¹®ÀÚ¿­À» »ðÀÔÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â ¹®ÀÚ¿­À» ±× ÀÚ¸®¿¡¼­ º¯°æ½ÃÅ°´Ï ÁÖÀÇÇϼ¼¿ä! (¿Ö ÀÌ ¸Þ¼Òµå µÚ¿¡´Â ´À³¦Ç¥°¡ ºÙÁö ¾Ê´ÂÁö ¾Ë ¼ö ¾øÁö¸¸ ½ÇÁ¦·Î ¾È ºÙ¾î ÀÖ½À´Ï´Ù.)

into = "12345"
into.insert(2, "LETTERS!")
puts into
¡æ   12LETTERS!345

ÇÑÆíÀ¸·Î ƯÁ¤ ¹üÀ§ÀÇ ¹®ÀÚµéÀ» ¹®ÀÚ¿­¿¡¼­ Áö¿ì·Á¸é delete ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÕ´Ï´Ù.

gone = "got gone fool!"
gone.delete("o", "r-v")
puts gone
¡æ   g gne fl!

ÇÏÀÌÇÂÀ» µÎ ±ÛÀÚ »çÀÌ¿¡ ³ÖÀ¸¸é ·çºñ´Â ÀÌ ¹®ÀÚµéÀ» Æ÷ÇÔÇÏ¿© ¹®ÀÚµé »çÀÌ¿¡ ÀÖ´Â ¹üÀ§¸¦ »ý¼ºÇÕ´Ï´Ù. ¿©·¯ ¸Þ¼Òµå¿¡¼­ ÀÌ ±â¼úÀ» ¾µ ¼ö ÀÖÁö¸¸ »èÁ¦ÇÒ ¶§ ƯÈ÷ À¯¿ëÇÕ´Ï´Ù.

¸¶Áö¸· ¹®ÀÚ¸¦ Áö¿ì´Â °ÍÀº ¸Å¿ì Â¥Áõ½º·´°í ¾î¶² ¾ð¾î¿¡¼­´Â ±æ°Ô ½á¾ß ÇÕ´Ï´Ù. (¹Ù·Î ¿©·¯ºÐÀÇ PHP¸¦ º¸°í ÀÖ½À´Ï´Ù.) ´ÙÇàÈ÷µµ, ¹®ÀÚ¿­ 󸮰¡ °­·ÂÇÑ ¾ð¾î´ä°Ô chomp¿Í chopÀ» Á¦°øÇÕ´Ï´Ù.

eat_me = "A lot of letters\n"
eat_me.chomp
¡æ   A lot of letters
eat_me.chop
¡æ   A lot of letter
eat_me.chomp("ter")
¡æ   A lot of let

chomp ¸Þ¼Òµå´Â ±â·Ï ºÐ¸®ÀÚ¸¦ ¹®ÀÚ¿­ÀÇ ¸¶Áö¸·¿¡¼­ºÎÅÍ Áö¿öÁÝ´Ï´Ù. ÀÌ°ÍÀº Àü¿ª °´Ã¼ÀÎ $/¿¡ ÀúÀåµÇ¾î ÀÖ½À´Ï´Ù. $/¸¦ ±âº»°ªÀ¸·Î µÎ¾ú´Ù¸é \n, \r\n, \r°ú °°Àº ÁÙ¹Ù²Þ ¹®ÀÚµéÀ» Áö¿ï °ÍÀÔ´Ï´Ù. ¸¶Áö¸· ¿¹Á¦¿¡¼­Ã³·³ chomp¿¡ ¾î¶² ¹®ÀÚ¸¦ Áö¿ï °ÍÀÎÁö¸¦ ¸Å°³º¯¼ö¸¦ ³Ñ°Ü¼­ Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. chop ¸Þ¼Òµå´Â °£´ÜÈ÷ ¸¶Áö¸· ±ÛÀÚ¸¦ ¹«¾ùÀÌµç »ó°ü¾øÀÌ Áö¿ö¹ö¸³´Ï´Ù. (ÁÖ: \r\nÀº ÇÑ ¹®ÀÚ·Î ÀνÄÇÕ´Ï´Ù.)

°£´ÜÈ÷ ½ÃÀÛ°ú ³¡¿¡ ÀÖ´Â °ø¹é ¹®ÀÚµéÀ» Áö¿ö¾ß ÇÑ´Ù¸é, strip ¸Þ¼Òµå¸¦ ÀÌ¿ëÇϽʽÿÀ. lstrip, rstripÀ̳ª ±×³É stripÀ» ¾²½Ã¸é µË´Ï´Ù. ¿¹¸¦ µé¾î º¸°Ú½À´Ï´Ù.

stripper = "    La di da!    \t"
puts "[" + stripper.lstrip + "]"
¡æ  [La di da!         ]
puts "[" + stripper.rstrip + "]"
¡æ  [     La di da!]
puts "[" + stripper.strip + "]"
¡æ  [La di da!]

¿¹Á¦°¡ ¸íÈ®ÇÏÁö ¾Ê´Ù¸é lstrip°ú rstrip ¸Þ¼Òµå´Â ¾î¶² Á¾·ùÀÇ ºóÄ­(½ºÆäÀ̽º, ÅÇ, ÁÙ¹Ù²Þ µî)À» °¢°¢ ¿ÞÂÊÀ̳ª ¿À¸¥ÂÊ Æí¿¡¼­ Áö¿ó´Ï´Ù. strip ¸Þ¼Òµå´Â ¾çÂÊ¿¡¼­ ¸ðµÎ Áö¿ó´Ï´Ù.

split ¸Þ¼Òµå´Â ¹®ÀÚ¿­ ¸Þ¼Òµå Áß¿¡¼­ °¡Àå ¸¹ÀÌ »ç¿ëÇÏ´Â ¸Þ¼Òµå Áß¿¡ ÇϳªÀÏ °ÍÀÔ´Ï´Ù. Á¤ÇØÁø ±¸ºÐÀÚ·Î ¹®ÀÚ¿­À» ºÎºÐ ¹®ÀÚ¿­·Î ³ª´©¾î ÁÝ´Ï´Ù. ÇÑ ÀÔ¿¡ ½ï µé¾î°¥ Á¤µµÀÌ´Ï±î ¿¹Á¦ º¸¼¼¿ä.

breakable = "break,it,down,fool!"
breakable.split(",")
¡æ  ["break", "it", "down", "fool!"]

split ¸Þ¼Òµå´Â ¿©·¯ Á¶°¢À¸·Î ¹®ÀÚ¿­À» ³ª´¯´Ï´Ù. ÀÌ Á¶°¢µéÀº ½ºÆ®¸µ¿¡ ÀÖ´Â ±¸ºÐÀÚ À§Ä¡¸¦ ±âÁØÀ¸·Î ±¸ºÐÀÚ¸¦ Á¦°ÅÇϸ鼭 Àß¶ó¼­ ¹è¿­¿¡ ³ÖÀº °ÍÀÔ´Ï´Ù. ¹è¿­¿¡ µé¾î°¡°Ô µÇ¸é, ÁýÇÕü¸¦ µû¶ó¼­ ¹Ýº¹ÇÏ¿© ÀÚ·á¿¡ ´Ù¾çÇÑ ¿¬»êÀ» ÇÏ´Â °ÍÀÌ °¡´ÉÇØÁý´Ï´Ù.

±×·¸Áö¸¸ ¹®ÀÚ¿­¿¡ Çã¿ëµÇÁö ¾Ê´Â ¿¬»êÀ» ÇÏ´Â °æ¿ì¿¡´Â ¾î¶»°Ô ÇØ¾ß ÇÒ±î¿ä? ¿¹¸¦ µé¾î ¹®ÀÚ¿­À» ÅؽºÆ® ÆÄÀÏ¿¡¼­ Àоîµé¿© ¼ýÀÚ¿Í ÇÔ²² »ê¼ú ¿¬»êÀ» ÇØ¾ß Çϴµ¥, ÆÄÀÏ¿¡¼­ ÀÐÀ¸¸é Ç×»ó ¹®ÀÚ¿­ÀÌ µË´Ï´Ù. ·çºñ¿¡ ÀÖ´Â to_f¿Í to_i ¸Þ¼Òµå¸¦ ÀÌ¿ëÇϸé ÀÌ°ÍÀ» ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.

numerical_string = "1234"
numerical_string + 6
¡æ  ! TypeError
numerical_string.to_f + 6.7
¡æ  1240.7

¼ÒÄÏÀ̳ª ÆÄÀÏ, ȤÀº »ç¿ëÀڷκÎÅÍ ÀԷ¹ÞÀº ÀÚ·áµéÀº ¸ðµÎ ¹®ÀÚ¿­À̶ó´Â °ÍÀ» ±â¾ïÇÏ´Â °ÍÀº ¸Å¿ì Áß¿äÇÕ´Ï´Ù. ÀÌ·± ÀÚ·á¿¡ ¾î¶² Á¾·ùÀÇ ¼öÇÐ ¿¬»êÀ» ÇÏ·Á°í Çϸé ÀÌ·± ¸Þ¼Òµå¸¦ ¸ÕÀú ½ÇÇàÇØ¾ß ÇÕ´Ï´Ù.

1.1.2. Á¤±Ô½Ä


ÀÌÀü¿¡ Á¤±Ô½ÄÀ» ³Ñ°ÜÁÖ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾ð±ÞÇÑ ÀûÀÌ ÀÖÀ¸¹Ç·Î ´Ù¸¥ °÷¿¡¼­ ·çºñ ¿¹Á¦¸¦ º»´Ù°í ÇÏ´õ¶óµµ ±¸¹®ÀÇ »ý±è»õ°¡ Çò°¥¸®Áö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ÀÌÁ¦ Á¤±Ô½ÄÀÌ ¾î¶² °ÍÀÌ°í ÀÌ°ÍÀÌ ¾ó¸¶³ª ³î¶ó¿ï Á¤µµ·Î À¯¿ëÇÏ°Ô ¾²ÀÏ ¼ö ÀÖ´ÂÁö¿¡ ´ëÇؼ­ À̾߱âÇÏ°íÀÚ ÇÕ´Ï´Ù.

¸ÕÀú, Àú´Â ¿©·¯ºÐ¿¡°Ô Á¤±Ô½Ä¿¡ ´ëÇÑ ¿Ïº®ÇÑ ³»¿ëÀ» °¡¸£Ä¥ »ý°¢µµ ¾ø°í, ±× ¼Â° »çÃÌ»¹ÀÎ Samuel del Fuega 4¼¼ÀÇ Àü±â·Î ¿©·¯ºÐÀ» Áö·çÇÏ°Ô ÇÏ°í ½ÍÀº »ý°¢µµ ¾ø½À´Ï´Ù. ´ÜÁö Àú´Â ¾ÆÁÖ ±âº»ÀûÀÎ ¿¹Á¦·Î ¸Þ¼ÒµåÀÇ »ç¿ë¹ý°ú ¾Æ¹« ´ë°¡µµ ¾øÀÌ Æ¯º°°¡·Î ºÎ·Ï¿¡ Á¤±Ô½ÄÀÇ ¾îµÎ¿î ¼¼°è·Î ºüÁ®µé¾î°¡°í ½ÍÀº ºÐÀÌ Âü°íÇÒ ¸¸ÇÑ URLÀ» ÷ºÎÇØ µÎ¾ú½À´Ï´Ù. ºÎ·Ï A¿¡ ÀÖ½À´Ï´Ù. ÈïºÐµÇ½ÃÁö ¾Ê³ª¿ä? ÀÌÁ¦ ÁøÇàÇØ º¾½Ã´Ù.

Á¤±Ô½ÄÀº ¶§¶§·Î regexp ȤÀº regex¶ó°íµµ ºÎ¸£´Â ¹®ÀÚ¿­Àε¥, ±¸¹® ¹ýÄ¢µé¿¡ µû¶ó¼­ ÀÌ°Í¿¡ ¾î¿ï¸®´Â ¹®ÀÚ¿­µéÀÇ ÁýÇÕÀ» ±â¼úÇÑ °ÍÀÔ´Ï´Ù. °£´ÜÇÑ °Ë»ö¿¡¼­ºÎÅÍ ½ÃÀÛÇÏ¿©, °Ë»öÀ» Æ÷ÇÔÇÑ ¹®ÀÚ¿­ ġȯ, ´ëü, ÀÚ·á À̵¿À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹®ÀÚ¿­À» ´Ù·ç±â À§ÇÑ À¯¿ëÇÑ µµ±¸·Î½á ¿©·¯ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ Ãß°¡µÇ¾î ÀÖ°í, ÈĽĿ¡ ¾ñ¾î³õÀº ¸ÀÀÖ´Â ÅäÇÎÀÔ´Ï´Ù.

Á¤±Ô½ÄÀº ¿©·¯°¡Áö¸¦ ÇÒ ¼ö ÀÖµµ·Ï dzºÎÇÑ ±¸¹®À» µÎ°í ÀÖ½À´Ï´Ù. ±×·¯³ª °£°áÇÔ°ú ½ºÄÚÇÁÀÇ ¿ÂÀüÇÔÀ¸·Î ÀÎÇÏ¿© ¾ÆÁÖ °£´ÜÇÏ°Ô Á¤±Ô½ÄÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¤±Ô½ÄÀ» ¿ÏÀüÈ÷ ÀÌÇØÇÏ·Á¸é Á¤±Ô½Ä ÀÔ¹®¼­ ²¨³»µé¾î¾ß°ÚÁö¸¸, ÀÔ¹®¼­ ¾øÀ̵µ ÁøÇà »óȲÀ» ÀÌÇØÇÏ½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

Á¤±Ô½ÄÀ» °¡Àå °£´ÜÈ÷ »ç¿ëÇÏ´Â ¸ÂÃãºÎÅÍ ½ÃÀÛÇØ º¾½Ã´Ù. Á¤±Ô½ÄÀ¸·Î ½±°Ô ¹®ÀÚ¿­À» ãÀ» ¼ö ÀÖ½À´Ï´Ù. ¹®ÀÚ¿­ÀÌ ´Ù¸¥ ¹®ÀÚ¿­ÀÇ ºÎºÐ¹®ÀÚ¿­ÀÎÁö º¸°í ½Í´Ù°í ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µË´Ï´Ù.

matchmaker = "I'm a cowboy, baby!"
matchmaker =~ /cow/
¡æ  6
matchmaker.match("cow")
¡æ  #<MatchData:0x61d3120>

=~ ¿¬»êÀÚ¸¦ ÀÌ¿ëÇϸé ÆÐÅÏÀÌ Ã³À½ ¸Â¾Æµé¾î°¡´Â °÷ÀÇ À§Ä¡¸¦ µ¹·ÁÁÝ´Ï´Ù. ±×·¯³ª ¹®ÀÚ¿­ÀÇ match ¸Þ¼Òµå¸¦ ÀÌ¿ëÇϸé, MatchData °´Ã¼¸¦ ¾òÀ» ¼ö ÀÖ°í ÀÌ ¸ÂÃã¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ¿©·¯°¡Áö ¿É¼ÇÀ» ÁÝ´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù.

my_message = "Hello there!"
my_message.match(/(..)(..)/).captures
¡æ  ["He", "ll"]

captures ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¸é °¢ Á¤±Ô½Ä¿¡ ¸Â´Â °á°ú¸¦ ¹ÝȯÇÕ´Ï´Ù. to_a ¸Þ¼Òµåµµ ºñ½ÁÇÏ°Ô °á°ú¸¦ ³»Áö¸¸, ¿ÏÀüÈ÷ ¸ÂÃçÁø ¹®ÀÚ¿­µµ ¹ÝȯÇÕ´Ï´Ù. Á» ¹Ùº¸°°Àº ¿¹Á¦¿´Áö¸¸ ´õ ±×·²µíÇÑ ¿¹Á¦¸¦ º¾½Ã´Ù. µÎ ±¸ºÐÀÚ »çÀÌ¿¡ ÀÖ´Â ÅؽºÆ®¸¦ ¾ò°í ½Í´Ù°í ÇսôÙ. ¿©±â ¿øÇÏ´Â °ÍÀÌ ÀÖ½À´Ï´Ù.

html_element = "<html>"
my_element_text = html_element.match("(<)(.*)(>)").captures
puts my_element_text[1]
¡æ  html

È£±â½ÉÀÌ ¸¹À¸½Å ÆíÀ̶ó¸é ·çºñ API ¹®¼­¿¡ º¸¼Å¼­ MatchData Ŭ·¡½º¿¡ ´ëÇÑ Á¤º¸¸¦ º¸½Ç ¼öµµ ÀÖ½À´Ï´Ù.

Áß°£¿¡ ÀÖ´Â °ÍµéÀº ¹ö¸®°í ¸ÂÃçÁø °á°úÀÇ ¹è¿­¸¸À» °£´ÜÈ÷ ¾ò°íÀÚ ÇÑ´Ù¸é scan ¸Þ¼Òµå¸¦ ¾²½Ç ¼ö ÀÖ½À´Ï´Ù.

my_message = "Hello there!"
my_message.scan(/(..)(..)/)
¡æ  [["He", "ll"], ["o ", "th"], ["er", "e!"]]

µ¹·ÁÁÖ´Â °ªÀÌ ´Ù¸¥ °Í ¿Ü¿¡µµ match¿Í scanÀº "¿å½É"ÀÇ Á¤µµ°¡ ´Ù¸¨´Ï´Ù. "¿å½É ¸¹Àº" Á¤±Ô½ÄÀ̳ª ¸Þ¼Òµå´Â Çϳª°¡ ¾Æ´Ï¶ó ¹ß»ýµÇ´Â ¸ðµç ¹«´Ì¸¦ ¸ÂÃß·Á°í ³ë·ÂÇÕ´Ï´Ù. scan ¸Þ¼Òµå´Â ¿å½ÉÀÌ ¸¹½À´Ï´Ù. ÀÌ°ÍÀº ¹®ÀÚ¿­¿¡ ³ªÅ¸³ª´Â ¸ðµç ¹«´Ì¸¦ ´Ù ¸ÂÃß·Á°í ÇÕ´Ï´Ù. (ÁÖ: match¸¦ ÀÌ¿ëÇÏ´õ¶óµµ ƯÁ¤ Á¤±Ô½ÄÀ» ÀÌ¿ëÇÏ¸é ¿å½É¸¹°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.)

Á¤±Ô½ÄÀº ¹®ÀÚ¿­À» ´ëüÇÏ´Â ¿ëµµ·Îµµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¦´ë·Î À¯·ÂÇÑ Á¤±Ô½ÄÀ» ÀÌ¿ëÇϸé Á¤±Ô½ÄÀ» ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿­À» ´ëüÇÏ´Â °ÍÀº ¾ÆÁÖ À¯¿¬ÇÕ´Ï´Ù. ´Ù½Ã ¸»¾¸µå·Á¼­ °í±Þ Á¤±Ô½Ä¿¡ ´ëÇÏ¿© ³íÀÇÇÏÁö ¾Ê±â ¶§¹®¿¡ ÀÌ ±â¹ýÀÇ ÁøÁ¤ÇÑ À¯¿ëÇÔÀº ³ªÅ¸³ªÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ±×·¯³ª Á¤±Ô½ÄÀ» ÁøÁöÇÏ°Ô »ìÆ캸½Ã°í ÀÌÁ¡À» ¾òÀ» ¼ö ÀÖÀ¸¼ÌÀ¸¸é ÁÁ°Ú½À´Ï´Ù. Á¤±Ô½ÄÀ» ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿­À» ´ëüÇÏ·Á¸é ¹®ÀÚ¿­ ÀνºÅϽºÀÇ subÀ̳ª gsub ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¾ß ÇÕ´Ï´Ù.

go_away = "My name is Freak Nasty!"
go_away.sub("y", "o")
¡æ  Mo name is Freak Nasty!
go_away.gsub("y", "o")
¡æ  Mo name is Freak Nasto!
go_away.sub("Freak Nasty", "Fred Jones")
¡æ  My name is Fred Jones!

sub ¸Þ¼Òµå´Â ù¹ø°·Î ¹«´Ì¿Í ¸Â´Â °Í¸¸ ¹Ù²ÙÁö¸¸ gsub´Â ¿å½ÉÀÌ ¸¹¾Æ¼­ ¸ðµç ¸ÂÃãÀ» ¹Ù²Ù·Á°í ÇÒ °ÍÀÔ´Ï´Ù.. (g¸¦ Æ÷±âÇÏÁö ¾Ê¾ÒÀ¸´Ï±î¿ä) °¢ ¸Þ¼ÒµåÀÇ ¿å½ÉÀÇ Á¤µµ´Â ƯÁ¤ Á¤±Ô½ÄÀ» »ç¿ëÇÏ´ÂÁö¿¡ ´Þ·Á ÀÖ½À´Ï´Ù. ´õ °­·ÂÇÑ Á¤±Ô½ÄÀ» ¹è¿ì¸é ´õ ¸¹ÀÌ ¾µ ¼ö ÀÖ½À´Ï´Ù. ºÎ·Ï A¸¦ º¸¼Å¼­ ´õ ¸¹Àº Á¤º¸¸¦ ¾òÀ¸¼¼¿ä.

1.2. ³¯Â¥/½Ã°£

µ¨¸®¿¡¼­ ÇÜ°ú ¸ÀÀÖ´Â °í±â¸¦ ãÀ¸¸é¼­ ´Þ·ÂÀ» ¹ö¹Â´Ù¿¡ µÎ°í ¿Â °ÍÀº ±ú´ÞÀ¸½Å ÀûÀÌ ÀÖ½À´Ï±î? Áö³­ õ³â¿¡ Á¦°Ô ±×·± ÀÏÀÌ ÀϾ°í ¾ê±â¸¦ ÇØ µå¸®ÀÚ¸é, Àü À¯È¤¿¡ ³Ñ¾î°¡±â Á÷ÀüÀ̾ú½À´Ï´Ù. ´Þ·ÂÀÌ ¾ø´Ù´Â °ÍÀº ³·ÀÌ ¾ø´Ù´Â °ÍÀÌ°í, ³·ÀÌ ¾ø´Ù´Â °ÍÀº ¹ãÀÌ ¾ø´Ù´Â ¶æÀ¸·Î Á¦°¡ Á×À» ¼öµµ ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ´ÙÇàÈ÷µµ ·çºñ°¡ ²Ï³ª ¾µ¸¸ÇÑ ³¯Â¥¿Í ½Ã°£ ¶óÀ̺귯¸®¸¦ Á¦°øÇؼ­ Á¦ ¹ÝÂÊ Ã³³²ÀÇ ¾Ö¿Ïµ¿¹° ¿ø¼þÀÌÀÇ Á¶·Ã»çÀÇ °³¸¦ ½ÃÄѼ­ ¾îÁ¦ ¿ìÆíÀ¸·Î Á¦ ´Þ·ÂÀ» º¸³»µµ·Ï ÇÏ¿´½À´Ï´Ù.

·çºñ ¶óÀ̺귯¸®¿¡´Â ¼¼ °³ÀÇ ³¯Â¥ ½Ã°£ Ŭ·¡½º°¡ ÀÖ½À´Ï´Ù. Date, Time °¡ 1.4¿¡¼­ ¸¸µé¾îÁ³°í, 9 °³¿ù µÚ¿¡ DateTime ÀÌ »ý°å´Ù´Â ¼Ò¹®À» µé¾ú´Âµ¥, ÀÌ ¼Ò¹®À» ¾ê±âÇØÁØ »ç¶÷Àº ÀÌ·± ¾ê±âµµ ÇØÁÖ¾ú½À´Ï´Ù. ·¹ÀϽº°¡ ·çºñ ÇÁ·Î±×·¡¸ÓÀÇ ½Å»ç Ŭ·´À̶ó°í ¸»ÀÌÁÒ.

1.2.1. Date Ŭ·¡½º

Á¦ÀÏ ¸ÕÀú ¾Ë¾Æº¼ °ÍÀº DateÀÔ´Ï´Ù. ÀÌ Å¬·¡½º´Â ·çºñ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ ÀúÀåÇÏ°í, ´Ù·ç°í, ºñ±³ÇÒ ³¯Â¥¸¦ °£´ÜÈ÷ ³ëÃâÇÕ´Ï´Ù.

                                         
mydate = Date.new(1999, 6, 4)             ¡æ 1999-06-04
mydatejd = Date.jd(2451334)               ¡æ 1999-06-04
mydateord = Date.ordinal(1999, 155)       ¡æ 1999-06-04
mydatecom = Date.commercial(1999, 22, 5)  ¡æ 1999-06-04
Date.jd_to_civil(2451334)                 ¡æ [1999,6,4]
Date.jd_to_civil(2451334)                 ¡æ [1999,6,4]
mydatep = Date.parse("1999-06-04")        ¡æ 1999-06-04

º¸½Ã´Ù½ÃÇÇ, ³¯Â¥ ÀνºÅϽº´Â ¹®ÀڷΠǥÇöµÈ ¹æ½ÄÀÌ ¿ÀÈ÷·Á ´õ °£´ÜÇÕ´Ï´Ù. °£´ÜÈ÷ ³¯Â¥¸¦ ¸Å°³º¯¼ö·Î ³Ñ°Ü¼­ new ȤÀº civil ¸Þ¼Òµå¸¦ È£ÃâÇÏ¸é µË´Ï´Ù.ÀÌ ¸Þ¼Òµå´Â Àͼ÷ÇÑ ³¯Â¥ ÇüŸ¦ ¾²Áö¸¸ ´Ù¸¥ ³¯Â¥ Çüŵµ Áö¿øÇÕ´Ï´Ù. jd ¸Þ¼Òµå´Â À²¸®¿ì½º·ÂÀÇ ³¯¼ö¸¦ ±â¹ÝÀ¸·Î ÇÏ°í ÀÖ½À´Ï´Ù. ordinal ¸Þ¼Òµå´Â OrdinalÀ» ³Ñ°ÜÁÙ ¼öµµ ÀÖ°í, ¿¬µµ¿Í ³¯ ¼ö¸¦ ³Ñ°ÜÁÖ¾î Date °´Ã¼¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. commercial ¸Þ¼Òµå´Â Commercial °´Ã¼ ȤÀº ¿¬µµ, ÁÖ ¼ö, ³¯ ¼ö¸¦ ³Ñ°ÜÁÖ¾î Date °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. commercial_to_jd, jd_to_civilµî, ³¯Â¥ ÇüŸ¦ ¹Ù²Ù´Â ¸Þ¼Òµå°¡ Á¦°øµË´Ï´Ù.

À̰͵鸸 ÀÖ´õ¶óµµ Àß µ¿ÀÛÇÏ°ÚÁö¸¸, parse ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ´Â ¸¶Áö¸· ¿¹Á¦¿¡ ÁÖ¸ñÇϼ¼¿ä. ¹®ÀÚ¿­À» Date °´Ã¼·Î ºÐ¼®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀÌ new ¸Þ¼Òµå ´ÙÀ½À¸·Î Á÷°üÀûÀ¸·Î Date °´Ã¼¸¦ ¸¸µå´Â ¹æ¹ýÀÔ´Ï´Ù.

´Ù¾çÇÑ Å¬·¡½º ¸Þ¼Òµå·Î ÀÔ·ÂÀ» Å×½ºÆ®ÇØ º¼ ¼ö ÀÖ°í, Date °´Ã¼¸¦ ¾ò°í³ª¸é ¸ðµç Á¾·ùÀÇ Á¤º¸¸¦ ¸î¸î ÀνºÅϽº ¸Þ¼Òµå¿¡¼­ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

Date.valid_jd?(3829)             ¡æ 3829
Date.valid_civil?(1999, 13, 43)  ¡æ nil
mydate.mon                       ¡æ 6
mydate.yday                      ¡æ 155
mydate.day                       ¡æ 4

º¸½Ã´Ù½ÃÇÇ Æ¯Á¤ ÇüÅÂÀÇ Å¸´ç¼ºÀ» °Ë»çÇÒ ¼ö ÀÖ°í, ÀνºÅϽº ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© ´Ù¸¥ ÇüÅ·Πº¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇØÀÇ ³¯ ¼ö(yday), ¿ù(mon)µî ¿©·¯ ±¸¼º ¿ä¼ÒµéÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ±âº» ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© ³¯Â¥¸¦ ºñ±³ÇÏ°í ´Ù·ê ¼öµµ ÀÖ½À´Ï´Ù.

date1 = Date.new(1985, 3, 18)
date2 = Date.new(1985, 5, 5)
date1 < date2                  ¡æ true
date1 == date2                 ¡æ false
date3 = date1
date1 == date3                 ¡æ true
date1 << 3                     ¡æ 1984-12-18
date2 >> 5                     ¡æ 1985-10-05

º¸½Ã´Ù½ÃÇÇ ³¯Â¥¸¦ ºñ±³ÇÏ´Â °ÍÀº Ç¥ÁØ ¼ýÀÚ °ªÀ» ºñ±³Çϰųª ºñ½ÁÇÑ °ÍµéÀ» ºñ±³ÇÏ´Â °Í°ú °°½À´Ï´Ù. ³¯Â¥³¢¸® ºÎµîÈ£·Î ´ë¼Ò ºñ±³¸¦ ÇÒ ¼ö Àִµ¥, ¾î¶² ³¯º¸´Ù ´õ ¾Õ¿¡ ¿À´Â ³¯Àº "º¸´Ù ÀÛÀº" ³¯ÀÌ°í ¾î¶² ³¯ º¸´Ù ´õ µÚ¿¡ ÀÖ´Â ³¯Àº "º¸´Ù Å«" ³¯ÀÔ´Ï´Ù. >> ¿Í << ¿¬»êÀÚ¸¦ ½á¼­ ´ÞÀ» ´õÇϰųª »¬ ¼ö ÀÖ½À´Ï´Ù. ¸¶Áö¸· µÎ ¿¹Á¦¸¦ º¸¼¼¿ä. ÀÌÁ¦ Date Ŭ·¡½º¿¡ ´ëÇØ Àͼ÷ÇØÁ³À¸´Ï Time Ŭ·¡½º·Î ³Ñ¾î°©½Ã´Ù.

1.2.2. Time Ŭ·¡½º


ŸÀÓ Å¬·¡½º´Â Date Ŭ·¡½º¿Í ±â´ÉÀÌ ¸Å¿ì À¯»çÇѵ¥, ±×³É ³¯Â¥°¡ ¾Æ´Ï¶ó ½Ã°£À» Âï´Âµ¥ ´õ ÁßÁ¡À» µÎ°í ÀÖ½À´Ï´Ù. Date Ŭ·¡½º¿Í ºñ½ÁÇÏ°Ô ´Ù¾çÇÑ »ý¼ºÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

rightnow = Time.new
       ¡æ   Sun Sep 10 21:36:15 Eastern Daylight Time 2006
Time.at(934934932)
       ¡æ   Tue Aug 17 20:08:52 Eastern Daylight Time 1999
Time.local(2000,"jan",1,20,15,1)
       ¡æ   Sat Jan 01 20:15:01 Eastern Standard Time 2000
Time.utc(2006, 05, 21, 5, 13)
       ¡æ   Sun May 21 05:13:00 UTC 2006
Time.parse("Tue Jun 13 14:15:01 Eastern Standard Time 2005")
       ¡æ   Tue Jun 13 14:15:01 Eastern Daylight Time 2006

º¸½Ã´Ù½ÃÇÇ, °£´ÜÈ÷ new ¸Þ¼Òµå¸¦ È£ÃâÇϰųª now¸¦ È£ÃâÇÏ¸é »õ Time °´Ã¼¸¦ ÇöÀç ½Ã°£°ú ½Ã°£ ¿µ¿ªÀ¸·Î »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ƯÁ¤ ½Ã°£ÀÌ ÇÊ¿äÇϸé atÀ» ¾µ ¼ö Àִµ¥ ÀÌ°ÍÀº 1970³â 1¿ù 1ÀϷκÎÅÍ Áö³ª¿Â ÃÊ·Î ¿î¿µµË´Ï´Ù. utc¿Í gm ¸Þ¼Òµå¸¦ ½á¼­ ÀÌµé ½Ã°£ ¿µ¿ª°ú Á¦°øµÇ´Â ¸Å°³º¯¼ö¿¡ ±â¹ÝÇÑ ½Ã°£À» »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. Date¿¡¼­ Çß´ø °Íó·³ parse ¸Þ¼Òµå¸£¸£ ½á¼­ Time °´Ã¼¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

Time Ŭ·¡½º´Â °´Ã¼ÀÇ °ªÀ» ¾òÀ» ¼ö ÀÖ°í, °ªÀ» º¯È¯ÇÒ ¼ö ÀÖ°í, °ªÀ» ´Ù¸¥ ÇüÅ·ΠÃâ·ÂÇÒ ¼ö ÀÖ´Â ¸î¸î ÀνºÅϽº ¸Þ¼Òµåµµ Á¦°øÇÕ´Ï´Ù.

rightnow = Time.new
       ¡æ   Sun Sep 10 21:42:30 Eastern Daylight Time 2006
rightnow.hour
       ¡æ   21
rightnow.mon
       ¡æ   9
rightnow.day
       ¡æ   10
rightnow.to_i
       ¡æ   1158543750
rightnow.to_s
       ¡æ   Sun Sep 17 21:42:30 Eastern Daylight Time 2006

º¸½Ã´Ù½ÃÇÇ, TimeÀÇ ¸Þ¼ÒµåµéÀº DateÀÇ ¸Þ¼Òµå¿Í ¸Å¿ì ºñ½ÁÇÕ´Ï´Ù. ½Ã°£ °´Ã¼¸¦ Fixnum°ú °°Àº ´Ù¸¥ Ŭ·¡½º·Î ¹Ù²Ù´Â °Íµµ °¡´ÉÇÕ´Ï´Ù.

ÇÑ ÀνºÅϽº ¸Þ¼Òµå¸¦ Àá±ñµ¿¾È ÁýÁßÇؼ­ º¾½Ã´Ù. strftime ¸Þ¼Òµå´Â ¾ÆÁÖ À¯¿ëÇÑ ¸Þ¼Òµå·Î ¼±ÅÃÇÑ ÇüÅ·Π½Ã°£À» Ãâ·ÂÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â C++ÀÇ printf¿Í ¾ÆÁÖ À¯»çÇÕ´Ï´Ù. %f¿Í °°Àº ±¸ºÐÀÚ¸¦ ½á¼­ Ãâ·ÂµÇ´Â ¹®ÀÚ¿­ÀÇ °ªÀÇ À§Ä¡¸¦ ³ªÅ¸³¾ ¼ö ÀÖ½À´Ï´Ù. ¸î °¡Áö ¿¹Á¦¸¦ º¸½Ã°Ú½À´Ï´Ù.

rightnow = Time.now
rightnow.strftime("%m/%d/%Y")
       ¡æ 09/10/2006
rightnow.strftime("%I:%M%p")
       ¡æ 09:13PM
rightnow.strftime("The %dth of %B in '%y")
       ¡æ The 17th of September in '06
rightnow.strftime("%x")
       ¡æ 09/17/06

strftime ¸Þ¼Òµå´Â Time ¸ðµâ¿¡¼­ °¡Àå º¹ÀâÇÑ ¸Þ¼Òµå Áß¿¡ ÇϳªÀÔ´Ï´Ù. ÀÌ°ÍÀ¸·Î ´õ ÇÒ¼ö ÀÖ´Â °Í¿¡ ´ëÇÑ Á¤º¸¸¦ ´õ ¾ò°í ½ÍÀ¸½Ã´Ù¸é Time Ŭ·¡½ºÀÇ ¹®¼­¸¦ http://www.ruby-doc.org/core/classes/Time.html ¿¡¼­ ã¾Æº¸½Ê½Ã¿À.

1.2.3. Date¿Í Time

DateTime Ŭ·¡½º´Â ÀÌÀüÀÇ µÎ Ŭ·¡½º¸¦ ÇϳªÀÇ Æí¸®ÇÏÁö¸¸ ¾à°£ ´ú È¿À²ÀûÀΠŬ·¡½º·Î ¸¸µç °ÍÀÔ´Ï´Ù. DateTime Ŭ·¡½º´Â Date¿¡ ´ÜÁö ¸î °¡Áö ½Ã°£ ±â´ÉÀÌ Àß µé¾î°£ ¼­ºê Ŭ·¡½ºÀÔ´Ï´Ù. ¹¹ È®½ÇÈ÷ ÇØ µÎ´Â °ÍÀº ÁÁÀº ½ÃµµÀÔ´Ï´Ù¸¸ ³»°Ô ¹°¾îº¸½Å´Ù¸é ¾µµ¥ ¾ø´Âµ¥ ½Ã°£³¶ºñ ÇÏÁö ¸»¶ó°í ´ë´äÇÒ°Ì´Ï´Ù. ±×·¸´Ù°í Çصµ ¸î °¡Áö Àç¹ÌÀÖ´Â ±â´ÉµéÀÌ ÀÖ½À´Ï´Ù.

rightnow = DateTime.now
       ¡æ 2006-09-10T21:56:45-0400
maytime = DateTime.civil(2006, 5, 6)
       ¡æ 2003-05-06T00:00:00Z
parsed = DateTime.parse("2006-07-03T11:53:02-0400")
       ¡æ 2006-07-03T11:53:02-0400
parsed.hour                                  ¡æ 11
parsed.day                                   ¡æ3
parsed.year                                  ¡æ 2006

Date Ŭ·¡½º¿Í ¸Å¿ì ºñ½ÁÇÏ°Ô µ¿ÀÛÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ´Ù¾çÇÑ ³¯Â¥ ÇüŸ¦ ÀÌ¿ëÇÏ¿© »ý¼ºÇϰųª ³¯Â¥/½Ã°£ ¹®ÀÚ¿­À» ºÐ¼®ÇÒ ¼ö ÀÖ½À´Ï´Ù. Date¿Í Time Ŭ·¡½ºÃ³·³ °´Ã¼ ³»ºÎÀÇ ´Ù¾çÇÑ °ªµéÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.

ÀÌÁ¦ ¾Æ¸¶ ¸Ó¸®¸¦ ±ÜÀû°Å¸®½Ã¸é¼­ ¿Ö ÀÌ°ÍÀ» ¾ðÁ¦ ½á¾ß ÇÏ´ÂÁö ±Ã±ÝÈ÷ ¿©±â½Ç °ÍÀÔ´Ï´Ù. °³ÀÎÀûÀ¸·Î DateTimeÀº ¾²Áö ¾Ê°í TimeÀ̳ª Date¸¦ ÀÌ¿ëÇÕ´Ï´Ù. ¶§·Î´Â DateTimeÀ» ¾²Áö ¾ÊÀ» ¼ö ¾ø´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª ±×³É Date¿Í TimeÀ» ¾²¸é DateTimeÀ» ¾²´Â °Íº¸´Ù 800%ÀÇ ¼º´É Çâ»óÀÌ ÀÖÀ» °ÍÀ̶ó´Â Á¡À» ¸í½ÉÇϼ¼¿ä. ¾î¶² °æ¿ì¿¡´Â Æú¶õµå Å©±â ¸¸Å­ÀÇ ¼º´É Â÷ÀÌ´Â ¹®Á¦°¡ µÈ´ä´Ï´Ù.

1.3. ÇØ½Ã¿Í ¾Ïȣȭ

°¡²û ¿©·¯ºÐÀº »ç¶÷µéÀÌ µ¥ÀÌÅ͸¦ ¸ø º¸°Ô ÇÏ°í ½ÍÀ» °ÍÀÔ´Ï´Ù. ¾Æ¸¶ ºÒÄèÇÑ ÀÏÀÌ »ý°Ü¼­ ´Ù¸¥ »ç¶÷µéÀÌ ¸ô¶úÀ¸¸é ÇÒ ¶§µµ ÀÖÀ» °ÍÀÔ´Ï´Ù. ȤÀº ÀØ°í ½ÍÀº ÀÏÀº ÇؽÃÇÏ°í ´õ ÀÌ»ó ÀÌ°ÍÀ» °ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù. ´ÙÇàÈ÷µµ Àú´Â À½... ±×·¯´Ï±î Á¦°¡ ¸»ÇÏ·Á´Â °ÍÀº... ·çºñ¿¡´Â ¸î°¡Áö °£´ÜÇÑ Çؽà ¶óÀ̺귯¸®°¡ Æ÷ÇԵǾî ÀÖ°í, ¶Ç ¼³Ä¡Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾Ïȣȭ ¶óÀ̺귯¸® Áªµµ ÀÖ´Ù´Â °Ì´Ï´Ù.

1.3.1. ÇؽÃ

´Ü¹æÇâ ¾Ïȣȭ¸¦ À§ÇÏ¿© Çؽø¦ ¾´´Ù°í »ý°¢ÇØ º¾½Ã´Ù. ¾ÏȣȭµÈ ¹®ÀÚ¿­Àº µ¥ÀÌÅÍ ½ºÆ®¸²À¸·ÎºÎÅÍ ¿À´Â °ÍÀÔ´Ï´Ù. ÀüÇüÀûÀÎ »ç¿ëó´Â Æнº¿öµå üũ(¿¹¸¦ µé¾î ¿©·¯ºÐÀÌ µ¥ÀÌÅͺ£À̽º¿¡ Çؽø¦ ÀúÀåÇØ µÎ°í »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ÇؽÃÇؼ­ ÀÌ µÎ Çؽð¡ ÀÏÄ¡ÇÏ´ÂÁö¸¦ º¸´Â °ÍÀÔ´Ï´Ù)¿Í ÆÄÀÏ Ã¼Å©(°°Àº µÎ ÆÄÀÏ¿¡¼­ °°Àº ÇؽðªÀÌ ³ª¿Í¾ß ÇÕ´Ï´Ù) ÀÔ´Ï´Ù. ·çºñ´Â µÎ°¡Áö °¡Àå ÀÚÁÖ ¾²ÀÌ´Â Çؽà ŸÀÔÀÎ MD5¿Í SHA-1À» ³»Àå ¸ðµâ·Î Á¦°øÇÕ´Ï´Ù.

MD5 MD5´Â ³Î¸® »ç¿ëµÇ´Â ¾Ïȣȭ Çؽà ÇÔ¼öÀÔ´Ï´Ù. 1994³â MIT±³¼öÀÎ ·Î³Îµå ¶óÀ̺£½ºÆ®°¡ MD4ÀÇ ÈļÓÀÛÀ¸·Î °³¹ßÇÏ¿´½À´Ï´Ù. Ãë¾àÁ¡ ¶§¹®¿¡ º¸¾È Çؽà ÇÔ¼öÀÇ Áַ¿¡¼­´Â ¶³¾îÁ® ³ª¿ÔÁö¸¸ ¿©ÀüÈ÷ °ªÀ» ´ëÀÀ½ÃÅ°´Âµ¥ ¾ÆÁÖ À¯¿ëÇÕ´Ï´Ù. ·çºñÀÇ MD5 ±â´ÉÀº PHPÀÇ °Í(¿¹¸¦ µé¾î md5('your data');) ¸¸Å­ ½±Áö´Â ¾Ê½À´Ï´Ù¸¸ ±×·¡µµ »ç¿ëÇϱâ Æí¸®ÇÏ°í ½±½À´Ï´Ù.

require 'digest/md5'
md5 = Digest::MD5.digest('I have a fine vest!')
         ¡æ sXm(1r\371\353\027\367\235u!\266\001\262
md5 = Digest::MD5.hexdigest('I have a fine vest!')
         ¡æ 73586d283172f9eb17f79d7521b601b2

MD5 Ŭ·¡½º´Â Çؽà ´ÙÀÌÁ¦½ºÆ®¸¦ ¾ò±â À§ÇÑ µÎ °¡Áö ¸Þ¼Òµå¸¦ Á¦°øÇÕ´Ï´Ù. ù ¹ø° °ÍÀº ±×³É digest ¸Þ¼ÒµåÀÔ´Ï´Ù. ÀÌ°ÍÀº Çؽà ´ÙÀÌÁ¦½ºÆ®ÀÇ Á¶±ÝÀº À§ÇèÇÑ ¹ÙÀÌÆ® ½ºÆ®¸²À» µ¹·ÁÁÝ´Ï´Ù. À§ÇèÇÏ´Ù°í ÇÑ ÀÌÀ¯´Â ÀÌ°ÍÀÌ Á¦´ë·Î µ¿ÀÛÇÑ´Ù°í »ý°¢ÇÏ°í XMLÀ̳ª HTML ȤÀº µ¥ÀÌÅÍ¿¡ºñ½º¿¡ ¾´´Ù¸é ¾È µÇ±â ¶§¹®ÀÔ´Ï´Ù. ÀÌ·± »óȲ¿¡¼­ ´õ ³ªÀº ¼±ÅÃÀº hexdigest ¸Þ¼ÒµåÀÏ °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀº base64 hex ¾Ë°í¸®ÁòÀ» ÅëÇÏ¿© °á°ú¸¦ Ãâ·ÂÇϴµ¥ ÀÌ°ÍÀÌ ´õ Ä£±ÙÇÒ °ÍÀÔ´Ï´Ù.

SHA-1 SHA-1 Çؽà ¾Ë°í¸®ÁòÀº MD5º¸´Ù ÈξÀ ´õ º¸¾È¿¡ °­ÇÕ´Ï´Ù. ÀÌ°ÍÀÌ °¡Àå º¸¾È¿¡ °­ÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù¸¸ ´ëºÎºÐÀÇ »óÇ׿¡¼­ ¾µ ¼ö ÀÖ½À´Ï´Ù. ¿©·¯ º¸¾ÈÀÌ ÇÊ¿äÇÑ »óȲ¿¡¼­ Çؽà ¾Ë°í¸®ÁòÀ¸·Î ³Î¸® ¾²ÀÌ°í TLS, SSL, PGP, SSH, IPsec µîÀÇ ÆÐÅ°Áö¿¡¼­ ¸¹ÀÌ ¾²ÀÔ´Ï´Ù. ·çºñ´Â SHA-1 ¾Ë°í¸®ÁòÀ» MD5 ¾Ë°í¸®Áò°ú °°Àº ÀÎÅÍÆäÀ̽º·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÕ´Ï´Ù.

require 'digest/sha1'
sha1 = Digest::SHA1.digest('I have a fine vest!')
          ¡æ \225J{{\233\025\236\273\344\003X\233\33              [...]
sha1 = Digest::SHA1.hexdigest('I have a fine vest!')
          ¡æ 954a7b7b9b159ebbe403589bdaa8f981003a2fbc

º¸½Ã´Ù½ÃÇÇ ÀÌ°ÍÀÌ ´õ °­·ÂÇÑ Çؽöó´Â °Í¸¸ Á¦¿ÜÇϸé MD5ÀÇ ÇÔ¼ö¿Í µ¿ÀÏÇÕ´Ï´Ù. ÀÌÁ¦ Çؽø¦ ³¡³»°í ¾Ïȣȭ¿¡ ´ëÇؼ­ »ìÆ캸µµ·Ï ÇսôÙ.

1.3.2. ¾Ïȣȭ

·çºñ´Â ³»ÀåÀ¸·Î ¾Ïȣȭ ´É·ÂÀ» º¸À¯ÇÏ°í ÀÖÁö´Â ¾Ê½À´Ï´Ù. µû¶ó¼­ ÁªÀ» ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ°ÍÀÌ ·çºñÀÇ ³»Àå ¶óÀ̺귯¸®°¡ ¾Æ´ÏÁö¸¸ ÀÌ°ÍÀº ±â¼úÀûÀ¸·Î ¸Å¿ì Áß¿äÇؼ­ ª°Ô³ª¸¶ ¾ð±ÞÀ» ÇØ¾ß ÇÑ´Ù°í »ý°¢ÇϺó´Ù. ½áµåÆÄƼÀÇ ¾Ïȣȭ ¶óÀ̺귯¸®´Â http://crypt.rubyforge.org ¿¡ ÀÖ°í ÀÌ°ÍÀº ¼ø¼ö ·çºñ ¾Ïȣȭ ¶óÀ̺귯¸®ÀÔ´Ï´Ù. ÀÌ°ÍÀ» gem install crypt ¸í·ÉÀ¸·Î ¼³Ä¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. ·çºñ ¼³Ä¡¸¦ ¾ÆÁ÷ ÇØ º¸½ÃÁö ¾ÊÀ¸¼Ì´Ù¸é ºÎ·Ï A¿¡ ¾î¶»°Ô RubyGemÀ» ¼³Ä¡ÇÏ´ÂÁö¿¡ ´ëÇØ ³ª¿Í ÀÖ´Â °÷ÀÇ ¸µÅ©°¡ ÀÖ½À´Ï´Ù.

¾Ïȣȭ ¶óÀ̺귯¸®´Â ³× °¡Áö ¾Ïȣȭ ¾Ë°í¸®ÁòÀÌ ÀÖ½À´Ï´Ù. Blogfish, GOST, IDEA, RijndaelÀÌ ±×°ÍÀÔ´Ï´Ù. ´ÙÇàÈ÷µµ °¢ ÀÎÅÍÆäÀ̽º´Â ¸ðµÎ µ¿ÀÏÇÕ´Ï´Ù. Blowfish ¾Ë°í¸®ÁòÀ» ¹®¼­¿¡ Àû¿ëÇÏ´Â ¿¹Á¦¸¦ º¾½Ã´Ù.

require 'crypt/blowfish'
blowfish = Crypt::Blowfish.new("A key up to 56 bytes long")
plainBlock = "ABCD1234"
encryptedBlock = blowfish.encrypt_block(plainBlock)
       ¡æ \267Z\347\331~\344\211\250
decryptedBlock = blowfish.decrypt_block(encryptedBlock)
       ¡æ ABCD1234

ÀÌ°ÍÀÌ °¡Àå ½¬¿î ¾Ïȣȭ ¶óÀ̺귯¸® Áß¿¡ ÇϳªÀÔ´Ï´Ù. °£´ÜÈ÷ Å°¸¦ »ý¼ºÀÚ·Î ³Ñ°Ü¼­ »ý¼ºÇÏ°í encrypt_block ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© µ¥ÀÌÅ͸¦ ¾ÏȣȭÇÏ°í decrypt_blockÀ» ÅëÇÏ¿© ÇØÁ¦ÇÕ´Ï´Ù. °³¹ßÀÚµéÀÌ API¸¦ °°Àº ÇüÅ·ΠÀ¯ÁöÇ߱⠶§¹®¿¡ ´Ù¸¥ ¾Ë°í¸®Áò À̸§À» Blowfish ´ë½Å¿¡ Áý¾î³Ö±â¸¸ ÇÏ¸é µ¿ÀÛÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ±×·¸Áö¸¸ ¼­·Î ´Ù¸¥ Å° ±æÀÌ¿¡ ´ëÇÑ Á¦ÇÑÀÌ ÀÖ½À´Ï´Ù.±×¸®°í ´Ù¸¥ ¸Þ¼Òµå¿Í ÇÔ¼ö¸¦ ´õ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. http://crypt.rubyforge.org/ ¿¡¼­ ´õ ¹è¿ï ¼ö ÀÖ½À´Ï´Ù.

1.4. À¯´Ö Å×½ºÆÃ

Å×½ºÆ® ÁÖµµ °³¹ßÀÌ ¿­Á¤ÀûÀ¸·Î ÀÌ·ç¾îÁö°í Àִµ¥, ƯÈ÷ ·çºñ ¼¼°è¿¡¼­´Â ´õ¿í ±×·¸½À´Ï´Ù. ·çºñ ÄÚ¾î ÆÀÀÌ À¯´Ö °Ë»ç ÇÁ·¹ÀÓ¿öÅ©ÀÎ Test::Unit¸¦ ¾ð¾îÀÇ Ç¥ÁØ ¶óÀ̺귯¸®·Î ³ÖÀº°Í¸¸ ºÁµµ ¾Ë ¼ö ÀÖ½À´Ï´Ù. ·çºñÀÇ À¯´Ö Å×½ºÆ® ÇÁ·¹ÀÓ¿öÅ©´Â ÈǸ¢Çϸ鼭µµ ¸Å¿ì °£ÆíÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

Å×½ºÆ®ÀÇ ±âº»Àº ÇÁ·Î±×·¥À» ÅëÇؼ­ ´ç½ÅÀÇ Äڵ尡 Á¦´ë·Î µ¹¾Æ°¡Áö´ÂÁö È®ÀÎÇϴ°̴ϴÙ. ÀÌ°ÍÀ» ¹Ùº¸ °°´Ù°í »ý°¢ÇϽðÚÁö¸¸ Àú¸¦ ¹ÏÀ¸¼¼¿ä. À¯´Ö Å×½ºÆÃÀ» »ç¿ëÇÏ´Ù º¸¸é ¹ö±×°¡ µÎ¹è°¡±îÀÌ ´Ã¾î³ª°Ô µË´Ï´Ù. ±×·¸´Ù°í ÀÌ°ÍÀÌ, ÇÁ·Î±×·¥ÀÌ °³¹ßÀÚ¸¦ Â÷º°ÇÑ´Ù´Â ¶æÀº ¾Æ´Õ´Ï´Ù. ¹«½¼ ¶æÀÎÁö ¾Æ½Ã°ÚÁö¿ä. ¾Æ¹«µµ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ¸ØÃß´Â °ÍÀ» ¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ ¹«ÀǽÄÀûÀ¸·Î ¹ö±×°¡ »ý±æ ¼ö ÀÖ´Â °÷¿¡¼­´Â »ì±Ý»ì±Ý °È°Ô µÇ´Â °ÍÀÔ´Ï´Ù. Àú´Â Ç×»ó ÀÌ·¸°Ô ÇÕ´Ï´Ù. ÀÌ°ÍÀÌ Á¦°¡ °Ë»ç¸¦ ÇÏ´Â ÀÌÀ¯ÀÔ´Ï´Ù.

·çºñÀÇ À¯´Ö °Ë»ç ÇÁ·¹ÀÓ¿öÅ©´Â °Ë»ç¸¦ Çϱâ À§ÇÑ °£´ÜÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÕ´Ï´Ù. ·ÎÄà ³×Æ®¿öÅ©¿¡¼­ »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ® ÀÀ¿ë ÇÁ·Î±×·¥ Áß¿¡¼­ ¸Æ ÁÖ¼Ò¸¦ ÀúÀåÇϴ Ŭ·¡½º¸¦ °Ë»çÇÑ´Ù°í ÇսôÙ.

class MacAddr
  def to_s
    return @mac_parts.join(":")
  end
  def initialize(mac)
    if mac.length < 17
      fail "MAC is too short; make sure colons are in place"
    end
    @mac_parts = mac.split(':')
  end
  def [](index)
    return @mac_parts[index]
  end
end

ÀÌ°ÍÀº ¸Þ¼Òµå ¼¼ °³Â¥¸® °£´ÜÇÑ Å¬·¡½ºÀÔ´Ï´Ù. to_s, initialize, À妽º ¸Þ¼Òµå·Î ÀÌ·ç¾î Á® ÀÖ½À´Ï´Ù. »ý¼ºÀÚÀÎ initialize´Â ¸Æ ÁÖ¼ÒÀÇ ¹®ÀÚ¿­À» ¹Þ½À´Ï´Ù. ¸¸ÀÏ ¹®ÀÚ¿­ÀÇ ±æÀÌ°¡ À߸øµÆ´Ù¸é ¿¹¿Ü°¡ ´øÁ®Áö°í ±×·¸Áö ¾ÊÀ¸¸é ÄÝ·ÐÀ¸·Î ÀÌ°ÍÀ» ³ª´©¾î¼­ ÀνºÅϽº º¯¼ö¿¡ ³Ö½À´Ï´Ù. to_s ¸Þ¼Òµå´Â ¹è¿­À» ¼­·Î ÇÕÃļ­ ÄÝ·ÐÀ» ºÙ¿©¼­ º¸³À´Ï´Ù. À妽º ¸Þ¼Òµå´Â ¿äûµÈ À妽º·Î ¸Æ ÁÖ¼Ò ¹è¿­¿¡ Á¢±ÙÇÕ´Ï´Ù. ÀÌÁ¦ ÇÒ ÀÏÀÌ »ý°åÀ¸´Ï °Ë»ç¸¦ ÇØ º¾½Ã´Ù.

Test::Unit·Î °Ë»çÇÏ´Â °ÍÀº Test::Unit::TestCase¸¦ °¢ Å×½ºÆ® ÄÉÀ̽º¿¡¼­ »ó¼ÓÇÏ´Â °ÍÀÔ´Ï´Ù. Å×½ºÆ® ÄÉÀ̽º¸¦ ¸¸µé°íÀÚ ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µË´Ï´Ù.

require 'test/unit'
class TestMac < Test::Unit::TestCase
end

¾ÆÁÖ °£´ÜÇÏÁÒ? ÀÌÁ¦ Å×½ºÆ® ÄÉÀ̽º Ŭ·¡½º¸¦ ¸¸µé¾ú½À´Ï´Ù. ÀÌÁ¦ ÀÌ°Í¿¡ °Ë»ç¸¦ ä¿ö¾ß ÇÕ´Ï´Ù. °Ë»ç´Â ÁöÀúºÐÇÑ if ¹®µéÀÇ ´Ù¹ß·Î ÀÌ·ç¾îÁ® ÀÖ½À´Ï´Ù¸¸ À¯´Ö °Ë»ç ÇÁ·¹ÀÓ¿öÅ©´Â ´ÜÁ¤¹®(ÀÌ·± Á¶°Ç¹®µéÀ» Á» ´õ ÀǹÌÀÖ°Ô µÑ·¯ ¼ö ÀÖ°Ô µË´Ï´Ù)À» ÅëÇÏ¿© ÀÌ·± °ÍµéÀ» ÃÖ´ëÇÑ ¾ø¾Ù ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù. ù ¹ø° °¡Á¤ ÇüÅ´ µî°¡ °Ë»çÀÔ´Ï´Ù. µÎ °³ÀÇ µî°¡ °¡Á¤ÀÌ ÀÖ½À´Ï´Ù. assert_equal°ú assert_not_equalÀÔ´Ï´Ù. Ŭ·¡½º¸¦ ¸¸µé¾î³õÀº ÆÄÀϾȿ¡ ÀÌ Å×½ºÆ® ÄÚµµµéÀ» ¸¸µé¾î º¾½Ã´Ù.

require 'test/unit'
class TestMac < Test::Unit::TestCase
  def test_tos
    assert_equal("FF:FF:FF:FF:FF:FF",
        MacAddr.new("FF:FF:FF:FF:FF:FF").to_s)
    assert_not_equal("FF:00:FF:00:FF:FF",
        MacAddr.new("FF:FF:FF:FF:FF:FF").to_s)
  end
end

µÎ °³ÀÇ Å×½ºÆ®¸¦ ¸¸µé¾ú½À´Ï´Ù. ù ¹ø° °ÍÀº ¸Æ ÁÖ¼Ò¸¦ Á־ to_s°¡ Á¦´ë·Î µÈ °ªÀ» ¹ÝȯÇÏ´ÂÁö¸¦ ¾Ë¾Æº¾´Ï´Ù. µÎ ¹ø° °ÍÀº °°Àº °ÍÀÌÁö¸¸ ¹Ý´ëÀÇ Á¶°ÇÀ¸·Î ´Ù¸¥ °ªÀ» ÁÖ°í ÀÌ°ÍÀÌ ¼­·Î ´Ù¸¥ °ÍÀ» È®ÀÎÇÏ´Â °ÍÀÔ´Ï´Ù. Å×½ºÆ®¸¦ Çغ¸¸é Èñ¸Á´ë·Î ¼º°øÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

Loaded suite unit_test
Started
.
Finished in 0.0 seconds.
1 tests, 2 assertions, 0 failures, 0 errors

ÈǸ¢ÇÏ°Ô Àß µÇ¾ú½À´Ï´Ù. ÀÌÁ¦ ´Ù¸¥ ÇüÅÂÀÇ °¡Á¤À» º¾½Ã´Ù. nil °¡Á¤ÀÔ´Ï´Ù. ÀÌ °¡Á¤Àº assert_nil°ú assert_not_nil·Î ÀÌ·ç¾îÁ® ÀÖ°í assert_equalÀ» ÇÒ ¶§¿Í °°Àº ¹æ¹ýÀ¸·Î nil¿¡ ´ë °Ë»ç¸¦ ÇÏ°Ô µË´Ï´Ù. assert_not_nilÀ» ÀÌ¿ëÇÑ °Ë»ç¸¦ ÇØ º¾½Ã´Ù.

require 'test/unit'
class TestMac < Test::Unit::TestCase
  def test_tos
    assert_equal("FF:FF:FF:FF:FF:FF",
        MacAddr.new("FF:FF:FF:FF:FF:FF").to_s)
    assert_not_equal("FF:00:FF:00:FF:FF",
        MacAddr.new("FF:FF:FF:FF:FF:FF").to_s)
    assert_not_nil(MacAddr.new("FF:AE:F0:06:05:33"))
  end
end

´Ù½Ã »õ·Î¿î °Ë»ç¸¦ ½ÇÇàÇØ º¸°í ¿¡·¯ ¾øÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾î¾ß ÇÕ´Ï´Ù.

Loaded suite unit_test
Started
.
Finished in 0.0 seconds.
1 tests, 3 assertions, 0 failures, 0 errors

±×¸®°í ¿¡·¯°¡ ¾øÀÌ ¼öÇàÀÌ µÇ¾ú½À´Ï´Ù. ¸ÚÁö±º¿ä! ÀÌÁ¦ ´ÜÁ¤¹®ÀÇ ¸¶Áö¸· ÇüŸ¦ »ìÆ캸°í ¿¹¿Ü¸¦ ´Ù·ç¾î º¸°Ú½À´Ï´Ù. ·çºñÀÇ °Ë»ç ÇÁ·¹ÀÓ¿öÅ©´Â ÄÚµå ´ÜÀ§ÀÇ ¹Ýȯ°ªÀ» °Ë»ç ÇÏ´Â °Í »Ó¸¸ ¾Æ´Ï¶ó ¿¹¿Ü°¡ ¹ß»ýÇÏ¿´´ÂÁöÀÇ ¿©ºÎ¸¦ °Ë»çÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¸Æ ÁÖ¼Ò°¡ ¿Ã¹Ù¸£Áö ¾ÊÀ¸¸é ¿¹¿Ü°¡ ¹ß»ýÇÏ°í ÀÌ°Í¿¡ ´ëÇÑ °Ë»ç¸¦ ¼öÇàÇÏ °ÍÀ» ÀÛ¼ºÇØ º¾½Ã´Ù.

require 'test/unit'
class TestMac < Test::Unit::TestCase
  def test_tos
    assert_equal("FF:FF:FF:FF:FF:FF",
        MacAddr.new("FF:FF:FF:FF:FF:FF").to_s)
    assert_not_equal("FF:00:FF:00:FF:FF",
        MacAddr.new("FF:FF:FF:FF:FF:FF").to_s)
    assert_not_nil(MacAddr.new("FF:AE:F0:06:05:33"))
    assert_raise RuntimeError do
      MacAddr.new("AA:FF:AA:FF:AA:FF:AA:FF:AA")
    end
  end
end

ÀÌÁ¦ ´Ù½Ã °Ë»ç¸¦ ¼öÇàÇØ º¸½Ã°í, ¼º°øÀûÀÎ ¼öÇàÀÌ µÇ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù.

Loaded suite unit_test
Started
F
Finished in 0.015 seconds.
  1) Failure:
test_tos(TestMac) [test21.rb:27]:
<RuntimeError> exception expected but none was thrown.
1 tests, 4 assertions, 1 failures, 0 errors

ÀÌ·±! »ý¼ºÀÚ¸¦ º¸½Ã¸é ¸Æ ÁÖ¼Ò°¡ ³Ê¹« ªÀº °Í¸¸ °Ë»çÇÏ°Ô µÇ¾î ÀÖ½À´Ï´Ù. ÀÌÁ¦ < ¿¬»êÀÚ¸¦ != ¿¬»êÀÚ·Î ¹Ù²Ù¾î¼­ ³Ê¹« ª°Å³ª ³Ê¹« ±ä °æ¿ì¸¦ ¸ðµÎ °Ë»çÇÏ°Ô ÇÏ°í °Ë»ç¸¦ ´Ù½Ã ÇØ º¾½Ã´Ù.

Loaded suite unit_test
Started
.
Finished in 0.0 seconds.
1 tests, 4 assertions, 0 failures, 0 errors

ÁÁ¾Æ¿ä! ¿ì¸® Ŭ·¡½ºÀÇ Á¶±×¸¶ÇÑ °Ë»ç Á¶¸¦ ¸¸µé¾ú½À´Ï´Ù. ¹°·Ð ÀÌ°ÍÀº ÀÀ¿ë ÇÁ·Î±×·¥ Àüü¿¡ ÇϳªÀÇ Å¬·¡½º°¡ ÀÖ´Â °ÍÀÌÁö¸¸, °¢ Ŭ·¡½º¿¡ °Ë»ç Á¶¸¦ µÑ ¼ö ÀÖ½À´Ï´Ù. °Ë»ç Á¶°¡ Á¡Á¡ Ä¿Áö¸é ¿©·¯ °³ÀÇ ÆÄÀÏ¿¡ ³ª´©°í ½ÍÀ» °ÍÀÔ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é 1,200°³ÀÇ °Ë»ç »óȲÀ» ÇÑ ÆÄÀÏÀÇ ºê·¹ÀÌÅ© ´í½º Ãß´Â ÆÒ´õ ½ºÅ©¸° ¼¼À̹ö¿¡ ´Ù ³Ö¾î¾ß Çϱ⠶§¹®ÀÌÁÒ.´ÙÇàÈ÷µµ Test::UnitÀº ¶È¶ÈÇؼ­ ¿©·¯ Å×½ºÆ® ÆÄÀÏÀ» ÇϳªÀÇ °Ë»ç ¹ú¿¡ ³ÖÀ» ¼ö ÀÖ¾¹´Ï´Ù. ±× ¸»Àº ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù´Â ¶æÀÔ´Ï´Ù.

require 'test/unit'
require 'pandatest'
require 'breakdancetest'
require 'breakdancingpandatest'
require 'somewhatperipheralelementstest'
require 'somewhatperipheralelementsbestfriendsunclestest'

±âº»ÀûÀÎ °Ë»ç¹ýÀ» ¾Ë·Á µå·È½À´Ï´Ù. ¸µÅ© ¸ñ·ÏÀ» ºÎ·Ï A¿¡ µÎ¾î¼­ °Ë»ç ±¸µ¿ÇüÀÇ °³¹ß°ú ·çºñ¿¡¼­ÀÇ °Ë»ç¸¦ ´õ ±íÀÌ ¾Ë°í ½ÍÀº ºÐµéÀÌ Âü°íÇÏ½Ã°Ô Çß½À´Ï´Ù. Test::UnitÀÇ ¹®¼­¸¦ http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html ¿¡¼­ ã¾Æº¸½Ã°í ¾µ ¼ö ÀÖ´Â ´Ù¸¥ °¡Á¤À» »ìÆ캸¼¼¿ä. ÀÚÁÖ ¾²Áö ¾Ê´Â °ÍÀº ¿©±â¼­ ´Ù·çÁö ¾Ê¾ÒÀ¸´Ï±î¿ä.


ID
Password
Join
The Tree of Learning bears the noblest fruit, but noble fruit tastes bad.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2011-12-29 10:56:26
Processing time 0.0014 sec