반응형

(기본적으로 정말로 코딩하는 방법에 대해서는 언급하지 않음)


코딩 로드맵

  • SW 제품의 품질은 원시 코드에 모두 귀결
스크린샷 2023-05-29 오전 11 29 04

코딩 작업

  • 작업과정
  1. 원시코드를 같은 스타일로 만들기 위하여 코딩 표준을 만든다.
  2. 아키텍처 설계 결과 프레임워크 패키지와 응용 패키지를 결정
  3. 클래스 구현이 끝나는 대로 인스펙션
    • 인스펙션 : 검사(테스팅과는 다름)
      • 소스 코드를 검사하는 것(텍스트 자체를)
    • 비슷한 단어 : 리펙토링
      • 리펙토링 : 기능 추가, 개선 없이 소스코드의 구조를 개선
  4. 클래스 단위로 테스트
  5. 클래스나 패키지를 릴리스 하여 응용 시스템으로 통합

자주 발생하는 오류

1. 메모리 누수

  • 메모리가 프리되지 않고 프로그램에 계속 할당되는 현상
  • 장기로 수행되는 시스템에는 치명적인 영향을 줄수 있음
    • C언어의 malloc은 할당후 마지막에 할당한 영역을 풀어줘야함

2. 중복된 프리선언

  • 프로그램 안에서 사용하는 자원은 먼저 할당되고 사용 후에는 프리로 선언
  • 이미 프리로 선언된 자원을 또 다시 프리로 선언하는 경우 오류
    • malloc후 free로 할당자원을 풀었는데 또 free를 하면 오류 발생
    • 반납한 경우 해당 메모리에 접근 불가능한테 free를 통해 또 접근하면 오류

3. NULL의 선언

  • NULL을 포인트 하고 있는 곳의 콘텐츠를 접근하려고 하면 오류
    • 어떤 영역에 접근할 때 해당 부분이 할당받았는지 확인 후 사용해야함
  • 이러한 오류는 시스템을 다운시킴

4. 별칭의 남용

  • 별칭(alias)은 많은 문제를 야기
    • 원래 a를 b가 가리켰는데 새로운 c도 b를 가리키게 되는 경우 a와 c가 둘다 b를 가리키게 됨
  • 서로 다른 주소값을 예상하고 사용한 두 개의 변수의 값이 별칭선언으로 인하여 같은 값이 되었을 때 오류 발생

5. 배열 인덱스 오류

  • 배열 인덱스가 한도를 벗어나면 예외 오류
  • 배열 인덱스가 음수를 갖는 경우

6. 수식 예외 오류

  • 0으로 나누는 오류
  • 부동 소수점 예외 오류
printf("%.20f", 1.0/10.0*100);

=> 0.10000000000000000555

7. 하나 차이에 의한 오류

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

8. 사용자 정의 자료형 오류

  • 오버플로우나 언더 플로 오류가 쉽게 발생
  • 사용자 정의 자료형의 값을 다룰 때는 특별한 주의
    • 디버깅 : 버그를 잡는 것(인덱스 오류 잡기)
typedef enum{A, B, C, D} grade; 

void foo(grade X)  
{
    int i, m;  
        i = GLOBAL_ARRAY[x-1]; //Underflow possible 
        m = GLOBAL_ARRAY[x+1]; //Overflow possible
}

9. 스트링 처리 오류

  • strcpy, sprint 등 많은 스트링 처리 함수가 있다
  • 매개변수가 NULL
  • 스트링이 NULL로 끝나지 않았을 경우
  • source매개변수의 크기가 destination매개변수보다 크지 않을경우

10. 버퍼 오류

  • 프로그램이 버퍼에 복사하여 입력받으려 할때 입력값을 고의로 아주 크게주면 스택의 버퍼에 오버플로 발생
    • 버퍼의 사이즈를 파악을 못해서 오버플로우가 발생 가능
  • 버퍼 오버플로를 이용하여 해커들이 자신의 코드를 실행시킬 수 있음
void mygets(char *str) { 
    int ch;
    while ( ch = getchar() != ‘\n’ && ch != ‘\0’ ) 
        *(str++) = ch;
    *str = ‘\0’; 
}

main() {  
    char s2[4]; 
    mygets(s2);
}

11. 동기화 오류

  • 공통 자원을 접근하려는 다수의 스레드가 있는 병렬 프로그램에서 흔히 발생함

  • 데드락(deadlock)

    • 다수의 스레드가 서로 자원을 점유하고 릴리스 하지 않는 상태
    • 한 번 걸리면 껐다 켜야됨
  • 레이스 컨디션

    • 두개의 스레드가 같은 자원을 접근하려 하여 수행결과가 스레드들의 실행순서에 따라 다르게 되는 경우
  • 모순이 있는 동기화

    • 공유하는 변수를 접근할 때 로킹과 언로킹을 번갈아하는 상황에서 오류가 많이 발생

코딩 표준

