8장 코딩 6,7장의 아키텍처 설계와 상세 설계에 따라 프로그램을 작성하는 과정 코딩 vs. 프로그래밍 좋은 프로그래밍이란 - 읽고 이해하기 쉽고 - 프로그램 크기, 실행 시간, 소요 메모리가 적은 프로그램을 작성 프로그래밍 단계 - 구현 - 리팩토링 작성된 프로그램의 품질을 높이는 방법 - 인스펙션 - 정적 분석 도구 활용 (Static analysis) - 페어 프로그래밍, 테스트 주도 프로그래밍 8.1 코딩 원리 - 코딩 vs. 프로그래밍 : 분리하여 구현할 수 있는 작은 단위를 프로그래밍 하는 작업 - 전 단계의 문서들, 아키텍처 설계서, 요구 분석서 등을 참조하여 상세 설계나 사용자 지침서와 일치하도록 코딩 8.1.1 코딩 과정 - 코딩 표준을 정함 - 각 클래스 요구 사항과 상세 설계를 반영하여 메소드를 구현 - 인스펙션 - 클래스 단위로 테스트 - 통합 8.1.2 코딩 오류의 종류 - 메모리 누수 - malloc/free 짝이 맞지 않는 문제 - NULL 참조 - Alias(별칭)으로 인한 오류 cf. 포인터, 참조 - 배열 인덱스 오류 - 수식 예외 오류 : 0으로 나누기, NaN (IEEE Floating-Point 표현) public class Main { public static void main(String[] args) { System.out.println(0.0 / 0.0); System.out.println(0 / 0); } } - off(set)-by-one 에러 - 문자열 처리 오률 - 버퍼 오버플로우 - 동기화 오류 : deadlock, race condition 8.1.3 구조적 프로그래밍 - Goto를 사용하여 제어 흐름을 표현한 프로그램은 순차, 선택, 반복문으로 어떠한 Goto문도 표현 가능 - 블록 : 단일 입구, 단일 출구의 문장들 - Top-down (하향식) 프로그램 구조 - Goto의 변형 : break, continue 8.1.4 정보 은닉 (Information Hiding) - 내부 표현을 외부에서 알지 못하도록 숨기는 것 (또는 현재 결정하기 어려운 설계 요소를 내부에 숨기는 아이디어) - 클래스의 private 멤버 8.1.5 중복 회피 - 중복을 회피해야 하는 이유 - 경우에 따라 중복이 필요한 이유 8.1.6 Principles of least knowledge - 디메테르의 법칙 - 교재 예제 8.2 코딩 스타일 - 여러 사람이 참여하는 프로젝트의 소스 코드를 일관된 스타일로 유지 - cf. 시큐어 코딩 (Secure Coding) 8.2.1 명명 규칙 8.2.2 포인터와 레퍼런스 - C : 포인터 int * - C++ : 포인터와 레퍼런스 int * vs. int & ==> 포인터와 레퍼런스의 유사점과 차이점 ==> 레퍼런스 사용을 더 추천 - Java : 레퍼런스 Integer 8.2.3 자료형 8.2.4 문장과 수식 - 자주 반복되는 수식은 메소드로 정의해서 사용 (cf. 리팩토링) - == vs. equals 8.2.5 오류 처리 - 더 구체적인 타입 (부모 클래스 타입 보다 자식 클래스 타입)을 사용하여 오류 발생을 원천적으로 방지 - 입력 처리 전에 미리 정상적인 값으로 변경하는 방법 8.2.6 코드 문서화 - 주석으로 코드가 어떤 작업을 하는지를 설명하는 것이 아니라 왜 그런 작업을 수행하는지 설명해야 한다. 8.3 UML과 코딩 - 클래스 다이어그램과 코딩 - 보조 자료 참고 8.4 리팩토링 - 기존 코드의 구조를 변경하여 외부에서 보는 동작의 변화는 없지만 보다 쉽게 이해하고 유지 보수가 쉬운 형태로 변환하는 것 - 코드 스멜 ==> 리팩토링 적용 - 리팩토링 목록 8.5 코드 품질 향상 기법 - 코드 인스펙션 (Fagan이 처음으로 제안) - 정적 분석 - 페어 프로그래밍 : 한 명은 코딩, 다른 한 명은 프로그램 리뷰 또는 테스팅