1. 소프트웨어 프로세스 품질 소프트웨어 품질의 저하는 소프트웨어 개발 경험의 부족에서 오는 경우가 많다. 경험이 부족하여 제대로 된 소프트웨어 개발 프로세스가 없고 품질 향상을 위한 관리 활동도 찾아볼 수 없는 것이다. 세계의 대형 프로젝트의 단 1%만이 목표를 달성하고 있으며 개발 비용이 수백만 원 이상 초과되는 것은 물론이고 납기의 지연은 몇 년씩 연기되고 수십억 원의 개발비용이 투입된 프로젝트들이 실패로 끝나 무용지물이 되고 말았다. 소프트웨어 개발은 인력, 기술, 절차, 도구가 어우러져 통합된 프로세스, 즉 개발을 위한 작업이 질서 있고 경험이 잘 반영되어 있어야 소프트웨어의 품질을 높일 수 있다. 소프트웨어 시스템의 품질은 그것을 개발하는데 사용되는 프로세스의 품질에 좌우되는 것이다. 엔지니어..
■ GDB(GNU Debugger)란 GNU 소프트웨어 시스템을 위한 기본 디버거 o 개발자 : 리처드 스톨만 o 운영체제 : 유닉스 계열, 윈도우 o 종류 : 디버거 o 라이선스 : GNU 일반 공중 사용 허가서 GDB같은 디버거의 목적은 다른 프로그램 수행 중에 그 프로그램 내부에서 무슨 일이 일어나고 있는지 혹은 프로그램이 잘못 실행되었을 때 무슨 일이 일어나고 있는지 보여주는 것이다. GDB는 C, C++, Modula-2로 짠 프로그램을 디버그 할 수 있다. ■ GDB 시작하기 % gdb - gdb를 먼저 실행 후 file이라는 명령으로 program을 부른다. % gdb program - 일반적인 방법이다. % gdb program core - 코어파일을 사용할 때 동시에 인자로 준다. % g..
타입 코드(type code)라는 것은 오브젝트의 종류를 표현하는 값입니다. 어떤 프로그램이 서적, DVD, 소프트웨어를 다룬다고 가정합니다. 그리고 이 상품의 종류를 표현하기 위해 다음과 같이 서적 = 0, DVD = 1, 소프트웨어 = 2라고 int형 값을 할당한다고 하면,이 때, 1, 2, 3 이라는 값이 타입 코드가 됩니다. 그러나타입코드가 int와 같은 기본형이면 문제가 생깁니다. Item* book2 = new Item(1000, "Jobs", 3000);Item* software2 = new Item(Payment::TYPECODE_CREDIT, "Word", 3000);와 같은 코드도 문제 없이 돌아가는데요. 타입 코드의 범위 이외의 값인 1000도, item 타입이 아닌 payment 타..
이번에는 널객체와 타입코드에 대한 이야기입니다. 5. 널객체 파일과 콘솔에서 로그를 기록하는 FileLog와 ConsoleLog 클래스를 구현합니다. 각각의 객체가 존재할 때 Write를 하는 LogService 클래스도 구현합니다. LogService 클래스에서는 run 함수 안에서 FileLog가 null이 아니면 FileLog.write()를, ConsoleLog가 null이 아니면 console.write()를 하게 됩니다. 그런데! 같은 일(write())을 하는데 객체마다 한번씩 여러 번을 처리하고 있습니다. ????????????!!!!!!!!!!!!!!!!!!!! 배운거에요!!!!!!!!!!!!! 이럴 경우 강한 결합Tightly coupling 으로 OCP를 위배합니다. 다형 객체를 하나..
슷타의 마린과 고스트 클래스입니다.class Marine{}; class Ghost{}; 마린(Marine) 부대와 고스트(Ghost) 부대를 동시에 움직이게 합시다.어떻게 하나로 묶어서 보낼까요?드래그로 몽땅 잡아서? g = m; 으로??이는 서로 다른 폼이기 때문에 불가능합니다... 이럴 때, C언어에서는 모든 포인터 묶기 위해 - void* 쓰지요!void* grp1[2] = { &g, &m }; 이런 식으로 말이죠! void main(){ Marine m; Ghost g; void* grp1[2] = { &g, &m };} 이제 상속의 개념이 나오게 됩니다.♥ 다형적 객체를 하나의 타입으로 처리하기 위해 부모 클래스를 도입하게 됩니다. 상속의 특징은1) 재사용성 2) 유지보수성 더불어 3) 다형성..
이번에는 캐스팅에 대해서 공부합니다. 3. 캐스팅퀴즈퀴즈! char* pa = malloc(sizeof(char)); // c(o), c++(x)char* pb = (char*)malloc(sizeof(char)); // c(o), c++(o)위의 두 문장은 C, C++ 환경에서 문제없이 잘 돌아갈까요? (정답은 질문 옆을 아주 잘~ 보면 보입니다.) C언어에서는 명시적으로 형 변환을 하지 않아도 컴파일러는 알아서 잘 짰거니 하고, 개발자를 믿고 실행합니다.논리적으로 잘못됐어도 에러를 내지 않으니 개발자는 월화수목금금금... 이와 달리, C++에서는 타입 체크가 강화되어 타입을 명시하지 않으면 컴파일 에러가 납니다.♥ 따라서 C++에서는 타입을 정확히 명시해주어야 합니다. 그러나 (char*) 이런 식으..
2. 인터페이스 이번에는 핸드폰 예제를 이용합니다! 쌈쏭의 자랑 애니콜(Anycall) 핸드폰의 통화(call)기능을 구현합니다.사람(Person)은 use_phone()을 통해 이 기능을 사용합니다. 싸이언(Cyon) 핸드폰을 하나 더 구매했다고 합시다.싸이언은 통화 기능이 애니콜과 달리 send 함수를 사용하네요.역시 통화하기 위해 Person 클래스에 싸이언용 use_phone()을 구현합니다. 애니콜과 싸이언은 다른 타입으로, 다른 타입의 포인터끼리는 호환이 되지 않기 때문에void use_phone(Cyon *p, const char* n) { p -> send(n); }을 하나 더 만들어주어야 하는 것이죠. 메인함수에는int main() { Person p; Anycall a; p.use_ph..
Refactoring은 내부의 코드를 개선하는 하나의 방법론이자 솔루션입니다.대부분 리팩토링은 OS에 독립적인 Java에서 이루어지는데요.그러나 객체 지향의 내부 구조를 이해를 돕기 위해 C++로 진행하겠습니다. 리팩토링을 한마디로 말하자면, 나쁜 냄새가 나는 코드를 최적화하는 것입니다.여기서 주의할 점은 런타임에서의 최적화가 아니라!코드를 짤 때, 버그 없는 프로그램을 만드는 것입니다.외부 인터페이스는 그대로 두고 내부의 코드만을 개선하여 재사용과 가독성을 높이는 데 목적이 있습니다. 특히 전체적인 아키텍처에서 개선해나가는 디자인패턴과 떼어놓을 수 없는 관계입니다.리팩토링과 디자인패턴의 개념은 동일한데, 바라보는 관점이 다를 뿐 입니다! 이제 본격적으로 리팩토링을 시작합니다. 1. 순수 가상함수와 추상..
입력을 받을 때 string과 char 차이! 1. input은 다음과 같다.HELLO C++ 2. 배열과 스트링 생성1) char 배열 생성 간단하게 동적 배열 생성하지 않아도 되도록, 가장 큰 배열 수만큼 SIZE를 define 해두자 초기화는 memset이용하는데 여기서는 하지 않음 char arr[SIZE]; 2) 스트링 생성string s; 3. 표준 입력 읽어오기1) char 배열 읽어오기cin for문 돌려서 일일이 받아와도 되지만 배열 전체로 받아와도 됨공백, 개행 무시 cin >> arr; ** 입력이 H E L L O C + + 이런 식으로 띄어쓰기 되어있다면 for문으로 일일이 받아와야 한다** 2) 스트링 읽어오기cin#include 필요공백, 개행 무시 cin >> s; 4. 문자..