728x90
반응형

소프트웨어 공부 75

[자료구조] 정렬된 배열

정렬된 배열(ordered array)은 배열과 거의 같다. 단지 그 값이 항상 순서대로 있어야 한다는 점이다. 값을 추가할 때마다 배열의 값이 정렬된 상태가 되도록 한다. 하지만 이런 순서를 지키기 위해서는 여러 단계가 필요하다. 항상 실제 삽입 전에 검색을 먼저 수행해서 삽입할 정확한 위치를 알아내야 한다. 이것은 삽입에 있어서 효율을 많이 떨어트리게 된다. 하지만 정렬된 배열의 강력함은 검색 연산에서 드러난다. 배열과 정렬된 배열을 선형 검색으로 검색을 시도하면 정렬된 배열의 장점은 값이 없을 경우 더 빨리 멈출 수 있다는 점 밖에는 없다. 찾으려는 데이터가 발견되지 않고 더 큰 데이터가 나타날 때 정렬된 배열은 바로 멈출 수 있기 때문이다. 대단한 차이가 없어 보인다. 하지만 정렬된 배열에는 알고..

[자료구조] 배열 : 기초 자료 구조

배열은 컴퓨터 과학에서 기초적인 자료 구조 중 하나다. 배열은 리스트와 같은 개념이다. array - ['apple', 'bananas', 'cucumbers', 'dates', 'elderberries'] 배열의 인덱스는 데이터가 어디에 있는지 알려주는 숫자이며, 예제의 경우 apple은 0, dates는 3의 값을 가진다. 대부분의 자료 구조는 4가지 기본 연산을 가지고 있다. 읽기 : 자료 구조 내 특정 위치를 찾아보는 것 검색 : 자료 구조 내 특정 값을 찾는 것 삽입 : 자료 구조에 새로운 값을 추가하는 것 삭제 : 자료 구조에 값을 제거하는 것 자료 구조에서 연산의 빠르기는 시간의 단위를 사용하지 않는다. H/W의 사양에 따라 달라질 수 있기 때문이다. 자료 구조에서 연산은 "얼마나 많은 단계..

[프로그래밍] 소프트웨어 설계의 개요

소프트웨어 설계란 컴퓨터 프로그램에 대한 요구를 조작 가능한 프로그램으로 변환시키는 계획의 개념, 발명, 책략을 의미한다. 설계는 요구 사항을 코드 작성과 오류 수정에 연결시키는 행위를 말한다. 설계의 단계 1단계 : 서브 시스템으로 분할 이 단계에서 설계의 주요 작업은 모든 주요 서브 시스템의 구분이다. 이 단계의 주요 설계 행위는 어떻게 프로그램을 주요 구성 요소로 분리하느냐를 결정하는 것과 구성 요소 사이의 인터페이스를 정의하는 것이다. 서브 시스템은 일반적으로 모듈과 루틴을 포함한 전체 프로그램보다 작은 프로그램의 부분을 가리킨다. 2단계 : 모듈로 분할 이 단계에서의 설계는 시스템의 모든 모듈의 정의를 포함한다. 대형 시스템의 프로그램 분할 단계에서 지정된 서브 시스템은 너무 커서 직접 모듈로 ..

[프로그래밍] 루틴의 특성

루틴이란 하나의 단일 목적에 도달하기 위한 개별적인 함수나 프로시저를 말한다. 루틴 작성의 이유 복잡성의 감소 루틴 작성의 가장 중요한 이유는 프로그램의 복잡성을 줄이는 데 있다. 정보를 숨기는 루틴을 만들면 그것에 관해 생각할 필요도 없다. 자세한 세부 사항은 잊고 내부적 작업을 알지 못해도 루틴을 사용할 수 있다. 루틴의 추상화 기능 없이 복잡한 프로그램을 머리만으로 관리하는 것은 불가능하다. 코드의 중복을 피함 의심할 것도 없이 가장 널리 알려진 이유는 코드 중복을 피하는 것이다. 2개의 루틴 안에 유사한 코드를 만들면 그것들이 분리되어 있어 에러를 내포할 가능성이 크다. 양쪽 루틴에서 중복되는 코드가 있다면 공동 코드화 시킨다. 그러고 나서 양쪽의 코드 부분에 새 루틴을 사용한다. 공간 절약은 물..

[데이터베이스] 테이블 관계는 왜 중요한가