명명 규칙

  • 카멜 케이스

    • Java 클래스, 필드, 메소드 및 변수 이름
    • 여러단어를 함께 붙여쓰되 각 단어의 첫 글자는 대문자
      • 클래스만
      • 나머지는 첫 글자는 소문자 이후 단어가 새롭게 나올때 마다 대문자
    • thisIsAnExample
  • 상수는 모두 대문자로

    • public static final double SPEED_OF_LIGHT= 299792458;
    • // in m/s
  • 클래스와 인터페이스 이름

    • 명사 또는 명사구이며 대문자로 시작
    • interface AqueousHabitat { ... }
    • class FishBowl implements AqueousHabitat { ... }

메서드 이름

  • 일반적으로 소문자로 시작하는 동사구

    • public void setTitle(String t) { ... }
  • 함수 이름은 일반적으로 값을 설명하는 명사구로

    • public double areaOfTriangle(int b, int c, int d) { ... }
  • 필드(예를 들어 title)의 값을 접근하여 리턴하는 함수는 “get”

    • public String getTitle() { ... }
  • 조건을 묻는 Bool 함수의 이름은 대개 “is”로 시작

    • public boolean isEquilateralTriangle(int b, int c, int d) { ... }

변수 이름

  • 일반적으로 소문자로 시작
  • 용도에 대한 힌트를 제공해야
  • 모호한 이름을 사용하지 않아야
  • 변수 이름의 길이
    • hypotenuseOfTriangle= 6 * (2 + hypotenuseOfTriangle) + 7 / hypotenuseOfTriangle - hypotenuseOfTriangle;
    • x= 6 * (2 + x) + 7 / x - x;
  • 대상이 사용된 위치를 고려
    • 매개 변수: 되도록 짧게
    • 필드변수: 가능한 길고 의미가 담겨있어야

패키지 이름

  • 일반적으로 명사단어를 이용하고, 모든 글자가 소문자로 명명함

문장과 수식

  • 문장이나 수식은 메소드나 클래스로 패키지화
  • 블록 문장
    • 제어구조가중첩되었을때생기는혼란을줄일수있음 if (x >= 0)
      if(x>=0)
      if (x > 0) positiveX();  
      else // Oops! Actually matches most recent if!
      negativeX()
  • 수식
    • 괄호를 이용하여 오퍼레이션의 순서를 명확히 // Extraneous but useful parentheses.
    • int width = (( buffer * offset ) / pixelWidth ) + gap;
    • a *= b+ c == a = a * (b+c)

오류 처리

  • 잘못된 데이터를 어떻게 다룰 것인가
    • 예: 실제로는 없는 계좌번호
  • 매개변수 오류
    • 예: evaluate()라는 메소드가 매개변수로 ‘car’, ‘truck’, ‘bus’만을 받아들인다
      • evaluate( String vehicleP )
      • evaluate( SpecializedVehicle vehicleP )
  • 입력오류방지
    • 리스트박스
    • 디폴트값을지정

주석

  • 주석
    • 디버깅하는 동안 얻을수 있는 도움
    • 다른 사람들이 프로그램을 이해하기 쉽도록 함
    • 주석 다는법

설계에서 코드 생성

스크린샷 2023-06-05 오전 10 45 44

연관의 구현

  • 클래스 A와 B사이에 1대 1연관 관계가 있다
  • 1대 1 연관
    • A에서 B의 함수를 호출할 필요가 있다면 A가 B에 대한 참조를 갖도록 구현
      • A 클래스 내부에 B 를 new를 사용해서 구현
    • 반대로 B에서 A의 함수를 호출할 필요가 있다면 B가 A에 대한 참조를 갖도록 구현
  • 1대 다
    • 클래스 A에서 인스턴스 B의 메소드를 호출할 것이 있다면 클래스A가 클래스 B의 참조를 모음으로 가지고 있도록 구현
  • 다대 다
    • 중간에 연관 클래스를 도입하여 1대 다의 관계로 바꾸어 설계하기도 한다

시퀸스 다이어그램의 구현

  • A 객체에서 B 객체로 나가는 메시지가 표시되어 있다면
    • 메소드는 B 클래스에 정의

리팩토링

  • 결과의 변경 없이 코드의 구조를 재조정
  • 이미 존재하는 코드의 디자인을 안전하게 향상시키는 기술
  • 가독성을 높이고 유지보수를 편하게 하기 위한것

코드스멜

  • 프로그램에 대한 작업을 어렵게 만드는 것
  • 읽기 어려운 프로그램
  • 중복된 로직을 가진 프로그램
  • 실행 중인 코드를 변경해야 하는 특별한 동작을 요구하는 프로그램
  • 복잡한 조건문이 포함된 프로그램

소프트웨어를 보다 쉽게 이해할 수 있고 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화 없이 내부구조를 변경하는 것


스크린샷 2023-05-29 오후 12 34 59
  • 단일책임의 원리와도 직결
스크린샷 2023-05-29 오후 12 35 37
  • 여러 클래스를 동시에 수정
    • shape라는 인터페이스로 유사한 기능을 모으고 rectangle, circle 등등의 클래스로 직접 구현
  • 상속
    • 부모와 자식에서 자식이 부모의 data, method이외의 +@가 있어야 상속의 의미가 있음

반응형

+ Recent posts