티스토리 뷰

6.12 사례 연구: 랜덤 ASCII 문자 생성하기(Generating Random ASCII Characters)

- 문자정수로 작성이 가능하다. 랜덤 문자 생성은 정수를 생성하는 것과 같다.

- 아스키 문자는 0부터 127 까지정수로 이루어진 아스키코드를 가지고 있다.

- 랜덤 아스키 문자를 생성하기 위해서, 0부터 127까지 정수랜덤으로 발시켜야 한다.

- 그 후 chr 함수를 이용하여 정수로 부터 문자를 얻을 수 있다.

 

chr(randint(0, 127))

 

- 소문자의 아스키코드를 랜덤으로 생성하기 위해서 ord 함수를 이용할 수 도 있다.

 

ord('a')

 

- 그래서 소문자 a 부터 z까지의 아스키 코드를 얻기 위해선 ord('a') ord('z')를 이용해 아래와 같이 코드를 얻을 수 있다.

 

randint(ord('a'), ord('z'))

 

- 그 다음, 소문자를 얻기 위해서 다시 chr 함수를 이용하면 된다.

 

chr(randint(ord('a'), ord('z')))

 

*랜덤 문자 출력 프로그램

*RandomCharacter.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from random import randint
 
def getRandomCharacter(ch1, ch2):
    return chr(randint(ord(ch1), ord(ch2)))
 
def getRadomLowerCaseLetter() :
    return getRandomCharacter('a''z')
 
def getRandomUpperCaseLetter():
    return getRandomCharacter('A''Z')
 
def getRandomDigitCharacter():
    return getRandomCharacter('0''9')
 
def getRandomASCIICharacter():
    return chr(randint(0,127))
cs

*TestRandomCharacter.py

1
2
3
4
5
6
7
8
9
import RandomCharacter
 
NUMBER_OF_CHARS = 175 #출력할 문자 수
CHARS_PER_LINE = 25# 한 줄에 표현 될 문자 수
 
for i in range(NUMBER_OF_CHARS):
    print(RandomCharacter.getRadomLowerCaseLetter(), end = " ")
    if(i + 1) % CHARS_PER_LINE == 0:
        print()
cs

 

 



6.13 함수 추상화와 단계적 개선(Function Abstraction and Stepwise Refinement)

 

- 함수의 추상화(function abstraction)함수의 구현정보(implement)사용을 따로 분리시키는 것이다.

- 소프트웨어를 개발할 때는 추상화가 핵심이다.

- 클라이언트 프로그램이 함수를 사용 할 때, 굳이 클라이언트 프로그램은 함수가 어떻게 구현되어 있는지 알 필요가 없다.

- 구현에 관한 상세한 정보는 함수 내에서 캡슐화(encapsulated)되어 있고, 함수를 사용하는 클라이언트 프로그램으로 부터 구현에 관한 정보는 숨겨져 있다.

- 이를 우리는 정보 은닉(information hiding) 또는 캡슐화(encapsulation) 이라고 부른다.

- 함수의 구현정보(implement)는 아래의 그림처럼 블랙박스(black box)에 숨겨져 있다.

- 함수의 추상화는 프로그램 개발 과정에 적용 될 수 있다.

 

 

- 대형 프로그램을 작성 할 때, 우리는 분할 정복(divide-ande-conquer) 기법을 사용 할 수 있다. 분할 정복 기법은 단계적 개선(stepwise refinement)이라고 알려져 있기도 하다.

- 이 기법은 하나의 문제를 해결하여 작은 문제(subproblem)로 만들고, 작은 문제를 또 더 작은 문제로 만들어, 다루기 쉬운 문제로 만드는 것이 특징이다.

- 달력 프로그램을 예로 들어보자.

 

 

 

6.13.1 탑-다운 디자인(Top-Down Design)

 

- 프로그램을 만들 때 초반부터 디테일하게 접근하면 오히려 문제해결이 힘들어 질 수 있다.

- 최대한 문제를 물흐르듯이 하는게 바람직 한데, 이의 좋은 예가 함수를 추상화(abstraction)를 이용해 함수의 디테일한 내용은 잠시 접어두고, 나중에 디테일한 내용을 구현하는 것이다.

 

- 예를 들어, 달력 프로그램으로 부터 두가지 작은 문제(subproblem)로 분리가 된다. 하나는 (1)사용자로 부터 입력을 받는 문제와 그 입력 받은 (2)달의 출력으로 나뉜다.

- 여기서 주의해야 할 점은, 우리가 지금 배우는 파트가 함수의 구현은 잠시 접어두고, 어떤 작은 문제들이 발생하는지를 고려해야하는 것이 핵심이다. 함수의 구현은 나중 일이다.

- 그래프를 그려 문제를 시각화 하면 아래와 같다.

 

 

 

- 입력은 input 함수를 이용해 년도와 달을 입력 받을 수 있다.

- 개월 출력 문제는 아래의 그림과 같이 다시 두 가지 작은 문제로(subproblem)으로 나뉜다. 하나는 (1)달의 이름출력이고, 다른 하나는 (2)그 달의 body 출력이다.

 

 

- 여기서 달 이름 출력(1) 달의 이름을 얻어야 하는 작은 문제(subproblem)가 발생하고, 개월 출력 body에서는 (1) 무슨 요일이 한 주의 시작(getStartDay)인지 각 각 알아내야하고, (2) 그 달이 총 몇 일로 이루어져 있는지(getNumberOfDaysInMonth)도 알아야 한다.

- 이런 형식으로 분할하다보면, 윤년에 대한 문제도 발생하고, 윤년이 발생했을 떄 출력도 따로 생각해야 한다.

- 이렇게 분할-정복 기법으로 달력프로그램의 문제를 모두 나눈 모습을 그래프화 시키면 아래와 같다.

 

 

 

참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.


교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다. 

댓글