본문 바로가기

Java & Html

Java Google Style Guide

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
  1. 소개
    -. 자바를 처음 만든 Sun에서 자바 프로그래밍 언어 코딩 규칙(Code Conventions for the Java TMProgramming Language) 만들어 배포하였으나, 1999.04.20 마지막 업데이트를 하고 현재까지 남아있다.
    -. Google Java Style Guide
    Code Conventions for the JavaTM Programming Language 기초로 60% 이상의 룰을 따라 하였으며, 현재 꾸준히 업데이트를 하고 있다.
  2. 개요
    1. 코딩규칙이 왜 필요한가?
      -.
      프로그램을 개발하는 과정 다수의 비용이 유지보수에 쓰인다.
      -.
      유지보수는 처음 개발한 개발자가 담당하는 경우는 거의 보기 힘들다.
      -.
      코딩 규칙을 지키면 소스 코드를 처음 개발자가 빠른 시간 안에 완벽하게 이해할 있도록 도와주기 때문에, 가독성이 높아진다.
  1. 소스파일(기본)
    1. 파일명
      -. UTF-8 인코딩된 소스파일을 생성하며, 소스 파일명은 최상위 클래스명을 포함하는 대소문자를 구분하는 이름으로 구성되며, 뒤에 .java 확장자를 추가한다.
      ex) TopLevelTest.java
      • Window -> Preferences -> General -> Workspace -> Text file Encoding -> UTF-8 변경
    1. 줄의 끝 이외에 공백문자(Space Key) 허용되나 (ASCII 0x20) 사용하지 않는다.
      • 이클립스에서 Window -> Preferences -> indentation -> Google Style 선택 -> edit 클릭 -> Tab policy Spaces only 변경

 

 

 

  1. 특수 이스케이프 시컨스 자체로 사용하되, 그에 해당하는 8진수(e.g. \012) 또는 유니코드(e.g.\u000a) 등은 사용하지 않는다.
  2. 코드의 가독성을 높일 수 있다면 유니코드를 사용해도 무방하다.
            • 이클립스에서 Window -> Preferences -> Java -> Code Style -> Code Templete 을 클릭하고 codetemplete.xml import 한다. (저작권 및 자동생성 주석을 설정한다.) 
  1. 소스파일(구조)
    -. 소스파일은 다음과 같은 순서에 따라 구성된다.

(M : Mandatory, O : Optional)

라이선스 또는 저작권 정보(O)

 

패키지 구문(M)

 

Import 구문(M)

 

단 하나의 최상위 클래스(M)

-. 섹션 사이에는 공백 라인이 하나 들어가야 한다.(분홍라인)

  1. License or copyright information, if present
    -.
    파일에 라이선스 또는 저작권정보가 있다면, 그것은 여기에 넣는다.
  2. Package statement(패키지구문)
    -.
    패키지 구문은 줄바꿈하지 않는다. 컬럼길이 제한(한 라인에 80 혹은 100자만 쓴다.) 패키지 구문에는 적용되지 않는다.
  1. Import statement(Import구문)
    1. wildcard imports
      -. static wildcard import, wildcard import
      사용하지 않는다.( * 문자)
    1. 줄바꿈금지
      -. import 구문은 줄바꿈하지 않는다. 컬럼길이 제한(한라인에 80 혹은 100자만 쓴다.) import 구문에는 적용되지 않는다.
    1. 순서와 공백주기
      -. import 구문은 다음에 나오는 그룹으로 순서대로 나누어지며, 그룹은 하나의 빈 줄로 구분되어진다.(하위의 순서대로 import구문을 작성한다.)
      1. 모든 static import 단일 그룹안에 넣는다.
      1. com.google imports(해당 소스 파일이 com.google 패키지 공간에 있는 경우에만)
      1. Third-party import, 하나의 최상위 레벨 패키지 하나의 그룹을 이루며 ASCII 순서로 정렬한다. 예를 들어 : android, com, junit, org, sun
      1. java import
      1. javax import
    1. Class declaration(Class 선언)
      1. 단 하나만 최상위 클래스 선언
        -. 각각의 최상위 클래스는 자신의 소스파일에 위치한다.
      1. 클래스 멤버 정렬
        -. 하나의 클래스에 멤버의 정렬은 학습용이성에 엄청난 효과를 가질 있으나, 수행하는 법에 대한 정확한 방법은 없다.
        -.
        클래스 멤버의 순서는 절대적인 것이 없다. 다만 이들의 순서가 논리적이여야 한다. 가령 새로운 메소드가 추가되었다고 해서 클래스의 가장 마지막에 구현되는 것은 논리적이지 않다.
        -.
        멤버 순서에 대해서 하나의 제약 사항이 있는데 동일한 메소드명 (생성자들, 오버라이딩된 메소드들) 곳에 모아두어야 한다는

