diff --git "a/3\354\243\274\354\260\250/\354\236\220\353\260\224 \352\270\260\354\264\210.md" "b/3\354\243\274\354\260\250/\354\236\220\353\260\224 \352\270\260\354\264\210.md" new file mode 100644 index 00000000..e8ad5c74 --- /dev/null +++ "b/3\354\243\274\354\260\250/\354\236\220\353\260\224 \352\270\260\354\264\210.md" @@ -0,0 +1,290 @@ +# [Java] Java 기초(2) +## 1. 기본형 타입(Primitive type)과 참조형 타입(Reference type) +### 1-1. 기본형 타입(Primitive type) +- 총 8가지의 기본형 타입을 미리 정의하여 제공한다. +- 기본값이 있기 때문에 **Null**이 존재하지 않는다. + (만약 기본형 타입에 Null을 넣고 싶다면 **래퍼 클래스**를 활용한다. +- **실제 값**을 저장하는 공간으로 **스택(Stack)** 메모리에 저장된다. +- 만약 컴파일 시점에 담을 수 있는 크기를 벗어나 에러를 발생시키는 컴파일 에러가 발생한다. 주로 문법상의 에러가 많다. + ex) 세미콜론(;)을 안붙였다는 이유로 빨간 줄이 쳐지는 경우 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
타입할당되는 메모리 크기기본값데이터의 표현 범위
boolean논리형1 bytefalsetrue, false
byte정수형1 byte0-128 ~ 127
short정수형2 byte0-32,768 ~ 32,767
int(기본)정수형4 byte0-2,147,483,648 ~ 2,147,483,647
long정수형8 byte0L-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float실수형4 byte0.0F(3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
double(기본)실수형8 byte0.0(1.7 X 10-308) ~ (1.7 X 10308) 의 근사값
char문자형2 byte(유니코드)'\u0000'0 ~ 65,535
+ +### 1-2. 참조형 타입(Reference type) +- 기본형 타입을 제외한 타입들이 모두 참조형 타입이다. +- 빈 객체를 의미하는 Null이 존재한다. +- 값이 저장되어 있는 곳의 **주소값**을 저장하는 공간으로 **힙(Heap)** 메모리에 저장된다. +- 문법상으로는 에러가 없지만, 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. + ex) 객체나 배열을 Null 값으로 받으면 NulloPointException이 발생하므로 변수값을 넣어야 한다. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
타입기본값할당되는 메모리 크기
배열(Array)Null4 byte(객체의 주소값)
열거(Enumeration)Null4 byte(객체의 주소값)
클래스(Class)Null4 byte(객체의 주소값)
인터페이스(Interface)Null4 byte(객체의 주소값)
+ +## 2. 리터럴(Literal) +리터럴은 변수에 넣는 변하지 않는 **데이터** 자체를 의미한다. +보통은 기본형의 데이터를 의미하지만, 특정 객체(Immutable class, VO class)에 한해서는 리터럴이 될 수 있다. + +## 3. 변수의 선언 및 초기화 +변수(Variable)는 데이터를 저장하는 메모리 영역을 의미한다. +변수는 수시로 값이 변경될 수 있으며 하나의 값만 저장할 수 있다. +> ### 상수(Constant) +> **변하지 않는 변수**를 의미한다. +> **final** 키워드로 선언하며, 대문자로 주로 표기한다. + +### +자바의 변수는 다음과 같은 종류로 구분할 수 있다. +- 인스턴스 변수 : 클래스 선언시 ```static```키워드 없이 선언된 필드. 이 필드는 인스턴스 별로 다른 값을 가질 수 있기 때문에 인스턴스 변수라고 불린다. +- 클래스 변수 : 클래스 선언시 ```static```키워드와 함께 선언된 필드. 이 필드는 모든 인스턴스들이 공유하는 값이다. 클래스 명으로 접근이 가능하고, 클래스 하나에 한 값이기 때문에 클래스 변수라고 불린다. +- 로컬 변수 : 메소드 선언 사이에 등장하는 변수로 다른 클래스에서 접근할 수 없는 변수. 메소드 영역에서만 임시로 사용되는 변수이다. +- 매개 변수 : 매개 변수는 메소드의 인자로 전달되는 변수를 의미한다. + +인스턴스 변수와 클래스 변수는 멤버 변수라고 통칭하기도 한다. 멤버 변수는 꼭 초기화를 해주지 않더라도 기본값으로 초기화되지만, 로컬 변수는 반드시 초기화를 해주어야 한다. + +```java +class Variables { + int instanceVar; // 0으로 초기화되는 인스턴스 변수 + static int classVar; // 0으로 초기화되는 클래스 변수 + int initInstanceVar = 10; // 명시적으로 초기화 + static int initClassVar = 10; // 명시적으로 초기화 + + void method(int num) { // 매개변수는 초기화 할 수 없고, 전달받는 값을 사용만 할 수 있음 + int a; // 선언은 가능 + // int b = a; 자동으로 초기화 되지 않으므로 동작하지 않음 + a = 10; // 선언을 미리 해줬다면 이렇게 초기화 가능 + int b = a; // 선언과 동시에 초기화 + } +} +``` + +## 4. 변수의 스코프와 라이프타임 +### 4-1. 스코프(Scope) +스코프는 변수가 유효한 범위를 의미한다. + +### 4-2. 라이프타임(LifeTime) +라이프타임은 변수가 메모리에서 살아있는 기간을 의미한다. +
+ +|변수 타입|스코프|라이프타임| +|:---:|---|---| +|인스턴스변수|클래스 전체(static 블록과 static 메소드 제외)|객체가 생성되고 객체가 메모리에 살아있는 동안| +|클래스변수|클래스 전체|클래스가 초기화되고 프로그램이 끝날 때까지 +|로컬변수|변수가 선언된 블록 내부|변수 선언 이후부터 블록을 벗어날 때까지| + +## 5. 타입 변환, 캐스팅 그리고 타입 프로모션 +타입 변환은 어떤 값이나 변수의 타입을 다른 타입으로 변경하는 것이다. +이 때 타입은 **확장(자동 형변환)**과 **축소(명시적 형변환)**두 가지 방향으로 변환될 수 있다. +### 5-1. 확장, 자동 형변환 +확장은 다음 조건에서 두 데이터 타입이 자동으로 변환되는 경우이다. + +1. 두 데이터 타입은 호환되어야 한다. +2. 더 작은 데이터 타입의 값을 더 큰 범위의 타입에 할당할 때만 동작한다. + (바이트 크기가 아닌 표현 가능한 값의 범위) + +자바에서의 숫자 타입은 ```byte -> short -> int -> long -> float -> double``` 순으로 자동 형변환이 된다. + +### 5-2. 축소, 명시적 형변환(Casting) +축소는 더 큰 범위의 타입의 값을 더 작은 범위의 타입에 할당하기 위해서 형변환을 명시해주어야 한다. +또, 확장과 달리 호환되지 않는 데이터 타입에도 사용할 수 있다. + +```(타겟 타입) 값or변수```로 강제로 형변환을 할 수 있다. +```java +void 명시적_형변환() { + // 동작하지 않는 코드 + char ch = 'c'; + int num = 88; + ch = num; + + // 동작하기 위해선 아래와 같이 수행해야 합니다. + ch = (char) num; +} +``` + +### 5-3. 타입 프로모션 +타입 프로모션은 식을 평가할 때 중간에 피연산자의 범위를 초과할 수 있기 때문에 자동으로 값이 승격되는 것을 의미한다. + +- Java에서는 ```byte```, ```short```, ```char```를 식 평가시 자동으로 ```int```로 프로모션 된다. +- 피연산자가 ```long```, ```float```, ```double```인 경우 전체 표현식이 각각 ```long```, ```float```, ```double```로 프로모션된다. + +```java +void 타입_프로모션() { + byte b = 42; + char c = 'a'; + short s = 1024; + int i = 50000; + float f = 5.67f; + double d = .1234; + + // 표현식(명시적 형변환 없이 자동으로 형변환 되며, 값은 피연산자의 타입으로 프로모션 됩니다.) + double result = (f * b) + (i / c) - (d * s); +} +``` + +## 6. 1차원 및 2차원 배열 선언하기 +### 6-1. 1차원 배열 선언 +```java +int[] intArr1; +int []intArr2; // 권장하지 않음 +int intArr3[]; // 권장하지 않음 +``` +셋 다 가능하지만, 가장 위의 스타일이 선호된다. + +### 6-2. 1차원 배열 초기화 +```java +int[] intArr1 = new int[10]; +``` +위와 같이 선언하면, 해당 크기만큼의 배열의 요소가 초기화되어 생성된다. +배열의 각 요소에는 인덱스로 접근할 수 있다. + +또한 다음과 같이 초기화할 수도 있다. +```java +int[] anArray = { + 100, 200, 300, + 400, 500, 600, + 700, 800, 900, 1000 +}; + +int[] anArray = new int[] {100, 200, 300}; +``` +이런 경우 배열의 길이는 중괄호 사이에 선언된 요소의 수로 결정된다. +Java는 배열도 객체이기 때문에 힙 영역에 배열이 생성되며, ```new```라는 키워드를 써줘야 한다. + +### 6-3. 2차원 배열 선언 +```java +int[][] ints; +``` +위와 같이 선언할 수 있다. 또한 Java에서의 다차원 배열은 **요소 자체가 배열**인 배열이다. +각 요소 배열간 길이는 다를 수 있다. + +### 6-4. 2차원 배열 초기화 +```java +String[][] names = { + { "Mr.", "Mrs.", "Ms." }, + { "Smith", "Jones" } +}; +// 각 배열 요소의 길이는 초기화시에 지정을 해주지 않아도 됩니다. 단, null로 초기화됩니다. +String[][] names2 = new String[10][]; + +// 혹은 지정해줄 수도 있습니다. 이 경우 같은 크기를 가지게 됩니다. 이 경우 배열이 초기화 됩니다. +String[][] names3 = new String[10][10]; +``` +이차원 배열도 마찬가지로 요소의 인덱스로 접근할 수 있다. + +> 배열의 크기는 ```length``` 속성으로 알 수 있다. 그리고 배열은 한번 초기화하고 나면 변경할 수 없다. + +## 7. 타입 추론, var +```var``` 키워드는 로컬 변수의 타입 추론이라고 한다. +이 키워드의 사용은 반복되는 타입 선언을 줄여주고, 코드의 가독성을 높여준다. +이는 컴파일러가 데이터의 타입을 추론해낼 수 있기 때문이다. + +```java +var num = 3; +``` +```3```은 ```int``` 타입을 반환하기 때문에 로컬 변수 ```num```은 ```int``` 타입임을 추론할 수 있다. + +이렇게 이미 타입이 정의되었기 때문에 ```var```는 다른 타입의 재할당을 허용하지 않는다. + +- ```var```를 사용할 수 없는 경우 + 1. 필드 혹은 메소드 시그니처에서 사용이 불가능하다. 지역 변수에만 사용할 수 있다. + 2. 명시적인 초기화없이 ```var```만 단독으로 선언할 수 없다. + 3. ```var``` 변수는 ```null```로 초기화할 수 없다. + 4. 람다식과 ```var```는 명시적으로 타겟이 되는 타입을 알아야 하기 때문에 같이 사용할 수 없다. +- 주의해야할 ```var``` 선언 + ```java + var list = new ArrayList<>(); + ``` + 이 코드는 컴파일되지만, 실제 ```list```의 타입은 ```ArrayList```로 컴파일되며, 제네릭의 이점을 얻지 못하기 때문에 피하는 것이 좋다. + +타입 추론은 가독성을 높일 수 있는 경우와 그것을 사용한 것이 유용한 경우에만 선택적으로 사용해야한다. + +이 말의 의미는 편하게 코드를 작성하기 위해 ```var```를 쓰는 것이 아니라, 가독성을 높이는 목적으로 사용해야 한다는 의미이다. + +```var```의 유형을 개발자가 추적할 수 없거나 어려운 경우에는 ```var```를 사용하지 않는 것이 좋다. \ No newline at end of file diff --git "a/3\354\243\274\354\260\250/\354\236\220\353\260\224 \354\275\224\353\223\234 \354\273\250\353\262\244\354\205\230.md" "b/3\354\243\274\354\260\250/\354\236\220\353\260\224 \354\275\224\353\223\234 \354\273\250\353\262\244\354\205\230.md" new file mode 100644 index 00000000..f82780c5 --- /dev/null +++ "b/3\354\243\274\354\260\250/\354\236\220\353\260\224 \354\275\224\353\223\234 \354\273\250\353\262\244\354\205\230.md" @@ -0,0 +1,374 @@ +# [Java] Java Code Convention +## 1. 이름(Naming) +### 1-1. 식별자에는 영문/숫자/언더스코어만 허용 +변수명, 클래스명, 메소드명 등에는 영어와 숫자만을 사용한다. +상수에는 단어 사이의 구분을 위해 언더스코어(_)를 사용한다. + +### 1-2. 한국어 발음대로의 표기 금지 +식별자의 이름을 한글 발음을 영어로 옮겨서 표기하지 않는다. 한국어 고유명사는 예외이다. +- 좋은 예: ```intangibleAssets``` (무형자산) +- 나쁜 예: ```moohyungJasan``` (무형자산) + +### 1-3. 대문자로 표기할 약어 명시 +클래스명, 변수명에 쓰일 단어 중 모든 글자를 대문자로 표기할 약어의 목록을 프로젝트별로 명시적으로 정의한다. + +약어의 대소문자 표기는 JDK의 클래스나 라이브러리들 사이에서도 일관된 규칙이 없다. 그러나 단일 프로젝트에서 규칙이 명확하지 않으면 같은 단어의 조합을 다른 이름으로 표기할 수 있어서 혼동을 유발한다. + +그래서 기본 정책으로는 약어의 중간단어를 소문자로 표기하고 프로젝트별로 모두 대문자로 표기할 약어의 목록을 명시하는 방식이 가독성을 높이고 규칙을 단순화하는데 유리하다. +- 좋은 예 + HTTP + API + URL의 클래스 이름의 경우 + - 대문자로 표기할 약어의 목록을 정의하지 않는 경우: ```HttpApiUrl``` + - API만 대문자로 표기할 약어의 목록에 있을 경우: ```HttpAPIUrl``` + - HTTP, API, URL이 대문자로 표기할 약어의 목록에 있을 경우: ```HTTPAPIURL``` + +### 1-4. 패키지 이름은 소문자로 구성 +패키지 이름은 소문자를 사용하여 작성한다. +단어별 구문을 위해 언더스코어(_)나 대문자를 섞지 않는다. +- 좋은 예 +```java +package com.javastudy.thirdassignment +``` +- 나쁜 예 +```java +package com.javastudy.thirdAssignment +package com.javastudy.third_assignment +``` + +### 1-5. 클래스/인터페이스 이름에 대문자 카멜표기법 적용 +클래스 이름은 단어의 첫 글자를 대문자로 시작하는 대문자 카멜표기법(Upper camel case)을 사용한다. 파스칼표기법(Pascal case)으로도 불린다. +- 좋은 예 +```java +public class Reservation + +public class AccessToken +``` +- 나쁜 예 +```java +public class reservation + +public class Accesstoken +``` + +### 1-6. 클래스 이름에 명사 사용 +클래스 이름은 명사나 명사절로 짓는다. + +### 1-7. 인터페이스 이름에 명사/형용사 사용 +인터페이스의 이름은 명사/명사절로 혹은 형용사/형용사절로 짓는다. +- 좋은 예 +```java +public interface RowMapper { + +public interface AutoClosable { +``` + +### 1-8. 테스트 클래스는 'Test'로 끝남 +JUnit 등으로 작성한 테스트 코드를 담은 클래스는 'Test'을 마지막에 붙인다. +- 좋은 예 +```java +public class WatcherTest { +``` + +### 1-9. 메소드 이름에 소문자 카멜표기법 적용 +메소드의 이름에는 첫 번째 단어를 소문자로 작성하고, 이어지는 단어의 첫 글자를 대문자로 작성하는 소문자 카멜표기법(Lower camel case)를 사용한다. +테스트 클래스의 메소드 이름에서는 언더스코어(_)를 허용한다. + +### 1-10. 메소드 이름은 동사/전치사로 시작 +메소드명은 기본적으로는 동사로 시작한다. 다른 타입으로 전환하는 메소드나 빌더 패턴을 구현한 클래스의 메소드에는 전치사를 쓸 수 있다. +- 좋은 예 + - 동사 사용: ```renderHtml()``` + - 전환메소드의 전치사: ```toString()``` + - Builder 패턴 적용한 클래스의 메소드의 전치사: ```withUserId(String id)``` + +### 1-11. 상수는 대문자와 언더스코어로 구성 +상태를 가지지 않는 자료형이면서 ```static final```로 선언되어 있는 필드일 때를 상수로 간주한다. +상수 이름은 대문자로 작성하며, 복합어는 언더스코어(_)를 사용하여 구분한다. +- 좋은 예 +```java +public final int UNLIMITED = -1; +public final String POSTAL_CODE_EXPRESSION = "POST"; +``` + +### 1-12. 변수에 소문자 카멜표기법 적용 +상수가 아닌 클래스의 멤버변수/지역변수/메소드 파라미터에는 소문자 카멜표기법(Lower camel case)을 사용한다. +- 좋은 예 +```java +private boolean authorized; +private int accessToken; +``` +- 나쁜 예 +```java +private boolean Authorized; +private int AccessToken; +``` + +### 1-13. 임시 변수 외에는 1 글자 이름 사용 금지 +메소드 블럭 범위 이상의 생명 주기를 가지는 변수에는 1글자로 된 이름을 쓰지 않는다. +반복문의 인덱스나 람다 표현식의 파라미터 등 짧은 범위의 임시 변수에는 관례적으로 1글자 변수명을 사용할 수 있다. +- 좋은 예 +```java +HtmlParser parser = new HtmlParser(); +``` +- 나쁜 예 +```java +HtmlParser p = new HtmlParser(); +``` + +## 2. 선언(Declarations) +### 2-1. 소스파일당 1개의 탑레벨 클래스 담기 +탑레벨 클래스는 소스파일에 1개만 존재해야 한다. +굳이 한 파일 안에 선언해야 한다면 내부 클래스로 선언한다. + +### 2-2. static import에만 와일드 카드 허용 +클래스를 import할 때는 와일드카드(*)없이 모든 클래스명을 다 쓴다. +static import에서는 와일드카드를 허용한다. + +### 2-3. 제한자 선언의 순서 +클래스/메소드/멤버변수의 제한자는 Java Language Specification에서 명시한 아래의 순서로 쓴다. +```public protected private abstract static final transient volatile synchronized native strictfp``` + +### 2-4. 애너테이션 선언 후 새줄 사용 +클래스, 인터페이스, 메소드, 생성자에 붙는 애너테이션은 선언 후 새줄을 사용한다. 이 위치에서도 파라미터가 없는 애너테이션 1개는 같은 줄에 선언할 수 있다. +- 좋은 예 +```java +@RequestMapping("/guests") +public void findGuests() {} +``` +- 좋은 예 +```java +@Override public void destroy() {} +``` + +### 2-5. 한 줄에 한 문장 +문장이 끝나는 ```;``` 뒤에는 새 줄을 삽입한다. + +### 2-6. 하나의 선언문에는 하나의 변수만 +변수 선언문은 한 문장에서 하나의 변수만을 다룬다. + +### 2-7. 배열에서 대괄호는 타입 뒤에 선언 +배열 선언에 오는 대괄호([])는 타입의 바로 뒤에 붙인다. 변수명 뒤에 붙이지 않는다. + +### 2-8. 'long'형 값의 마지막에 'L' 붙이기 +long형의 숫자에는 마지막에 대문자'L'을 붙인다. + +### 2-9. 특수 문자의 전용 선언 방식을 활용 +```\b```, ```\f```, ```\n```, ```\r```, ```\t```, ```\```, ```\\```와 같이 특별히 정의된 선언 방식이 있는 특수 문자가 있다. 이런 문자들은 숫자를 이용한 ```\008```이나 ```\u008```와 같은 숫자를 넣은 선언보다 전용 방식을 활용한다. +- 좋은 예 +```java +System.out.println("---\n---"); +``` +- 나쁜 예 +```java +System.out.println("---\012---"); +``` + +## 3. 들여쓰기(Indentation) +### 3-1. 하드탭 사용 +탭(tab) 문자를 사용하여 들여쓴다. 탭 대신 스페이스를 사용하지 않는다. + +### 3-2. 탭의 크기는 4개의 스페이스 +1개의 탭의 크기는 스페이스 4개와 같도록 에디터에서 설정한다. + +### 3-3. 블록 들여쓰기 +클래스, 메소드, 제어문 등의 코드 블록이 생길 때마다 1단계를 더 들여쓴다. + +## 4. 중괄호(Braces) +### 4-1. K&R 스타일로 중괄호 선언 +클래스 선언, 메소드 선언, 조건/반복문 등의 코드 블록을 감싸는 중괄호에 적용되는 규칙이다. 중괄호 선언은 K&R 스타일(Kernighan and Ritchie style)을 따른다. +줄의 마지막에서 시작 중괄호 '{'를 쓰고 열고 새 줄을 삽입한다. 블록을 마친 후에는 새 줄 삽입 후 중괄호를 닫는다. + +### 4-2. 닫는 중괄호와 같은 줄에 else, catch, finally, while 선언 +아래의 키워드는 닫는 중괄호 (})와 같은 줄에 쓴다. +- else +- catch, finally +- do-while 문에서의 while + +### 4-3. 빈 블록에 새 줄 없이 중괄호 닫기 허용 +내용이 없는 블록을 선언할 때에는 같은 줄에서 중괄호 닫는 것을 허용한다. + +### 4-4. 조건/반복문에는 중괄호 필수 사용 +조건, 반복문이 한 줄로 끝나더라도 중괄호를 활용한다. + +## 5. 줄바꿈(Line-wrapping) +### 5-1. 최대 줄 너비는 120 +최대 줄 사용 너비는 120자까지 가능하다. + +### 5-2. package, import 선언문은 한 줄로 +```package```, ``ìmport`` 선언문 중간에서는 줄을 바꾸지 않는다. 최대 줄 수를 초과하더라도 한 줄로 쓴다. + +### 5-3. 줄바꿈 후 추가 들여쓰기 +줄바꿈 이후 이어지는 줄에서는 최초 시작한 줄에서보다 적어도 1단계의 들여쓰기를 더 추가한다. + +- 좋은 예 +```java +AbstractAggregateRootTest.AggregateRoot proxyAggregateRoot = + em.getReference(AbstractAggregateRootTest.AggregateRoot.class, aggregateRoot.getId()); +``` + +### 5-4. 줄바꿈 허용 위치 +가독성을 위해 줄을 바꾸는 위치는 다음 중 하나로 한다. +- ```extend``` 선언 후 +- ```implements``` 선언 후 +- ```throws``` 선언 후 +- 시작 소괄호(()) 선언 후 +- 콤마(,) 후 +- 마침표(.) 전 +- 연산자 전 + - +, -, *, /, % + - ==, !=, >=, >, <=, <, &&, || + - &, |, ^, >>>, >>, <<, ? + - ```instanceof``` + +## 6. 빈줄(Blank lines) +### 6-1. package 선언 후 빈 줄 삽입 +package를 선언한 후 빈 줄을 삽입한다. + +### 6-2. import 선언의 순서와 빈 줄 삽입 +import 구절은 아래와 같은 순서로 그룹을 묶어서 선언한다. + +1. ```static imports``` +2. ```java.``` +3. ```javax.``` +4. ```org.``` +5. ```net.``` +6. 8~10을 제외한 ```com.*``` +7. 1~6, 8~10을 제외한 패키지에 있는 클래스 +8. ```com.nhncorp.``` +9. ```com.navrcorp.``` +10. ```com.naver.``` + +각 그룹 사이에는 빈 줄을 삽입한다. +각 그룹 내에서는 알파벳 순으로 정렬한다. + +- 좋은 예 +```java +import java.util.Date; +import java.util.List; + +import javax.naming.NamingException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.util.Assert; + +import com.google.common.base.Function; + +import com.naver.lucy.util.AnnotationUtils; +``` + +### 6-3. 메소드 사이에 빈 줄 삽입 +메소드의 선언이 끝난 후 메소드 선언이 시작되기 전에 빈 줄을 삽입한다. + +## 7. 공백(Whitespace) +### 7-1. 공백으로 줄을 끝내지 않음 +빈 줄을 포함하여 모든 줄은 탭이나 공백으로 끝내지 않는다. + +### 7-2. 대괄호 뒤에 공백 삽입 +닫는 대괄호(]) 뒤에 ';'으로 문장이 끝나지 않고 다른 선언이 올 경우 공백을 삽입한다. + +### 7-3. 중괄호의 시작 전, 종료 후에 공백 삽입 +여는 중괄호({) 앞에는 공백을 삽입한다. +닫는 중괄호(}) 뒤에 ```else```, ```catch``` 등의 키워드가 있을 경우 중괄호와 키워드 사이에 공백을 삽입한다. + +### 7-4. 제어문 키워드와 여는 소괄호 사이에 공백 삽입 +```if```, ```for```, ```while```, ```catch```, ```synchronized```, ```switch```와 같은 제어문 키워드의 뒤에 소괄호(())를 선언하는 경우, 시작 소괄호 앞에 공백을 삽입한다. + +### 7-5. 식별자와 여는 소괄호 사이에 공백 미삽입 +식별자와 여는 소괄호(() 사이에는 공백을 삽입하지 않는다. 생성자와 메소드의 선언, 호출, 애너테이션 선언 뒤에 쓰이는 소괄호가 그에 해당한다. +- 좋은 예 +```java +public StringProcessor() {} // 생성자 + +@Cached("local") +public String removeEndingDot(String original) { + assertNotNull(original); + ... +} +``` +- 나쁜 예 +```java +public StringProcessor () {} // 생성자 + +@Cached ("local") +public String removeEndingDot (String original) { + assertNotNull (original); + ... +} +``` + +### 7-6. 타입 캐스팅에 쓰이는 소괄호 내부 공백 미삽입 +타입캐스팅을 위해 선언한 소괄호의 내부에는 공백을 삽입하지 않는다. + +### 7-7. 제네릭스 산괄호의 공백 규칙 +제네릭스(Generics) 선언에 쓰이는 산괄호(<>) 주위의 공백은 다음과 같이 처리한다. +- 제네릭스 메소드 선언일 때만 ```<``` 앞에 공백을 삽입한다. +- ```<``` 뒤에 공백을 삽입하지 않는다. +- ```>``` 앞에 공백을 삽입하지 않는다. +- 아래의 경우를 제외하고는 ```>``` 뒤에 공백을 삽입한다. + - 메소드 레퍼런스가 바로 이어질 때 + - 여는 소괄호(()가 바로 이어질 때 + - 메소드 이름이 바로 이어질 때 +- 좋은 예 +```java +public static A find(AnnotatedElement elem, Class type) { // 제네릭스 메서드 선언 + List l1 = new ArrayList<>(); // '(' 가 바로 이어질때 + List l2 = ImmutableList.Builder::new; // 메서드 레퍼런스가 바로 이어질 때 + int diff = Util.compare(l1, l2); // 메서드 이름이 바로 이어질 때 +} +``` + +### 7-8. 콤마/구분자 세미콜론의 뒤에만 공백 삽입 +콤마(,), 반복문(while, for)의 구분자로 쓰이는 세미콜론(;) 뒤에만 공백을 삽입한다. + +### 7-9. 콜론의 앞 뒤에 공백 삽입 +반복문과 삼항연산자에서는 콜론(:)의 앞 뒤에는 공백을 삽입한다. 라벨 선언 뒤에는 아무런 문자열이 없으므로 앞에만 공백을 삽입한다. +- 좋은 예 +```java +for (Customer customer : visitedCustomers) { + AccessPattern pattern = isAbnormal(accessLog) ? AccessPattern.ABUSE : AccessPattern.NORMAL; + int grade = evaluate(customer, pattern); + + switch (grade) { + case GOLD : + sendSms(customer); + case SILVER : + sendEmail(customer); + default : + inreasePoint(customer) + } +} +``` + +### 7-10. 이항/삼항 연산자의 앞 뒤에 공백 삽입 +이항/삼항 연산자의 앞 뒤에는 공백을 삽입한다. +- 좋은 예 +```java +f (pattern == Access.ABNORMAL) { + return 0; +} + +finalScore += weight * rawScore - absentCount; + +if (finalScore > MAX_LIMIT) { + return MAX_LIMIT; +} +``` + +### 7-11. 단항 연산자와 연산 대상 사이에 공백을 미삽입 +단항 연산자와 연산 대상의 사이에는 공백을 삽입하지 않는다. +- 전위 연산자 : 연산자 뒤에 공백을 삽입하지 않는다. + - 전위 증가/감소 연산자 : ++, -- + - 부호로 쓰이는 +, - + - NOT 연산자 : ~. ! +- 후위 연산자 : 연산자 앞에 공백을 삽입하지 않는다. + - 후위 증가/감가 연산자 : ++, -- + +### 7-12. 주석문 기호 전후의 공백 삽입 +주석의 전후에는 아래와 같이 공백을 삽입한다. +- 명령문과 같은 줄에 주석을 붙일 때 ```//``` 앞 +- 주석 시작 기호 ```//``` 뒤 +- 주석 시작 기호 ```/*``` 뒤 +- 블록 주석을 한 줄로 작성시 종료 기호 ```*/``` 앞 + +


+ +참고 : [캠퍼스 핵데이 Java 코딩 컨벤션](https://naver.github.io/hackday-conventions-java/) \ No newline at end of file diff --git a/README.md b/README.md index e0939477..c2d584ae 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,37 @@ # 2021-Java-Study -백기선님의 [라이브스터디](https://github.com/whiteship/live-study) 에 영감을 받아 진행하게 된 스터디입니다. +백기선님의 [라이브스터디](https://github.com/whiteship/live-study) 에 영감을 받아 진행하게 된 스터디입니다. ## 진행 방법 약 1달 간, 대면으로 진행하고, 이후 진행은 issues를 통해 진행합니다. ## 목표: 자바와 친해지기 새로운 언어를 시작하긴 쉽지 않습니다. -그렇기 때문에 기본 문법을 먼저 시작하는 것이 언어를 이해하는 데 큰 영향을 미칩니다. -**하지만** 이번 스터디에선 새로운 언어에 대한 두려움(문법을 모두 이해해야 한다는 무서움)을 없애고, 재미를 가지는 것에 조금 더 집중 할 것입니다. +그렇기 때문에 기본 문법을 먼저 시작하는 것이 언어를 이해하는 데 큰 영향을 미칩니다. +**하지만** 이번 스터디에선 새로운 언어에 대한 두려움(문법을 모두 이해해야 한다는 무서움)을 없애고, 재미를 가지는 것에 조금 더 집중 할 것입니다. ## 결과 ### 1주차 + +DongLee99: [https://github.com/Learning-Now/2021-Java-Study/pull/2](https://github.com/Learning-Now/2021-Java-Study/pull/2) + +Jeongyun: [https://github.com/Learning-Now/2021-Java-Study/pull/3](https://github.com/Learning-Now/2021-Java-Study/pull/3) + +BLINK-ONCE: [https://github.com/Learning-Now/2021-Java-Study/pull/4](https://github.com/Learning-Now/2021-Java-Study/pull/4) + +dustndus8: [https://github.com/Learning-Now/2021-Java-Study/pull/5](https://github.com/Learning-Now/2021-Java-Study/pull/5) + +dbswl067: [https://github.com/Learning-Now/2021-Java-Study/pull/6](https://github.com/Learning-Now/2021-Java-Study/pull/6) + +### 2주차 +DongLee99: [https://velog.io/@donglee99/2주차-과제-JAVA-코드-둘러보기](https://velog.io/@donglee99/2%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C-JAVA-%EC%BD%94%EB%93%9C-%EB%91%98%EB%9F%AC%EB%B3%B4%EA%B8%B0) + +Jeongyun: [https://github.com/jeongyuneo/2021-Java-Study/tree/jeongyun](https://github.com/jeongyuneo/2021-Java-Study/tree/jeongyun) + +BLINK-ONCE: [https://github.com/BLINK-ONCE/2021-java-study-HW/tree/main/2주차](https://github.com/BLINK-ONCE/2021-java-study-HW/tree/main/2%EC%A3%BC%EC%B0%A8) + +dustndus8: [https://github.com/BLINK-ONCE/2021-java-study-HW/tree/main/2주차](https://github.com/BLINK-ONCE/2021-java-study-HW/tree/main/2%EC%A3%BC%EC%B0%A8) + +dbswl067:: [https://github.com/dbswl067/2021-java-a/tree/main/2주차 과제](https://github.com/dbswl067/2021-java-a/tree/main/2%EC%A3%BC%EC%B0%A8%20%EA%B3%BC%EC%A0%9C) + +### 3주차