Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

IT could be

Convention 본문

개발공부 εїз

Convention

얘진 2022. 12. 28. 16:10

Coding Guide (Java)

소프트웨어 개발 시에 코딩 가이드를 준수하는 목적은 다수의 개발자들이 상호간의 소스코드에 대한 가독성 및 이해도를 높이고, 해당 표준에 따라 개발함으로써 프로젝트 품질의 일관성을 유지하여 프로젝트 완료 이후의 원활한 시스템 유지보수를 지원할 수 있도록 하는데 있다.

1. 포매팅

1.1. 파일 인코딩은 UTF-8 사용

1.2. 들여쓰기

  • tab 문자 대신 space 문자 4개 사용
  • tab 문자는 에디터 프로그램이나 사용자 설정에 따라 간격이 다르게 보여질 수 있기 때문에 tab 문자 대신 space 문자를 사용한다.

1.3. 중괄호

  • K&R 스타일 사용. 시작하는 중괄호는 새로운 라인에서 시작하지 않고 제어문과 같은 라인을 사용한다.
    if (superHero == theTick)
    {
        System.out.println("Spoon!");
    }                                            // NO!     
    if (superHero == theTick) {
        System.out.println("Spoon!");
    }                                            // YES!  
  • 제어문이 한 줄이더라도 중괄호를 생략하지 않는다.
    if (superHero == theTick) System.out.println("Spoon!");  // NO!

    if (superHero == theTick)
        System.out.println("Spoon!");  // NO!

    if (superHero == theTick) {
        System.out.println("Spoon!");
    }           

1.4. 띄어쓰기

  • 메소드 이름 다음에는 띄어쓰기 없이 왼쪽 괄호를 사용
    foo (i, j); // NO!
    foo(i, j);  // YES!
  • 배열 다음에는 띄어쓰기 없이 왼쪽 괄호를 사용
    args [0];  // NO!
    args[0];   // YES!
  • 이진 연산자 간에는 양쪽에 띄어쓰기를 사용
    a=b+c;          // NO!
    a = b+c;        // NO!
    a=b + c;        // NO!
    a = b + c;      // YES!

    z = 2*x + 3*y;         // NO!
    z = 2 * x + 3 * y;     // YES!
    z = (2 * x) + (3 * y); // YES!
  • 쉼표와 세미콜론 뒤에는 띄어쓰기를 사용
     for (int i = 0;i < 10;i++)   // NO!
     for (int i = 0; i < 10; i++) // YES!

     getPancakes(syrupQuantity,butterQuantity);  // NO!
     getPancakes(syrupQuantity, butterQuantity); // YES!
  • cast 사용시 띄어쓰기 없이 작성
    (MyClass) v.get(3);  // NO!
    ( MyClass )v.get(3); // NO!
    (MyClass)v.get(3);   // YES!
  • if, while, for, switch, catch 문 뒤에는 띄어쓰기를 사용
     if(hungry)  // NO!
     if (hungry) // YES!

     while(pancakes < 7)  // NO!
     while (pancakes < 7) // YES!

     for(int i = 0; i < 10; i++)  // NO!
     for (int i = 0; i < 10; i++) // YES!

     catch(TooManyPancakesException e)  // NO!
     catch (TooManyPancakesException e) // YES!

1.5. 클래스 멤버 정렬 순서

  • 클래스 멤버는 필드(전역변수), 생성자, 메소드 순서로 정렬한다.
    class Order
    {
        // fields (attributes)

        // constructors

        // methods
    }

1.6. 라인 최대 길이

  • 100 칸을 넘지 않는다.

1.7. C 스타일 배열 선언 사용 금지

String args[]   // bad
String[] args   // good

1.8. 지시자의 표기는 자바언어 사양상의 등장 순서를 지킨다.

public protected private abstract static final transient volatile synchronized native strictfp

2. 네이밍

  • 모든 식별자는 영문 대소문자와 숫자만 사용

2.1. 클래스와 인터페이스명

  • 각 단어의 첫 글자는 대문자로 나머지는 소문자를 사용.
Examples:
    Customer
    SalesOrder
  • 두문자어(acronym)도 같은 규칙을 사용.
XMLHTTPRequest  // NO!
XmlHttpRequest  // YES!

getCustomerID   // NO!
getCustomerId   // YES!

class HTML      // NO!
class Html      // YES!

String URL      // NO!
String url      // YES!

long ID         // NO!
long id         // YES!

2.2. 패키지명

  • 소문자만 사용. 8자 이내로 사용.
Examples:
    common
    core
    lang
  • 복합단어를 사용하지 않는다.
Examples:
    subwayzone  // NO!
    zone.subway // YES!

2.3. 그 외의 모든 식별자

  • 필드 식별자, 변수, 메소드, 파라미터는 다음의 네이밍 규칙을 따른다.
  • 첫 단어를 제외한 첫 글자는 대문자로 나머지는 소문자를 사용. 두문자어(acronym)는 대문자 사용하되 첫 단어인 경우는 모두 소문자를 사용.
Examples:
    customer
    salesOrder
    addToTotal()
    targetURL
    urlTarget

2.3.1. 헝가리안 표기법 및 범위 식별자는 사용하지 않음

    public class Person
    {
        private String sFirstName; // NO! (Hungarian notation: s for String)
        private String firstName;  // YES!

        private String mLastName;  // NO! (Scope identification: m for member variable)
        private String _lastName;  // NO! (Scope identification: _ for member variable)
        private String lastName;   // YES!

        // ...
    }