/**

 * YOU ARE STRICTLY PROHIBITED TO COPY, DISCLOSE, DISTRIBUTE, MODIFY OR USE THIS PROGRAM

 * IN PART OR AS A WHOLE WITHOUT THE PRIOR WRITTEN CONSENT OF HOMEPLUS.

 * HOMEPLUS OWNS THE INTELLECTUAL PROPERTY RIGHTS IN AND TO THIS PROGRAM.

 * COPYRIGHT (C) 2016 Homeplus.co.kr ALL RIGHTS RESERVED.

 *

 * 하기 프로그램에 대한 저작권을 포함한 지적재산권은 Homeplus 있으며,

 * Homeplus 명시적으로 허용하지 않는 사용, 복사, 변경 3자에 의한 공개, 배포는 엄격히 금지되며

 * Homeplus 지적재산권 침해에 해당된다.

 * Copyright (C) 2016 Homeplus.co.kr All Rights Reserved.

 *

 *

 * Program    : test

 * Description    :

 * Environment    : JRE 1.8 or more

 * File        : TestController.java

 * Notes    :

 * History    : [NO][Programmer][Description]

 *        : [2016MMDDHHmmSS][maddie][CREATE: Initial Release]

 */

 

package maddie.controller;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.util.StringUtils;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

 

import maddie.common.constants.BizplusConstants;

import maddie.domain.AjaxResult;

 

/**

 * @version 1.0.0

 * @author maddie

 *

 * @since 2016. 10. 18.

 * <p>DESCRIPTION:</p>

 * <p>IMPORTANT:</p>

 */

@Controller

public class TestController {

private Logger logger = LoggerFactory.getLogger(TestController.class);

@Autowired private TestService testService;

@Autowired MultipartFileUtil mlt;

 

