본문 바로가기
Computer Science/Software Engineering

[소공] 9장 코딩

by na1-4an 2023. 12. 14.

9-1 코딩 작업

1. 코딩 작업 과정(5)

  1. 코딩 표준을 만들기
  2. 프레임워크 패키지와 응용 패키지 결정
  3. 클래스 구현 끝나는 대로 인스펙션
  4. 클래스 단위로 테스트
  5. 응용 시스템으로 통합

 

2. 자주 발생하는 오류(11)

① 메모리 누수

    : 메모리가 프리되지 않고 프로그램에 계속 할당되는 현상

② 중복된 프리 선언

    : 이미 프리로 선언된 자원을 한번 더 프리로 선언

③ NULL의 사용

    : NULL을 포인트하고 있는 곳의 콘텐츠를 접근. 이는 시스템 다운 시킴.

④ 별칭의 남용

    : 서로 다른 주소 값을 예상한 두 변수의 값이 별칭 선언으로 같은 값이 되었을 때 오류 발생.

      ex. strcat(src, destn)

⑤ 배열 인덱스 오류

    : 배열 인덱스가 한도를 벗어나거나 음수값을 갖는 경우

⑥ 수식 예외 오류

    : 0으로 나누는 오류, 변동 소수점 예외 오류

⑦ 하나차이에 의한 오류

    : 이는 컴파일러나 테스트 도구에 의해 검출 안되는 경우가 많음

  • 0으로 시작하여야 할 것을 1로 시작
  • <=N으로 써야할 곳에 <N을 쓴 경우

⑧ 사용자 정의 자료형 오류

    : 오버플로우나 언더플로우 오류가 쉽게 발생.

⑨ 스트링 처리 오류

  • 매개변수가 NULL
  • 스트링이 NULL로 안 끝난 경우
  • Source매개변수보다 destination 매개변수가 크지 않을 경우(strcpy)

⑩ 버퍼 오류

    : 프로그램이 버퍼에 복사해 입력 받으려 할 때 입력값을 아주 크게 주면 스택의 버퍼에 오버플로 발생. 이를 이용해 해커들이 자신 코드 실행 가능.

①① 동기화 오류

    : 공통 자원을 접근하려는 여러 스레드가 있는, 병렬 프로그램에서 흔히 발생.

  • 데드락: 다수의 스레드가 서로 자원을 점유하고 릴리즈 안 하는 상태
  • 레이스 컨디션: 두 스레드의 실행순서에 따라 실행결과가 다른 경우
  • 모순이 있는 동기화

 

9-2 코딩 표준

1. 코딩 표준

: 대표적인 기준은 간결하고, 읽기 쉬운 것

 

2. 명명 규칙(5)

  • 카멜 케이스: java클래스, 필드, 메소드 및 변수 이름. ex. thisIsAnExample
    • but, 상수는 모두 대문자로: ex. double SPEED_OF_LIGHT= 299792458;
  • 클래스와 인터페이스 이름:
    • 명사(구), 대문자로 시작. ex. interface AqueousHabitat
  • 메서드 이름:
    • 소문자로 시작하는 동사구
    • 값을 설명하는 명사구
    • 필드의 값을 접근하여 리턴하는 함수는 "get"
    • 조건을 묻는 부울 함수 이름 시작은 "is"
  • 변수 이름:
    • 소문자로 시작
    • 용도에 대한 힌트 제공해야
    • 모호한 이름 사용 않아야
    • 매개변수: 되도록 짧게(x, i ...)
    • 필드변수: 가능한 길고 의미가 담겨 있게
  • 패키지 이름
    • 모두 소문자, 명사
  • 헝가리안 표기법
    • 변수 이름 앞에 타입 구별
    • 변수의 목적 또는 변수가 무엇인지에 대한 힌트를 줌

헝가리안 표기법 예

 

