소프트웨어공학

내가 공부하기 위한 공간 - [소프트웨어공학] 10 - 코딩

AbiTindt 2025. 5. 30. 15:08
반응형

[구현]

코딩 : 구현 뿐 아니라 유지보수를 위한 작업도 필요

  • 리팩토링작업 : 문제가 될만한걸 개선
  • 상세설계에서 파악한 알고리즘의 의사코드나 흐름도로 작업
  1. 통일을 위해 코딩표준 마련
  2. 아키텍처 설계 결과 프레임워크 패키지와 응용 패키지 결정, 메서드 코딩(응용 완성 전 프레임 완성)
  3. 구현이 끝나면 인스펙션
  4. 테스트
  5. 클래스/패키지 릴리스, 응용시스템에 통합

 

<오류들>

메모리누수 : 메모리반환 없이 할당만 하여 메모리가 고갈되는 것

 

중복반환(free)

 

NULL을 포인트하고 있는 곳의 내용에 접근(초기화 안된 메모리에 접근)

 

별칭남용 : 주소가 다를것으로 예상한 것이 별칭으로 같은 값을 가지는 경우

 

인덱스 : 언더플로, 오버플로

 

수식예외 : 나누기0

 

하나차이 : 간단한 오류, 찾기 어려움

 

사용자 정의 자료형 : 언더플로, 오버플로

 

스트링 : 매개변수 NULL / NULL로 안끝남 / 필요공간부족

 

버퍼 오버플로 : 값을 고의로 크게주면 발생 > 리턴 주소로 해킹

 

동기화 : 병렬프로그램에서 발생, 찾기 어려움

  • 데드락 : locking 모순일때 발생, 여러 스레드가 서로 자원 점유하고 릴리스 안한 상태
  • 레이스컨디션 : 동시 접근으로 수행 결과가 실행 순서에 따라 다른것
  • 모순있는동기화 : locking, unlocking 번갈아 하는 상황에서 발생

 

<표준>

명명규칙

  1. 카멜케이스
  2. 클래스, 인터페이스(명사, 명사구) : 대문자로 시작
  3. 메서드(동사구) : 소문자로 시작
  4. 변수(목적) : 소문자로 시작
  5. 패키지(명사) : 모두소문자

 

형식

  1. 들여쓰기, 괄호(블록)

 

문장, 수식

  1. 블록문장 : 제어흐름 구조에서 수식보다 블록문장 사용
  2. 수식 : 괄호로 명확한 순서

 

오류처리

  1. 매개변수 : 타입 제한으로 미리 배제 / 입력처리 전 정상으로 변환
  2. 입력 : 파라미터의 안전한 디폴트값 지정, 알림으로 호출자에게 잘못된 입력에 대한 처리책임 넘김

 

주석

  1. 프로그램 코드를 설명하거나, 코드의 동작 방식을 기록하거나, 코드에 대한 메모를 남기는 목적
  2. 읽는 대상은 기본을 바탕으로 하여 과도한 주석X
  3. 클래스불변조건 : 객체의 상태가 일관성을 유지하도록 하기 위해 항상 참이어야 하는 조건, 클래스의 속성에 대한 의미와 제약 모음
  4. 메서드주석 : 매개변수, 메소드의 일, 결과값에 대한 내용을 작성
  5. 클래스주석 : 클래스 용도에 대한 내용 작성
  6. 문장주석 : 논리구조앞에서 내용설명

 

 

[설계코딩]

<연관코딩>

연관은 클래스 간의 관계를 표현

설계에서는 단방향, 양방향, 다중성 등을 표현하며, 코드에서는 객체 참조나 리스트, 배열로 구현

 

<시퀀스다이어그램코딩>

시퀀스 다이어그램은 객체 간 메시지 흐름을 표현

이를 코드로 구현할 때는 메서드 호출 흐름에 주목

 

<상태다이어그램코딩>

상태 다이어그램은 객체의 상태 변화와 전이 조건을 보여줌

코드에서는 상태를 나타내는 enum + 상태 전이 메서드로 구현

 

 

[리팩토링]

정의 : 좋은 설계가 되도록 개선

  • 디자인 개선, 이해 쉬움, 유지보수 도움, 효율적
  1. 소규모(단일 리팩토링)
  2. 테스트
  3. 전체가 작동하면 다음단계 전진, 안하면 문제해결/되돌려 작동 유지

 

<메서드추출>

중복 코드를 메서드로 만듦

<클래스추출>

단일책임원칙을 지키도록 만듦

<서브클래스추출>

특정 인스턴스에만 해당되는게 있다면 서브클래스로 내려보냄

<메서드이동>

정의된 클래스보다 다른 클래스의 기능을 사용하면 그쪽으로 옮김

<인터페이스추출>

인터페이스분리원칙을 지키도록 만듦

<템플릿메서드형성>

서브클래스의 비슷한 작업들을 슈퍼클래스로 올림

 

 

[코드스멜]

정의 : 코드 스멜은 컴퓨터 프로그래밍 코드에서 더 심오한 문제를 일으킬 가능성이 있는 프로그램 소스 코드의 특징

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

 

 

[코드품질향상기법]

<코드인스펙션>

컴파일, 검사 후 시행

체크리스트 형태로 인스펙션 참여자들에게 배포

결함, 품질이슈 등을 찾아내고 확인

 

<정적분석>

정의 : 실행없이 원시코드 분석(컴파일, 코드작성)

 

코딩스타일, 일관성 검사

버그, 취약점 탐지

코드복잡도 분석

의존성관리, 라이브러리 검사

 

취약점찾기 : 소스코드, 바이너리코드, 컴파일된 코드를 분석

패턴매칭방법 : 미리정의된 취약점 패턴과 코드를 비교

구문분석/타입 검사방법 : 컴파일러구현에서 사용

데이터흐름분석방법

오염분석 : 외부입력을 추적하여 취약점 찾음

 

<테스트중심개발>

기능을 만들기 전에 테스트 코드를 먼저 작성하고,

그 테스트를 통과할 코드를 작성하는 개발 방식

 

개발 순서 (Red - Green - Refactor)

1. Red: 실패하는 테스트 작성

2. Green: 테스트를 통과하는 최소한의 코드 작성

3. Refactor: 코드 개선 (중복 제거, 정리 등)

 

장점

버그 감소

리팩토링 쉬움

코드 품질 향상

테스트가 문서 역할도 함

 

단점

초기 개발이 느릴 수 있음

테스트 작성이 익숙하지 않으면 어렵게 느껴짐

 

<페어프로그래밍>

두 명이 함께 한 컴퓨터로 코드 작성하는 협업 방식

  • Driver: 코드 작성
  • Navigator: 아이디어 제안, 코드 검토

 

장점

버그 감소

코드 품질 향상

서로 배우며 성장

집중력 향상

 

단점

인력 낭비처럼 보일 수 있음

궁합이 중요

오래 하면 피로

반응형