  1. Formatting
    1. 중괄호는 K & R style(Kernighan Ritchie 스타일(Egyptian brackets - [[ if(a==b) {    "{" 줄바꿈 없이 사용됨]] )) 따르며 무조건 사용한다.

아래의 방법은 틀린 예이다.

if(“x”.equals(“X”)) return true;

else return false;

 

위의 방법을 바꿔 쓴 예이다.

if(“x”.equals(“X”)){

return true;

}else{

return false;

}

 

아래의 방법은 중괄호를 제대로 사용한 예이다.

return () -> {

  while (condition()) {

    method();

  }

};

 

return new MyClass() {

  @Override public void method() {

    if (condition()) {

      try {

        something();

      } catch (ProblemException e) {

        recover();

      }

    } else if (otherCondition()) {

      somethingElse();

    } else {

      lastThing();

    }

  }

};

 

-. 여는 중괄호에는 줄바꿈없음

-. 여는 중괄호 바꿈

-. 닫는 중괄호 전에 바꿈

-. 중괄호가 문장이 종료되는 또는 메소드의 body, 생성자, 또는 명명화된 클래스가 종료되는 경우에만 닫는 중괄호 전에 바꿈

if(entpGrpInfo!= null){

String startDate = entpGrpInfo.getStartDate();

String endDate = entpGrpInfo.getEndDate();

if(startDate.indexOf(" ") > -1){

entpGrpInfo.setStartTime(startDate.substring(startDate.indexOf(" ")));

}

 

if(endDate.indexOf(" ") > -1){

entpGrpInfo.setEndTime(endDate.substring(endDate.indexOf(" ")));

}

 

if((entpGrpInfo.getStartDate() == null || entpGrpInfo.getStartDate().length() == 0)

        && (entpGrpInfo.getEndDate() == null || entpGrpInfo.getEndDate().length() == 0)){

entpGrpInfo.setTimeLimitYn(BizplusConstants.DEFAULT_USE_YN_Y);

}

}

 

-. Multi block의 부분의 경우에(멀티 블록을 포함 : if/else-if/else or try/catch/finally), 블록 또는 블록같은 구조는 ({}) 사이에 줄바꿈 또는 문자가 없어도 블록이 열린 후에 즉시 닫을 수 있다.

void doNothing() {}

 

  1. 블록들여쓰기 : +4 spaces
    -.
    때때로 새로운 블록 또는 블록과 같은 구조는 개의 공백으로 늘어진 들여쓰기로 시작한다. 블록이 끝났을 때, 들여쓰기는 이전 들여쓰기 레벨로 되돌아간다. 들여쓰기 레벨은 블록의 코드와 주석 각각에 적용된다.
  1. 한줄에 하나의 서술
    -. 구문은 줄바꿈을 한다.
  2. Column 제한 : 150

-. 아래에 서술된 경우를 제외하고 자바코드는 150문자의 컬럼제한을 가진다.

  • 컬럼 제한이 불가능한 것들(Javadoc URL 또는 긴 JSNI 메소드 레퍼런스)
  • package, import
  • 셀에서 cut and paste 주석의 커맨드라인

 

-. 제한에 걸린 컬럼들은 Line-wrapped 처리한다.(원칙적으로 라인을 사용할 있는 코드를 여러행으로 분리)

  1. Line-wrapping
    -.
    원칙적으로 라인을 사용할 있는 코드가 여러행으로 분리될때, 이런 행위는 line-wrapping 이라 불린다. 절대적인 법칙은 없고 상황에 따라서 적절하게 사용하면 된다.

-. Line-wrapping 문장은(다음 줄로 내려온 라인) 기본적으로 2 이상의 들여쓰기를 해야 한다. (4개의 스페이스 이상) 그리고 여러 문장이 연속해서 내려올 경우 첫 번째 내려온 문장과 동일한 들여쓰기를 유지한다.

 

-. 줄바꿈은 어디에서 할까?

  • 문장을 대입 연산자가 아닌 곳에서 잘라야 할 경우 심볼 앞에서 내린다.
    this.someString = new StringBuffer()

      .append(“Humans “)

      .append(“are “)

      .append(“intelligent “)

      .append(“apes.”);

this.someString = “Humans “

     + “are “

     + “intelligent “

              + “Apes.”;

 

  • 대입 연산자에서 잘라야 할 경우 대입 연산자 뒤에서 문장을 내린다.
    private final OnPickerActionListener mPickerActionListener =

    new OnPickerActionListener(){

 

  • 함수호출의 경우 ‘(‘ 문장에 두고 나머지를 다음 문장으로 내린다.

addContactOptionMenuItem.setIntent(

new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI));

 

  • 콤마 (‘,’) 경우, 앞의 식별자와 동일한 단어로 취급한다.

Public void onLayoutChange(View v, int left, int top, int right, int bottom,

int oldTop, int oldRight, int oldBottom){

+

  1. 공백
    1. 공백라인

-. 아래와 같은 상황에서 공백라인이 들어간다. 여러 줄의 공백라인은 추천하지 않는다.

  • 클래스 멤버들을 구별하는 데 사용 : 메소드, 생성자, 멤버변수

à 멤버변수의 경우, 사이에 코드가 없다면 굳이 공백라인을 넣지 않아도 된다.

  • 메소드 내부에서 논리적으로 그룹핑 되는 부분
  1. 공백문자

List<string> list

if (true) {

     // ...

}

float var = a + i * (4 / Math.pow(0.5, x)) - 45.0f;

if (someBoolean) {

     // ...

} else {

     // ...

}

 

for (int i = 0; i < 10; i++) {

  //

}

<t extends="" foo="" &="" bar="">

catch (FooException | BarException e)</t></string>

-. if, for, catch 그 다음에 오는 ‘(‘ 사이에 공백문자

-. else, catch그 이전에 오는 ‘}’ 사이에 공백문자

-. ‘,’, ‘:’, ‘;’ 다음 이나 타입 캐스트시의 ‘)’  다음에 공백문자

-. 연산자 뒤로는 공백문자 삽입

-. 연산자와 비슷한 심볼에서도 뒤로 공백문자 삽입

  1. 변수정렬
    -. 변수명을 보기 좋게 하기 위해서 정렬을 이용할 때가 있는데 이는 추천하지 않는다.

private int x; // this is fine

private Color color; // this too

 

private int      x;      // permitted, but future edits

private Color    color;  // may leave it unaligned

 

-. 문장만 수정하고 싶은데 정렬 때문에 여러 문장을 수정해야 하는 상황 발생

-. 코드리뷰를 힘들게 하며 가독성을 위해 너무 많은 잠재적 시간을 투입해야

-. 코드 수정 이력에 필요 없는 정보를 넣게 되고 잠재적으로 충돌 가능성이 높아짐

  1. 특별한 구조
  1. Enum 클래스

-. Enum 상수 뒤에 콤마 , 줄바꿈은 선택적이다. 부가적으로 빈줄(대개 한줄)은 허용한다.

private enum Answer {

  YES {

    @Override public String toString() {

      return "yes";

    }

  },

 

  NO,

  MAYBE

}

 

 

-. 배열 초기화 것처럼 그것의 상수에 documentation 없고 method 없는 enum 클래스는 선택적으로 형식화 있다.

private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }

 

-. enum 클래스는 클래스이기 때문에, 서식 클래스에 대한 모든 다른 규칙이 적용됩니다.

  1. 변수선언
    -. 선언 하나의 변수
    à 모든 변수 선언(필드 또는 로컬) 하나의 변수만 선언된다 : int a, b; 사용되지 않는 변수

-. 필요할 선언

à 지역변수는 습관적으로 블록 또는 블록 같은 구조의 시작에 선언되지 않는다. 대신에,

지역변수들이 범위를 최소화하기 위하여 첫번재로 사용된 포인트 근처에 선언된다.

지역변수 선언은 일반적으로 초기화를 가지거나 선언 후 즉시 초기화한다.

  1. 배열
    -. 배열 초기화 à 블록 구조의 경우, 배열 초기화는 선택적으로 형식화된다.

new int[]{

  0, 1, 2, 3

}

new int[]{

0,

1,

2,

3

}

new int[]{

0, 1,

2, 3

}

New int[]

{0, 1, 2, 3}

-. C 스타일의 배열선언은 하지 않음

à 대괄호 변수가 아닌 유형의 부분으로 생긴다

String[] args  à O

String args[]  à X

  1. switch 구문

switch (input) {

  case 1:

  case 2:

    prepareOneOrTwo();

    // fall through

  case 3:

    handleOneTwoOrThree();

    break;

  default:

    handleLargeNumber(input);

}

 

-. switch 내에서도 들여쓰기는 적용해야 한다.

-. 아무 처리가 없더라도 default 무조건 있어야 한다.

  1. Annotation

-. 클래스, 메소드 또는 생성자에 적용된 annotation documentation 블록 후에 나타난다, 그리고 annotation 자신의 라인을 목록화한다.(라인당 하나의 annotation). 줄바꿈은 Line-wrapping 구성하지 않는다. 그래서 들여쓰기 레벨은 증가하지 않는다.

@Override

@Nullable

public String getNameIfPresent() { ... }

 

-. 단일 매개변수(파라미터) 없는 annotation 기호의 첫번째라인에 같이 나타날 있다.

@Override public int hashCode() { ... }

 

-. 필드에 적용된 annotation 또한 documentation block 후에 나타난다. 그러나 경우 다중 annotation 같은 라인에 나타날 있다.

@Partial @Mock DataLoader loader;

 

-. 파라미터, 지역변수 또는 타입에 형식화된 annotation 특별한 룰은 없다.

  1. 주석

/*

 * This is          // And so           /* Or you can

 * okay.            // is this.          * even do this. */

 */

 

  1. 제어자

-. Modifier 순서

à public > protected > private > abstract > static > final > transient > volatile > synchronized > native > strictfp

-. 기타

à 들여쓰기는 스페이스키 2개로 정의한다.

à 문장에는 하나의 statement 만을 쓴다.

à 문장에는 하나의 변수 만을 선언한다.

à 변수 선언은 함수 처음에 하지 않는다. 최대한 변수가 사용되는 위치 근처에서 선언하여 변수의 스코프를 최소화 시킨다.

à 라인의 문자는 80 혹은 100개만 쓴다. 보다 경우 다음 라인에서 작성한다.

  1. 정수

-. 30000000L   à  O             3000000l à  X

  1. Naming
    1. 식별자의 공통규칙
      -. 모든 식별자는 ASCII 숫자값만 사용해야한다.
      -. name_, mName, s_name
      그리고 kName 처럼 특별한 prefix 또는 suffiix 사용되지 않는다
    1. 식별자 Type 의한 규칙
      1. 패키지명은 단순히 연결된 연속단어(밑줄없는), 모두 소문자이다.

패키지명

사용가능여부

com.example.deepspace

O

com.example.deepSpace

X

com.example.deep_space

X

 

  1. 클래스명

-. 클래스명은 UpperCamelCase 작성된다.(대문자로 시작하는 Camel Case)

 

-. 클래스명은 일반적으로 명사 또는 명사구로 된다. 예를 들어Character 또는 

ImmutableList, 인터페이스명 역시 명사 또는 명사구가 있다.(예를 들어, List)

그러나 때때로 대신에 형용사 또는 형용사구가 될 수도 있다(예를 들어, Readable)

 

-. Annotation 유형 명명에 대한 특정 규칙 또는 확립된 규칙은 없다.

-. 테스트 클래스는 테스트 클래스의 이름으로 시작하고, 테스트로 끝나는 이름이 지정된다.

 

예를들어 HashTest 또는 HashIntegrationTest.

 

  1. 메소드명

-. 메소드명은 LowerCamelCase 작성된다.

 

-. 메소드명은 일반적으로 동사 또는 동사구로 된다. 예를들어, sendMessage or stop.

 

-. 밑줄은 이름의 논리적 구성을 분리하기 위한 Junit Test 메소드 명을 나타낸다. 하나의 일반적인 패턴은 test<MethodUnderTest>_<state>, 예를 들어 testPop_emtpyStack. 테스트 메소드명에 하나만의 올바른 법은 없다.

 

  1. 상수명

-. 상수명은 CONSTANT_CASE 사용한다. CONSTANT_CASE : 문자열 전체가 대문자로

표기되고 밑줄에 의해 분리된 단어.

-. 모든 상수는 static final field 이다. 그러나 반드시 static final fields 상수는 아니다.

constant case 선택하기 전에, 필드가 정말로 상수처럼 느껴지는지 고려한다. 예를 들어,

인스턴스의 식별상태가 변경이 된다면, 그것은 확실히 상수가 아니다. 단순히 절대 객체가

변하려는 것은 일반적으로 충분하지 않다.

 

// Constants

static final int NUMBER = 5;

static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");

static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable

static final SomeMutableType[] EMPTY_ARRAY = {};

enum SomeEnum { ENUM_CONSTANT }

 

// Not constants

static String nonFinal = "non-final";

final String nonStatic = "non-static";

static final Set<String> mutableCollection = new HashSet<String>();

static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);

static final Logger logger = Logger.getLogger(MyClass.getName());

static final String[] nonEmptyArray = {"these", "can", "change"};

 