관계는 관계형 데이터베이스의 중요한 구성 요소다. 이것은 논리적으로 서로 연관된 한 쌍의 테이블들 사이의 연결을 설정한다. 이것은 테이블 구조를 더 개선하고 이중 데이터를 최소화하도록 도와준다. 이것은 여러 테이블들로부터 동시에 데이터를 추출할 수 있도록 해 주는 메커니즘이다. 적절히 정의된 관계는 관계 수준의 무결성을 제공하는데, 이것은 관계 자체가 신뢰성 있고 정상적이라는 것을 보장한다. 적절한 관계 설정에 실패해버리면 여러 테이블로부터 온 데이터를 갖고 작업하기가 힘들어지고, 연관된 테이블들에 레코드를 삽입, 갱신 또는 삭제하려고 할 때 문제에 맞닥뜨리게 된다. 관계의 종류 데이터베이스 내의 테이블들 사이의 관계 설정을 시작하기 전에 주어진 한 상의 테이블들 사이에 존재할 수 있는 관계의 종류에 대..

[데이터베이스] 필드 명세

필드들은 데이터베이스 기반이다. 이것들은 조직에 중요한 주제(subject)의 특성들을 나타낸다. 데이터 무결성에 대해서는 많은 말을 하고 있지만, 필드에 대해서는 대체로 그렇지 않다. 필드 명세(field specifications)를 정의함으로써 데이터 무결성을 설정하는 법을 알아보자. 필드 명세는 왜 중요한가 필드 명세가 결정적으로 중요한지 그 이유를 알아보자. 필드 명세는 필드 수준의 무결성을 설정하고 강화하는데 도움이 된다. 각 필드를 위한 필드 명세를 정의하는 것은 전반적인 데이터 무결성을 개선한다. 필드 명세를 정의하는 것은 데이터베이스 내의 데이터의 본질과 목적을 완전히 이해하도록 해 준다. 필드 명세는 데이터베이스의 '데이터 사전(data dictionary)'을 구성한다. 데이터베이스 ..

[데이터베이스] 키

키는 왜 중요한가 다음과 같은 이유 때문에 키들이 테이블 구조에 있어 결정적으로 중요하다. 테이블 내의 각 레코드가 정확하게 식별되도록 보장한다. 다양한 종류의 무결성을 설정하고 강화하는 것을 도와준다. 테이블 관계를 설정하도록 해준다. 항상 각 테이블을 위해 적절한 키들을 정의하도록 한다. 그렇게 하면 테이블 구조가 정상적이고, 각 테이블 내의 중복 데이터가 최소화되고, 테이블들 사이의 관계가 튼튼해지도록 보장하는데 도움이 된다. 각 테이블에 키 설정하기 키는 후보(candidate) 키, 주(primary) 키, 외래(foreign) 키, 그리고 비 키(non-keys)라는 네 개의 주요 키 종류가 있다. 키의 종류는 테이블 내에서의 기능을 결정한다. 후보 키 후보 키는 테이블 주제의 단일 인스턴스를..

[데이터베이스] 필드 정하기

필드 이름 개선하기 필드는 그것이 속해 있는 테이블의 주제의 특성을 나타낸다. 필드가 적절한 이름을 가지고 있을 때 필드가 나타내는 특성을 쉽게 식별할 수 있다. 모호하거나 애매하거나 불명확한 필드 이름은 문제가 있다는 확실한 시혼이고, 필드의 목적을 완전히 식별하지 않았다는 것을 말한다. 필드 이름을 부여하는 방법 유일하고, 전체 조직에 의미가 있는 설명적인 이름을 부여한다. 필드가 나타내는 특성을 정확하게, 명확하게, 그리고 모호하지 않게 식별하는 이름을 부여한다. 필드가 나타내는 특성의 의미를 전달하기 위해 필요한 최소 개수의 단어들을 사용한다. 두문자어(acronyms)를 사용하지 말고, 약어(abbreviations)는 사려 깊게 사용한다. 필드 이름의 의미를 혼동시킬 수 있는 단어들을 사용하지..

[데이터베이스] 테이블 정하기

테이블 종류(type)는 데이터베이스 내에서 수행하는 역할에 의해 테이블을 분류하도록 해 주며, 비슷한 방식으로 작동하는 테이블들을 식별하기 위한 수단을 제공한다. 테이블의 역할은 그 종류를 결정하느데, 주어진 테이블과 결부시킬 수 있는 네 개의 테이블 종류가 있다. 데이터 테이블 : 조직에 중요한 주제를 나타내고 데이터베이스가 제공하는 정보의 첫 번째 기초를 이룬다. 연결(linking) 테이블 : 다대다 관계의 두 테이블 사이의 연결을 설정한다. 부분 집합(subset) 테이블 : 특정 데이터 테이블과 연관되어 있는 필드들을 포함하고, 이 데이터 테이블의 주제를 매우 구체적인 방법으로 더 설명한다. 검증(validation) 테이블 : 비교적 정적인 데이터를 포함하고, 데이터 무결성의 중요한 구성 요..