2.3.2. 테스트 코드

테스트 코드는 메소드와 필드 식별자에 밑줄을 사용하는 것이 허용된다.

Example:

    Code to test a method double eatSomePie(double amount) may use variables such as:

    eatSomePie_count
    eatSomePie_amount
    eatSomePie_return
    eatSomePie_exception

3. 코딩

3.1. 피해야할 사항

3.1.1. do..while 사용하지 않는다.

  • do..while 문은 조건이 코드 아래 부분에 있기 때문에 가독성이 좋지 않고, 경험이 적은 프로그래머에게도 익숙하지 않은 문법이다.
So rather than:
    boolean done = false;
    do
    {
        ...
    } while (!done)
use:
    boolean done = false;
    while (!done)
    {
       ...
    }

3.1.2. 메소드 중간에 return을 사용하지 않는다.

  • return은 메소드 마지막에 사용한다.
  • return이 중간에 있다면 메소드를 수정할 경우 고려할 사항이 많아지고 버그를 유발시킬 가능성이 높아진다.

3.1.3. continue를 사용하지 않는다.

  • 수정 시에 2개 이상의 end point를 고려해야 하기 때문에 코드 수정이 어려워 진다.

3.1.4. break는 switch 이외의 다른 제어문에서 사용하지 않는다.

  • 수정 시에 2개 이상의 end point를 고려해야 하기 때문에 코드 수정이 어려워 진다.

3.2. 증감 연산자는 분리된 라인에서 사용

  • 증감 연산자는 분리된 라인에서 단독으로 사용한다.
Examples:
    foo(x++); // NO!

    foo(x);   // YES!
    x++;

    y += 100 * x++;  // NO!

    y += 100 * x;    // YES!
    x++;

3.3. 초기화

  • 변수가 사용되는 곳의 가까운 위치에 변수를 선언.
Examples:
    int totalWide;
    int firstWide = 20;
    int secondWide = 12;
    firstWide = doFoo(firstWide, secondWide);
    doBar(firstWide, secondWide);
    totalWide = firstWide + secondWide;         //  wrong!

    int firstWide = 20;
    int secondWide = 12;
    firstWide = doFoo(firstWide, secondWide);
    doBar(firstWide, secondWide);
    int totalWide = firstWide + secondWide;     //  right!

    int secondWide = 12;
    int firstWide = doFoo(20, secondWide);
    doBar(firstWide, secondWide);
    int totalWide = firstWide + secondWide;     //  even better!

3.4. 접근

  • 상수를 제외한 모든 필드는 private 해야 한다.

3.5 와일드 카드 임포트 사용 금지

import java.io.*; // bad
import java.io.File; // good
import java.io.FileReader; // good

3.6. 스위치문 사용시엔 반드시 default구를 정의한다.


Commit message

- feat: 새로운 기능 추가

- fix: 버그 수정

- docs: 문서 수정

- style: 코드 변경 없이 스타일 변경할 경우 (코드 포맷팅 수정)

- refactor: 코드 리팩토링

- test: test 코드 추가 및 수정

- comment:주석 추가 및 commnet 작성

- chore: 코드 변경 없는 변경 사항 (동작에 영향 X)


Branch & Pull Request

협업으로 개발할 때, Git을 사용하면서 conflict가 나지 않게 관리하며 개발하기 위해서 브랜치 관리를 잘하는 것이 중요하다.

main 브랜치

  • develop 브랜치에서 배포할 수 있을 정도로 구현된 것을 Merge를 하는 브랜치다.

develop 브랜치

  • 기능 개발과 버그 수정의 브랜치 Merge가 자주 일어나는 브랜치입니다. 개발이 활발하게 일어나는 브랜치다.
  • 개발을 할 때 기능 단위로 develop 브랜치에서 새로운 브랜치를 생성한다.

issue

  • issue 템플릿을 사용하여 이슈의 내용과 체크리스트를 작성한다. 제목은 추가하려는 기능을 간략하게 나타내고 assignees로 그 이슈를 담당할 사람을 지정하고 label을 지정한다.

  • 이슈에 맞는 적절한 Label을 지정한다. Label의 종류는 상황이나 내용에 따라 만들어서 사용한다. 

 

(Label)/#이슈번호-(기능타이틀)

  • 이슈(기능)에 대한 내용을 개발하는 브랜치. 기능이 완벽하게 구현이 되었다면 develop 브랜치에 Pull Request를 보낸 후에 Merge를 하면 된다. 브랜치 이름 ex) feature/#1-로그인기능 
git checkout -b 브랜치이름 (해당 브랜치가 존재하지 않는다면 브랜치를 새로 만들면서 바로 그 브랜치로 이동)
ex) git checkout -b feature/#1

git checkout 브랜치이름 (존재하는 브랜치가 있다면 그 브랜치로 이동)
ex) git checkout feature/#1

Pull Request 보내는 방법

  • Pull Request를 보내는 이유는 Merge 하기 전에 코드 리뷰를 하기 위해서다. 만약 feature/#1과 같은 기능 브랜치가 완성이 되었다면 develop 브랜치에 Pull Request를 보내서 리뷰를 받고 Merge한다.
git add .
git status
git commit -m "커밋 컨벤션 메세지"
git push origin 브랜치이름

 

참고

Java 코딩 스타일 가이드

Issue 템플릿 만들기

Comments