  1. 비상수 필드명

-. 비상수 필드명(static 또는 다른것) LowCamelCase 작성된다.

-. 비상수 필드명은 일반적으로 명사 또는 명사구로 된다.

예를 들면 computedValues 또는 index

  1. 매개변수명(파라미터명)

-. 파라미터명은 LowCamelCase 작성된다.

-. 공용메소드에서 한문자의 파라미터명은 피한다

  1. 지역변수명

-. 지역변수는 LowCamelCase 작성된다.

-. 심지어 Final, immutable, 지역변수는 상수로 간주되지 않으며, 상수처럼 작성될 없다.

  1. 유형변수명(Type valiable names)

-. 유형변수는 두개 스타일( or ) 중 하나로 작성된다.

① 선택적으로 단일 숫자가 붙은 단일 대문자 (such as E, T, X, T2)

② 대문자 T가 붙은, 클래스(5.b.ii, 클래스명)에 사용된 형태의 이름(: RequestT, FooBarT)

  1. Camel Case
    1. 일반 ASCII 문구를 변환하고 아포스트로피를 제거합니다. 예를 들어, "Muller's algorithm" "Mullers algorithm" 된다.
    2. 단어로 나누고 그 사이를 공백으로 나눈다.
    3. 첫번째 문자는 대문자로 하고 나머지를 소문자로 변환한다.
    4. 마지막으로 하나의 식별자로 모든 단어를 합친다.

Prose form

Correct

Incorrect

"XML HTTP request"

XmlHttpRequest

XMLHTTPRequest

"new customer ID"

newCustomerId

newCustomerID

"inner stopwatch"

innerStopwatch

innerStopWatch

"supports IPv6 on iOS?"

supportsIpv6OnIos

supportsIPv6OnIOS

"YouTube importer"

YouTubeImporter

YoutubeImporter*

 

 