[데이터베이스] 임무 목표 정의하기

임무 목표는 데이터베이스에서 관리되는 데이터에 의해 지원되는 일반적인 작업들을 나타내는 문장들이다. 각각의 임무 목표는 단일 작업을 나타낸다. 이 업무 목표들은 데이터베이스 설계 작업 전체에 걸쳐 사용할 정보를 제공한다. 예를 들어, 임무 목표는 데이블 구조, 필드 명세, 관계 특성, 뷰 등을 정의하도록 도와준다. 잘 작성된 임무 목표 잘 작성된 임무 목표는 일반적인 작업을 명확하게 정의한 선언적 문장이고, 불필요한 세부 사항이 없다. 그것은 일반적인 용어로 표현되고, 간결하고 요령이 있으며, 모호하지 않다. 전형적인 임무 목표의 예 우리는 완전한 환자 주소 정보를 관리할 필요가 있다. 우리는 모든 고객 판매를 추적할 필요가 있다. 우리는 고객 대표가 특정하게 주어진 시간에 20명을 넘지 않는 고객들을 ..

[데이터베이스] 임무 명세 정의하기

임무 명세는 데이터베이스의 특별한 목적을 일반적인 용어로 작성하는 것이고, 데이터베이스 설계 작업의 시작 단계에서 그것을 정의한다. 그것은 설계 노력을 위한 초점을 제공하고, 주의가 흐트러지고 데이터베이스 구조가 불필요하게 커지거나 복잡해지는 것을 방지해 준다. 잘 작성된 임무 명세 좋은 임무 명세는 간결하고 요령이 있다. 잘 작성된 임무 명세에는 특정 작업을 구체적으로 설명하는 구나 문장이 없다. 만약에 임무 명세에 이런 종류의 구나 문장이 포함되어 있다면, 그것을 삭제하고 재작성한다. 뉴 스타즈 탤런트 대행사(New Starz Talent Agency) 데이터베이스의 목적은 우리가 생성하는 데이터를 관리하고, 고객들에게 제공하는 약속 서비스와 연예인들에게 제공하는 관리 서비스를 지원하는 정보를 제공하..

[데이터베이스] 설계작업

완전한 데이터베이스 설계 절차를 수행하지 않고 데이터베이스의 설계를 시도하는 것은 나쁜 생각이라는 것은 잘 알려지고 증명된 사실이다. 많은 데이터베이스 문제는 잘못된 데이터베이스 설계에 기인하며, 설계 절차를 부분적으로 따르는 것은 그것을 전혀 따르지 않는 것만큼이나 나쁘다. 불완전한 설계는 잘못된 설계다. 완전하고 생략되지 않은 설계 절차를 따르는 것만이 정상적인 구조와 데이터 무결성을 보장한다. 설계 절차에 소비한 시간이 적을수록 데이터베이스에 문제를 만날 위험은 커진다. 데이터베이스 설계 절차를 따르는 것이 비록 데이터베이스를 설계할 때 만날 수 있는 문제를 완전히 제거해 주지는 못하겠지만, 그것을 최소화하는 데는 큰 도움을 줄 것이다. 업무 명세와 임무 목표 정의하기 데이터베이스 설계 작업의 첫 ..

[데이터베이스] 용어

관계형 데이터베이스 설계는 다른 직업, 무역 또는 훈련에서처럼 자체적으로 고유한 용어 집합을 가지고 있다. 값 관련 용어들 데이터 데이터베이스에 저장하는 값이 데이터다. 데이터는 어떤 수동적이거나 자동적인 처리에 의해 바뀌기 전까지는 같은 상태를 유지한다는 측면에서 정적이다. 데이터의 의미는 그것들이 처리되기 전까지는 알 수가 없다. 정보 정보는 작업을 하거나 찾아볼 때 의미 있고 유용하도록 처리한 데이터이다. 이것은 데이터베이스에 저장된 데이터와 비교할 때, 끊임없이 변한다는 점에서, 그리고 무한대의 방법으로 처리되고 표현될 수 있다는 점에서 동적이다. 데이터와 정보의 차이점을 이해하는 것은 매우 중요하다. 정보는 데이터베이스 내에 적절한 데이터가 있고, 데이터베이스가 그 정보를 지원할 수 있는 방법으..

[데이터베이스] 왜 데이터베이스 설계에 관심을 가져야 하는가

