Java Code Convention 이 무엇이고 왜 필요한가
자바 코드 컨벤션
파일 형태 | 확장자 |
---|---|
자바 소스 | .java |
자바 바이트 코드 | .class |
파일 이름 | 사용 |
---|---|
GNUmakefile make | 파일 이름으로 사용, 소프트웨어를 빌드 할 때 gnumake 명령어 사용 |
README | 특정 디렉토리의 내용을 요악하는 파일 이름으로 사용 |
클래스 명, 변수명에 쓰일 단어중 모든 글자를 대문자로 표기할 약어 목록을 프로젝트별로 명시적으로 정의 한다.(간단하게 말하면 약어 목록에 정리가 되어있는 약어가 아니면 약어의 앞의 문자만 대문자로 표기하고 나머지는 소문자로 표기한다
글로만 봤을 때 바로 이해가 안돼서 바로 예를 보면
1. 대문자로 표기될 약어 목록 정의 X => HttpApiUrl
2. API 만 약어목록 정의 => HttpAPIUrl
package com.donglee99.javastudy
public class Donglee99{
}
public class Sum{
}
public interface Donglee99{
}
public class PostsApiControllerTest{
}
toString() renderHtml()
public final int UNLIMITED = -1;
public final String POSTAL_CODE_EXPERESSION = "POST";
private int authorized;
private String accessToken;
클래스, 필드, 메서드 import등의 소스 구성요소 선언시 규칙
public class Donglee99{
class Dong99{
}
}
wild card = * 를 의미하며 클래스 import 시 static import 가 아니라면 와일드 카드를 사용하지 않는다.
import java.util.List;
import java.util.Scanner;
import java.util.*; ==> X
int a = 9;
int b = 1;
int a,b => x
int a;
int b;
int [] arr; ==> 맞는 표현
int arr []; ==> 틀린 표현
이말은 예로 보는게 편하다
if(i==a)
{
cnt++;
} ==> X
if(i==a) {
cnt++;
} ==> o
바로 예를 보면
if (i == a) {
}
else if {
}
else if {
} ==> 틀린 표현
if (i == a) {
} else if {
} else if {
} ==> 맞는 표현
public void Donglee99() {}
if (i == a) return false; ==> X
if (i == a) {
return false;
} ==> O
작성한 명령어의 길이가 너무 길어 가독성이 떨어지게 됨을 방지 하기위한 규칙이다
extend
,implements
,throws
,(()
,(,)
선언후 ,.
전, 연산자 전)빈 줄은 명령문 그룹의 영역을 표시하기 위해 사용
package
선언후 빈줄 삽입 ( 패키지 선언후 한줄 띄기)
import
선언의 순서와 빈 줄 삽입
java.
javax.
org.
net.
com.nhncorp
com.navercorp.
com.naver.
메소드 사이에 빈줄 삽입
@PostMapping("/api/v1/posts")
public Long save(@RequestBody PostsSaveRequestDto requestDto) {
return postsService.save(requestDto);
}
int a = (int)b;
>
앞<
뒤로 공백 사용 Xpublic static <A extends Annotation> A find(AnnotatedElement elem, Class<A> type) { // 제네릭스 메서드 선언
List<Integer> l1 = new ArrayList<>(); // '(' 가 바로 이어질때
List<String> l2 = ImmutableList.Builder<String>::new; // 메서드 레퍼런스가 바로 이어질 때
int diff = Util.<Integer, String>compare(l1, l2); // 메서드 이름이 바로 이어질 때
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
타입 이란?
프로미티브 타입 이란?
타입 | 설명 | 사이즈 | 값의 범위 | 기본 값 |
---|---|---|---|---|
byte | 부호 있는 정수값 | 8bit | -128 ~ 127 | 0 |
short | 부호 있는 정수값 | 16bit | -32768 ~ 32767 | 0 |
int | 부호 있는 정수값 | 32bit | -2147483648 ~ 2147483647 | 0 |
long | 부호 있는 정수값 | 64bit | -9223372036854775808 ~ 9223372036854775807 | 0L |
char | 유니코드 문자 | 16bit | '\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터) | '\u0000' |
float | IEEE754부동소수점수 | 32bit | 1.4E-45 ~ 3.4028235E38 | 0.0d |
double | IEEE754부동소수점수 | 64bit | 4.9E-324 ~ 1.7976931348623157E308 | 0.0d |
boolean | 논리값 | 1bit | true / false | false |
레퍼런스 타입
타입 | 예시 | 기본값 | 할당되는 메모리의 크기 |
---|---|---|---|
배열(Array) | int[] arr = new int[5]; | Null | 4 byte |
열거(Enumeration) | RED, ORANGE, YELLOW, GREEN | Null | 4 byte |
클래스(Class) |
String str = "test"; Student sujin = new Student(); |
Null | 4 byte |
인터페이스(Interface) | public interface Bank { | Null | 4 byte |
자바의 기본형 타입 (프리미티브 타입)
참조형 타입 (Reference Type)
리터럴 이란?
int a = 1;
a =변수, 1 = 리터럴
리터럴의 종류
리터럴과 데이터 타입의 차이
리터럴을 사용하는 이유
int i = 10;
long j = 10;
이때 10이 어떤 타입인지 구분 하기 힘들다 이를 구분하기 위해 리터럴을 사용하는것이다.
참조
변수란?
변수의 선언
int num;
num = 10;
* 자바에서는 변수 선언과 동시에 값을 초기화 할 수 있다. (내가 써본 언어 대부분이 가능했던것 같다)
``` java
int num1 = 10;
```
선언하고자하는 타입과 초기화 하려는 타입이 다를 경우 선언 불가능!변수의 스코프
public class ValableScopeExam{
int globalScope = 10; // 인스턴스 변수
public void scopeTest(int value){
int localScope = 10;
System.out.println(globalScope);
System.out.println(localScpe);
System.out.println(value);
}
}
static
변수의 라이프 타임
* 인스턴스 변수 = 객체가 메모리에 남아있을때 까지.
* 클래스 변수(static) = 프로그램이 끝날때까지 메모리가 로드되는 동안
참고자바 타입 변환
int intVal = 10;
long longVal = intVal; // 자동 타입 변환이 이루어짐
// 음수가 저장될수있는 byte,int 는 char 타입으로 자동 변환 불가
int intVal = 12345;
char charVal = (char)intVal;
이때 값손실이 나지 않게 범위를 체크해야한다1차 배열 선언하기
int[] arr1;
int arr1[];
1차원 배열 초기화 하기
int[] arr1;
int arr1 = new int[3];
1차원 배열을 선언과 동시에 초기화 하기
int[] arr1 = new int[10];
1차원 배열에 원하는 값 집어 넣기
int [] arr1 = {1, 2, 3, 4};
2차원 배열 선언
int[][] arr;
int[][] arr;
arr = new int[1][1];
int[][] arr = new int[1][1];
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
타입 추론(Type Inference)
BinaryOperator <Integer> add = (x, y)-> x + y;
제네릭 (Generic)
* 제네릭 타입을 사용해 컴파일 과정에서 타입을 체크해 잘못된 타입 사용을 제거한다.
ex)
public class TestGeneric<T> {
public T sample;
public void showYourType()
{
if(sample instanceof Integer)
System.out.println("Integer 타입이군요!!");
else if(sample instanceof String)
System.out.println("String 타입이군요!!");
}
}
위의 TestGeneric클래스의 멤버 변수 sample 은 T라는 타입을 가지는데 이 T는 존재하는 타입이 아니다. T는 나중에 인스턴스 생성시 결정된다.
public class Main{
public static void main(String[] args)
{
TestGeneric<String> stringType = new TestGeneric<String>();
TestGeneric<Integer> integerType = new TestGeneric<Integer>();
stringType.sample = "Hello";
integerType.sample = 1;
stringType.showYourType();
integerType.showYourType();
}
}
위의 코드에서 <> 안에 들어가는 타입에 의해 T의 타입이 결정되는걸 알수있다. 이처럼 인스턴스를 생성시에 타입이 명시되어 형변환이 필요없다. (이는 밑에 나올 var 과는 조금 다른것 같다. var 은 리터럴 값을 파악해 타입을 컴파일시 추론 하는 반면에 위의 제네릭은 사람이 직접 지정을 하는게 내가 생각하는 타입추론과는 조금 다른것 같다)
String str = "Java-Study";
var str = "Java-Study";
int int = 1; //불가능
int var = 1; //가능
var message = new ArrayList<>(); //불가능
이번 과제를 하면서 느낀건데 그 동안 자바 컨벤션을 무시하고 코드를 작성하는 경우가 많았던것 같다. 앞으로는 최대한 자바 컨벤션을 지켜가면서 코드를 작성해야겠다.