원래는 shallow copy랑 deep copy라는 것에 대해서 쓸려고 했는데,
그것 관련해서 찾다보니 「p」라는 녀석이 테스트 코드에 보이길래
출력메서드에 대해서 적고자 한다.
찾아보니 문자열을 출력해주는 메서드는 루비의 Kernel모듈에 들어 있는데
거기에 포함되어 있는 출력관련 메서드는 아래와 같다.
p, print, printf, putc, puts
루비의 레퍼런스에 있는 설명들을 보자.
p
– 각 객체에 대해 obj.inspect를 출력하고, 그 다음 현재 출력 레코드 구분자를 프로그램의 표준출력에 쓴다.
테스트 코드
p("Hello, Ruby !\n")
결과
"Hello, Ruby !\n"
음..inspect가 실행된건지 잘 모르겠다. 하나 더 테스트해보자.
User = Struct.new(:name, :id) u = User['park', 'wapj'] p u
결과
#<struct User name="park", id="wapj">
print – 각 객체를 차례로 STDOUT에 출력한다. 출력필드구분자($,)가 nil이 아니라면 그 내용이 각 필드 사이에 나타날 것이다. 출력레코드 구분자($\)가 nil이 아니라면 결과에 이 값도 추가될 것이다. 아무런 매개변수도 건네지 않으면 $_를 출력한다. 문자열이 아닌 객체들은 그 객체의 to_s메서드를 호출하여 문자열로 변환한다.
테스트 코드
print "apple", [1,2,3], 9876, "\n" $, = "," $\ = "\n" print "apple", [1,2,3], 99
실행결과
apple1239876 apple,1,2,3,99
출력필드 구분자를 지정안하면 문자들이 붙어서나오고
지정한 뒤에는 문자열 사이사이에 출력필드구분자가 붙어서 나온다.
printf – 아래 코드와 동일하다
io.write sprintf(format, obj …)
또는
STDOUT.write sprintf(format, obj …)
형식은 printf(format, arg*)과 같고
format에다 arg로 들어온 파라메터를 적용한 문자열을 반환한다.
기본적으로는 C의 sprintf와 동일하다.
테스트코드
#2진수 printf("%b", 10) # -> 1010 #8진수 printf("%o", 10) # -> 12 #16진수 printf("%x", 10) # -> a printf("%X", 10) # -> A #부동소수점 printf("%.0f", 10.12) # -> 10 printf("%.1f", 10.12) # -> 10.1 printf("%.2f", 10.12) # -> 10.12 #문자열 printf("%s", "abcdefg") # -> abcdefg # Object#inspect의 결과를 출력 printf("%p", [1, 2, 3]) # -> [1,2,3] # 10진수 d,i printf("%d %i", 10, 20) # -> 10 20
플래그, 폭, 정확도등의 표시자가 있는데 이건 다음에 따로 써야 될듯..
putc – STDOUT.putc(int)와 동일.
주어진 문자(String, Fixnum)를 io에 쓴다.
putc "A" putc 65
결과
AA
puts – STDOUT.puts(arg…)와 동일.
주어진 객체를 IO#print를 이용해서 쓴다. 개행문자로 끝나지 않는 객체는 개행문자를 붙인다.
배열을 넣으면 각요소를 새로운줄에 쓴다.
테스트 코드
puts ("hello", "ruby", "!")
결과
hello ruby !
※참고
출력메서드를 사용할 때에는 쌍따옴표 [“]나 홑따옴표[‘]로 보통 감싸주는데,
홑따옴표는 그냥 그대로 표시해준다고 생각하면 되고,
쌍따옴표는 [\n]같은 역슬래시[\]로 시작하는 문자를
특수문자로 치환해 주는 기능이 추가로 더 있다.