데이터베이스 설계에 관심을 가져야 하는 주된 이유는 그것이 데이터베이스 내의 데이터의 일관성, 무결성, 그리고 정확성에 결정적으로 중요하기 때문이다. 데이터베이스를 부적절하게 설계하면 어떤 정보는 추출하기 힘들고, 검색에서 부정확한 정보를 얻는 위험을 감수해야 한다. 이론의 중요성 이론의 주된 장점은 결과를 예측할 수 있도록 도와준다는 것이다. 이것은 하나의 처리 또는 일련의 처리를 수행할 때 어떤 일이 일어날지 예측할 수 있도록 해 준다. 관계형 데이터베이스는 집합 이론과 1차 술어 논리라는 수학의 두 분야에 기초를 두고 있다. 바로 이 사실이 관계형 데이터베이스가 정확한 정보를 보장하도록 해 주는 것이다. 또 이 수학의 분야들은 좋은 설계 방법론을 형식화하기 위한 기초와 좋은 관계형 데이터베이스 구조..

[데이터베이스] 데이터베이스의 종류

데이터베이스는 어떤 종류의 조직 또는 조직의 프로세스를 모델링하기 위한 목적으로 사용되는, 조직적으로 모아놓은 데이터를 말한다. 데이터베이스에는 운영(operational) 데이터베이스와 분석(analytical) 데이터베이스라는 두 종류가 있다. 데이터 베이스는 일상적으로 데이터를 수집하고 수정하고 관리할 필요가 있는 상황인 온라인 트랜젝션 처리(OLTP : On-Line Transaction Processing) 시나리오에 주로 사용된다. 반면에, 분석 데이터베이스는 역사적이고 시간에 의존적인 데이터를 저장하고 추적할 필요가 있는 상황인 온라인 분석 처리(OLAP : On-Line Analytical Processing) 시나리오에서 주로 사용된다. 분석 데이터베이스는 동향 파악, 장기간에 걸친 통계..

컨스트럭터 내에서 할당 대신 초기화를 사용하라

한 번 설정하고, 여러 곳에서 활용하자. 컨스트럭터 내에서 멤버 변수의 설정을 위한 할당 대신 초기화를 사용하면 불필요한 런터임 작업과 타이핑을 줄일 수 있다. 컨스트럭터는 내부적으로 초기화 코드를 만들어낸다. 다음 코드를 보자. class A { string s1_, s2_; public: A() { s1_ = "Hello,"; s2_ = "World"; } }; 실제로는 여러분이 다음과 같이 작성한 것처럼 컨스트럭터의 코드가 만들어진다. A() : s1_(), s2_() { s1_ = "Hello,"; s2_ = "World"; } 즉 직접 초기화하지 않은 개체는 표준 컨스트럭터를 통해 자동으로 초기화되고, 할당 연산자를 통해 할당된다는 것이다. 주요한 개체의 할당 연산자는 이미 만들어진 개체를 다룬..

최소화된 클래스를 사용하라

나누고 정복하라. 작은 클래스가 만들기도 쉽고, 얻기도 쉬울 뿐만 아니라 테스트하고 사용하기도 쉬우며, 다양한 상황에서 활용하기에도 편리하다. 다양한 기능을 가진 클래스 대신 간단한 개념을 담은 작은 클래스를 만들어 활용하자. 하나의 클래스에서 복잡하고 완전한 기능을 제공하는 방식은 분명 매력적인 것이 사실이지만, 작은 클래스를 사용하는 것이 대부분의 시스템에 있어 보다 효율적인 이유가 여러 가지 있다. 최소화된 클래스는 각각 하나의 명확한 개념만을 포함하므로, 여러 개의 분리된 개념을 포함하는 클래스와는 달리 서로 간의 구분이 쉽다는 장점이 있다. 작은 클래스는 보다 이해하기 쉽고, 사용하기 쉬우며 재활용하기도 쉽다. 작은 클래스는 분산과 배치에도 유리하다. 많은 기능이 집적된 클래스의 경우 별도의 덩..

내부의 것은 너무 노출시키지 말라.

클래스가 관리하는 내부 테이터에 대한 핸들을 리턴하여 클라이언트가 개체의 상태를 좌우하게끔 만드는 것은 좋지 않다. 다음 코드를 보자. class Socket { public: ................. int GetHandle() const { return handle_; } // 이렇게 해서는 안된다. private: int handle_; }; 데이터를 숨기는 것은 강력한 추상화와 모듈화의 도구이다. 하지만 데이터를 숨겨놓고 그 제어권을 내주는 것은 스스로를 파괴하는 행동이며, 마치 대문을 잠가놓고 열쇠를 꽂아두는 것과 같다. 그 이유는 다음과 같다. 클라이언트가 기능을 제어할 두 가지 방법을 가지게 된다 클래스의 추상체(Socket)를 이용하거나, 클래스가 의존하고 있는 임플리먼테이션을 제어..

728x90
반응형