  1. 프로그래밍 사례
    1. @Override

-. @Override 방법은 정상적일때마다 @Override annotation으로 표시된다. 이것은 슈퍼클래스 메소드, 인터페이스 메소드를 impliment 하는 클래스 메소드, 슈퍼인터페이스 메소드를 재명시한 인터페이스 메소드를 override하는 클래스메소드를 포함한다.

-. Exception : 상위메소드가 @Deprecated @Override 생략한다.

  1. 예외처리

-. 모든 예외는 무시하지 말고 처리한다. 만약 예외를 처리하지 않을 거면 그 이유에 대해서 명확하게 주석을 달자. 당연히 테스트 코드에서는 필요시 무시해도 된다.

 

-. Catch Block에서 처리하지 못할 , 그 이유는 주석으로 설명한다.

try {

  int i = Integer.parseInt(response);

  return handleNumericResponse(i);

} catch (NumberFormatException ok) {

  // it's not numeric; that's fine, just continue

}

return handleTextResponse(response);

 

-. 예외 : 테스트에서, 만약 그것의 이름이 있거나 예상이 된다면, 예외처리는 주석을 무시해도 된다.

try {

  emptyStack.pop();

  fail();

} catch (NoSuchElementException expected) {

}

 

  1. Static 멤버 접근
    -. Static 클래스 멤버에 대한 참조가 가능해야만 , 그것은 클래스Type 참조 또는 표현이 아닌 클래스의 이름을 규정한다.

 

 

Foo aFoo = ...;

Foo.aStaticMethod(); // good

aFoo.aStaticMethod(); // bad

somethingThatYieldsAFoo().aStaticMethod(); // very bad

 

