본문 바로가기

전체 글48

달력 만들기 오늘은 화면에 달력을 표시해 주는 프로그램을 만들어 보겠다. 우선 테스트를 위한 프로그램 코드와 실행한 화면을 보자.require './calendar'cal = Calendar.newcal.prev_month.printputscal.printputscal.next_month.printCalendar 객체를 생성해서 print 메서드를 호출하면 화면에 달력을 표시해 주는데, prev_month 메서드와 next_month 메서드를 사용하면 쉽게 지난달과 다음달 정보를 갖는 Calendar 객체를 가져올 수 있다. 이제 아래 Calendar 클래스의 소스 코드를 하나씩 살펴보도록 하자.require 'date'class Calendar attr_reader :year, :month attr_writer.. 2024. 9. 25.
Enumerable 파헤치기4 오늘은 'Enumerable 파헤치기' 시리즈의 마지막 글로 MyEnumerable 모듈에 min, max, sum 메서드를 만들어 보자. min 메서드와 max 메서드는 인수 없이 호출하면 각각 가장 작은 값을 갖는 요소 하나와 가장 큰 값을 갖는 요소 하나를 돌려주고, 인수로 정수를 주면 해당하는 수만큼의 요소를 새 배열에 담아 돌려준다. 그리고 호출 시 요소들의 크기를 비교하는 블록을 전달하면 해당 블록의 실행 결괏값을 기준으로 최솟값과 최댓값을 구한다. sum 메서드는 모든 요소의 합을 구해주는데, 요소가 참조하는 객체에 정의된 + 연산자 메서드를 사용하여 요소끼리 더해지게 된다. 즉, 요소가 참조하는 객체가 숫자라면 수학적인 덧셈을 통해 구한 합이 반환되고 만약 요소가 참조하는 객체가 문자열이라.. 2024. 9. 23.
Enumerable 파헤치기3 오늘은 지난 글에 이어 MyEnumerable 모듈에 몇 가지 메서드를 더 만들어 보겠다. 우선 sort_by 부터 시작해 보자. sort_by 메서드는 실행 시 블록을 받아 블록의 결괏값을 기준으로 정렬을 해주는 메서드이다. 다음 그림을 보면 sort 메서드와 sort_by 메서드의 차이를 알 수 있다. sort 메서드도 블록을 받아 정렬 기준을 변경할 수는 있지만 블록의 결괏값은 0, 양수, 음수 중 하나여야 한다. 즉 블록에 전달된 두 요소를 비교한 결괏값이 블록의 결괏값이라고 간주하다. 그에 반해 sort_by 메서드는 블록의 결괏값 자체를 가지고 비교를 하여 원래 요소들의 정렬 순서를 결정한다. 그래서 숫자 배열의 경우 내림차순 정렬을 위해 sort 메서드에 블록을 전달하여 두 요소의 순서를 바.. 2024. 9. 20.
Enumerable 파헤치기2 오늘은 지난 글에 이어 MyEnumerable 모듈에 map 메서드를 만들어 보겠다. 당연히 MyEnumerable 모듈을 믹스인하는 클래스에서 each 메서드를 정의해 놓았다고 가정한다. 아래 코드를 보면 map 메서드에서도 each 메서드의 블록 안에서 map 메서드에 전달된 블록을 실행해 주고 있고 그 블록의 결괏값을 result 변수가 참조하는 배열에 담고 있다. 이때 result 변수는 map 메서드에서 정의한 것이고 클로저를 통해 each 블록 안에서 접근하고 있다. 결국 map 메서드 역시 each 메서드를 사용해야 하므로 each_with_index 와 거의 동일한 패턴으로 작성한 것을 볼 수 있다. 그리고 map 메서드는 최종 결과로 map 에 전달된 블록의 실행 결괏값을 모은 resul.. 2024. 9. 13.