3. 형식(2)

  • 들여쓰기와 괄호:
    • 들여쓰기 잘하기, 괄호 하나로 줄 낭비 않기. ex. }else{
  • 블록은 항상 괄호를 사용
    • if 문에 꼭 괄호 쓰기
    • 키워드와 괄호 사이에 공백 두기. 올바른 예, 틀린 예  ex. if (a == null), if(a==null)

4. 문장과 수식(2)

: 프로그램에서 반복되는 문장이나 수식은 패키지화.

  • 블록 문장 - if문과 같은 제어구조가 중첩되었을 때 혼란이 있을 수 있음.(else가 어떤 if에 해당?)
  • 수식 - 괄호를 이용해 오퍼레이션 순서 명확히

 

5. 오류처리(2)

  • 입력 오류 방지 - 잘못 입력될 것을 방지하기 위해 디폴트값 처리, 예외 처리.
  • 매개변수 오류

매개변수 오류 - 위의 경우 새로운 클래스를 만들어 사용하기.

 

6. 주석

: 디버깅에 도움, 다른 사람들이 프로그램 이해하기 쉽도록함.

  • 과도한 주석은 피하기
  • 클래스 불변 조건: 클래스의 속성에 대한 의미와 제약 모음. ex. private int hr; // The hour of day
  • 메서드 주석
    • Javadoc 스펙 - 메서드가 하는 일 설명
    • /***/ - 모든 매개변수 언급
  • 클래스 주석: 파일의 시작 부분에클래스 용도를 설명하는 주석 포함.
  • 문장 주석: 논리적 단위로 그룹화해 주석 달기.

메서드 주석 - Javadoc 스펙, /***/

 

9-3 설계에서 코드 생성

1. 연관의 코딩

  - 상황: 클래스 B는 클래스 A의 집합으로 이루어짐.

             A의 인스턴스가 B의 인스턴스의 일부라는 사실을 나타내기 위해 B에서 A를 지칭하는 참조가 필요함.

            포인터를 사용해 이 연관관계를 구현하는 방법은 아래와 같음.

  • 1:1 연관 - A에서 B의 함수를 호출할 필요가 있으면, A가 B에 대한 참조를 갖도록 구현.
  • 1:N 연관 - A에서 B의 함수를 호출할 필요가 있으면, A가 B에 대한 참조를 갖도록 구현.
  • N:N 연관 - 중간에 연관 클래스를 도입해 1:N 관계로 바꿔 설계.

 

2. 시퀀스 다이어그램의 코딩

: A 객체에서 B객체로 나가는 메시지 표시가 있으면 메소드는 B클래스에 정의!

9-4 리팩토링

1. 리팩토링

: 보다 쉽게 이해하고, 적은 비용으로 수정할 수 있도록, 동작의 변화없이, 내부 구조를 변경하는 것.

 

2. 리팩토링 목적(4)

  • 소프트웨어 디자인 개선.
  • 소프트웨어를 이해하기 쉽게 만듦.
  • 버그를 찾는데 도움
  • 프로그램을 빨리 작성하도록 도움.

 

3. 리팩토링 과정(4)

  1. 소규모의 변경 - 단일 리팩토링
  2. 코드가 전부 잘 작동되는지 테스트
  3. 전체가 잘 작동하면 다음 리팩토링 단계로 전진
  4. 작동하지 않으면 문제 해결하고, 리팩토링 한 것을 undo해 작동되도록 유지.

 

3. 코드스멜(4)

: 프로그램 작업을 어렵게 만드는 것

  • 읽기 어려운 프로그램
  • 중복된 로직을 가진 프로그램
  • 실행 중인 코드를 변경을 요구하는 프로그램
  • 복잡한 조건문이 있는 프로그램

 

 

9-5 코드 품질 개선 기법

1. 코드 인스펙션

: 프로그램을 읽어보고 눈으로 결함을 찾아내는 것.(ex. 효율성, 코딩 표준 준수 여부)  

  - 결함 타입(4): 로직 문제/컴퓨팅 문제/인터페이스 문제/ 데이터 처리

 

2. 정적 분석

: 수행되지 않는 데드코드가 없는지, 선언되고 사용 안 한 변수가 없는지 검사.

  - 방법(2)

  • 비정상적, 원치 않는 패턴 찾기: 자료 흐름, 논리 흐름 분석
    • 자료 변칙: 자료 흐름도를 분석해 패턴을 찾는것.
    • 사족(redundant): 컴파일러에 의해 검출 안됨. 중된 배정문, 데드 코드 등
  • 고장을 일으킬 코드 상에 존재하는 결함 직접 찾기

 

3. 페어 프로그래밍

: 애자일 방법에서 프로그래밍과 테스팅을 담당하는 두 사람이 머신을 공유하며 코딩

  • 같은 컴퓨터 사용해 프로그램.
  • 성공의 기쁨을 나눌 수 있어 프로그래밍이 재밌음
  • 팀의 소통 향상
  • 상호 이해와 협력 향상
  • 더 간단하고 효율적인 해법을 만들 수 있음.

  - 테스트 중심개발(Test Driven Development)