본문 바로가기
CS/Code Complete

chpater 18. Table-Driven Methods

by 아찌방 2025. 2. 16.

 

테이블 기반 기법(Table-Driven Method)

 

기본 개념:

  • if-else 또는 switch-case 문을 사용하는 대신, 테이블에서 미리 정의된 값을 조회하여 결과를 도출하는 방식

 

테이블을 사용하면 복잡한 의사 결정 로직을 단순화할 수 있어 코드의 가독성, 유지보수성, 확장성이 향상 됨

간단한 경우는 if 문이나 case 문이 더 깔끔

 


18.1 테이블 기반 기법 사용에 대한 일반적인 고려 사항

 

조건문이 복잡하게 사용될 경우 테이블 기반 접근법으로 단순화 할 수 있음.

// 조건문을 사용할 경우
if ( ( ( 'a' <= inputChar ) && ( inputChar <= 'z' ) ) ||
     ( ( 'A' <= inputChar ) && ( inputChar <= 'Z' ) ) ) {
    charType = CharacterType.Letter;
}
else if ( ( inputChar == ' ' ) || ( inputChar == ',' ) || ( inputChar == '.' ) || 
          ( inputChar == '!' ) || ( inputChar == '(' ) || ( inputChar == ')' ) || 
          ( inputChar == ':' ) || ( inputChar == ';' ) || ( inputChar == '?' ) || 
          ( inputChar == '-' ) ) {
    charType = CharacterType.Punctuation;
}
else if ( ( '0' <= inputChar ) && ( inputChar <= '9' ) ) {
    charType = CharacterType.Digit;
}

// 테이블 기반 기법 사용할 경우
charType = charTypeTable[inputChar];

 

장점 : 복잡한 조건문을 줄여 효율적인 데이터 조회 방식을 가능하게 함

1. 코드가 짧아짐

2. 수정 용이 => 새로운 문자 추가할 때 테이블만 변경하면 됨

 

테이블 기반 기법 사용 시 고려해야 할 두 가지 문제

 

1. 데이터를 어떻게 조회할 것인가? (직접 접근, 인덱스 접근, 계단식 접근)

  • 간단한 경우 → 월(month)을 기준으로 데이터 조회 (1~12 배열 사용).
  • 복잡한 경우 → 사회보장번호(SSN)와 같은 데이터는 직접 인덱스로 사용할 수 없음(999-99-9999개의 항목을 저장해야 하기 때문). 이 경우, 해싱(Hashing) 또는 다른 접근법을 고려해야 함.

 

 

2. 테이블에 무엇을 저장할 것인가? (단순 데이터 vs. 실행 동작)

  • 데이터 저장 방식 → 테이블에서 A~Z 문자를 조회하여 해당 문자의 ASCII 값을 반환.
  • 동작 저장 방식 → 특정 키 입력에 따라 실행할 함수를 저장하고, 테이블 조회 후 해당 함수를 실행.

 


18.2 직접 접근 테이블 (Direct Access Tables)

직접 접근 테이블 : 복잡한 논리문을 대신하여 데이터를 직접 조회(direct access) 하는 방식

=> 불필요한 조건문 제거, 코드를 간결하게 관리 => 유지보수 용이

 

각 월에 해당하는 일수를 계산하는 방법 예시

// 조건문 사용할 때
If ( month = 1 ) Then
    days = 31
ElseIf ( month = 2 ) Then
    days = 28
ElseIf ( month = 3 ) Then
    days = 31
ElseIf ( month = 4 ) Then
    days = 30
ElseIf ( month = 5 ) Then
    days = 31
ElseIf ( month = 6 ) Then
    days = 30
ElseIf ( month = 7 ) Then
    days = 31
ElseIf ( month = 8 ) Then
    days = 31
ElseIf ( month = 9 ) Then
    days = 30
ElseIf ( month = 10 ) Then
    days = 31
ElseIf ( month = 11 ) Then
    days = 30
ElseIf ( month = 12 ) Then
    days = 31
End If

// 테이블(배열) 사용할 때
// 윤년을 고려한 2차원 배열
Dim daysPerMonth(,) As Integer = _
    { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},  // 평년
      {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} } // 윤년

// LeapYearIndex()는 0(평년) 또는 1(윤년) 반환
days = daysPerMonth( month - 1, LeapYearIndex() )

 

 

위장 조회 키 (Fudging Lookup Keys)

=> 조회 키를 테이블에서 직접 사용할 수 없는 경우, 조회 키를 변형(위장)하여 원하는 결과를 얻는 방법

 

어떻게?

 

1. 정보 중복을 통해 키를 직접 사용할 수 있게 하기

=> 데이터가 적고, 중복을 감수할 수 있을 때

장점 : 테이블 조회가 간단하고 빠름

단점 : 공간 낭비가 발생하고, 중복된 데이터로 인해 오류 가능성이 커짐

 

2. 키를 변환하여 직접 사용

=> 나이, 성별, 상태와 같은 데이터에서 변환 로직이 명확할 

장점: 데이터의 중복을 피하면서 간결한 처리가 가능하며, 테이블 구조를 유지할 수 있습니다.

단점 : 데이터 변환 함수를 정확히 구현해야 하며, 복잡한 변환 로직이 필요할 수 있습니다.

 

3. 키 변환을 별도의 함수로 분리

=> 변환 로직을 관리할 수 있는 함수나 메서드를 만들어 일관성을 유지할 때

장점 : 변환 로직을 중복 없이 하나의 함수에서 관리하여 일관성을 유지하고, 나중에 변환 로직을 수정하기 용이

단점 : 함수 구현을 따로 작성해야 하는 담 존재

 


18.3 색인 접근 테이블 (Indexed Access Tables)

단순한 수학적 변환만으로 데이터를 테이블 키로 변환하기 어려운 경우, 색인 접근 방식(Indexed Access Scheme)을 사용하면 좋음.

 

장점 : 메모리 절약, 효율적인 데이터 조작, 유지보수 용이성 => 대규모 데이터 관리에 유용한 기법

 


18.4 계단식 접근 테이블 (Stair-Step Access Tables)

계단식 접근법은 단순한 변환 함수로 해결할 수 없는 비정형 데이터 조회에 적합하다.

=> 불규칙한 데이터 처리 가능

 

유연성과 유지보수 용이성을 갖춘 방식으로, 성적 부여뿐만 아니라 다양한 데이터 범위 조회에 활용될 수 있음.

 

고려 사항

1. 경계값 처리를 철저히 하고, 필요하면 최상위 범위의 인위적 값 추가

2. 데이터가 많다면 순차 탐색 대신 이진 탐색을 고려

3. 속도가 중요하면 색인 접근 방식 활용을 고려
4. 계단식 조회 기능을 별도의 함수(모듈)로 분리하여 유지보수성을 높임
5. 최적의 설계를 강박적으로 찾기보다, 실용적인 최선의 해결책을 선택

=> 문제의 특성과 요구사항에 따라 계단식 접근법, 색인 접근법, 이진 탐색 등을 적절히 조합하는 것이 중요

 


18.5 기타 테이블 조회(Table Lookup) 예제

PASS

 


결론 

 

테이블 조회 방식은 복잡한 조건문, 비효율적인 논리 표현, 불필요한 연산을 줄이는 데 유용

특히 데이터를 외부에서 관리하면 코드 변경 없이 유지보수가 가능

성능을 고려할 때, 메모리 페이징 비용접근 키 계산의 최적화도 신경 써야 함.

어떤 방식이 최적일지 고민하면서, 테이블 기반 접근법을 효과적으로 활용하세요~~

 

 

 

 

728x90