  1. Javadoc
    1. Formatting
      1. 일반적인 형태
        -. Javadoc 영역의 기본 형식은 아래 예제와 같이 보여진다.

/**

 * Multiple lines of Javadoc text are written here,

 * wrapped normally...

 */

public int method(String p1) { ... }

 

…. 또는 한줄 형식 예제

/** An especially short bit of Javadoc. */

 

 

 

/**

 * JavaDoc 테스트 클래스입니다

 *

 * @author Je

 */ 

public class JavaDoc { 

   

    /**

     * 곱셈을 합니다.

     *

     * @param a

     * @param b

     * @return int

     */ 

    public int multiply(int a, int b){ 

        return a * b; 

    } 

}

 

-. /** 다음은 공백이다.

-. 문단과 문단 사이에는 공백라인이 들어가고 @ 시작하기 전에도 공백라인이 들어간다.

-. @param, @return, @throws, @deprecated 순으로 사용한다. 설명은 무조건 기술해야 하며 한

문장을 넘어가면 4 이상의 스페이스로 들여쓰기 한다.

 

-. 최소한 public class public 혹은 protected 멤버에는 javadoc 기술하는 것이 좋다. 그리고 주석의 경우 모두 javadoc 타입으로 다는 것을 추천한다.


고양시 삼송동 맛집 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 삼송맛집 어선당 삼송점 

'Java & Html' 카테고리의 다른 글

[Java] 10진수 <> 2진수, 8진수, 16진수 변환  (0) 2019.04.10
Eclipse에 FindBugs 설치  (0) 2016.11.01
코드를 메모리에 올려 사용하자  (0) 2016.01.27
Spring Transaction  (0) 2015.12.27
JSP 커스텀 태그(Custom Tag)  (0) 2015.07.07