-
Firefox Java Coding StyleJava & Kotlin 2020. 6. 13. 17:38반응형
안녕하세요
오늘은 파이어폭스(Firefox) 회사인 모질라 재단이 정의한 자바 코딩 스타일(Java Coding Style)에 대해서 공부해보려고 하는데요.
"깔끔한 코드"란 과연 무엇일까라는 고민을 한 적이 있습니다. 흔히 말하는 "있을 곳에 있는 코드", "누구나 읽었을 때 어색함이 없는 가독성" 일 것 같습니다. 그래서 영향력 있는 회사들은 어떻게 작성하는 코드가 읽기 쉽고, 깔끔하다고 정의하고 있을까 궁금해서 시작했습니다.
사실 코딩 스타일은 각 회사별로 다릅니다. 왜냐하면 사람마다 코딩하는 스타일도 다르고, "좋은 코드"에 대한 의견도 다릅니다. 그렇게 수많은 다른 사람들이 모인 회사에서, 각자 원하는 대로 코드를 치면 프로그램 전체의 코드 스타일이 재각각이 될 것입니다. 책 한 권을 만드는데, 여러 명의 작가가 글을 쓴다면, 책 전체의 내용이 어색해질 것입니다. 누구는 변수를 이렇게 짓고, 누구는 저렇게 짓고. 흔히 말하는 개판 5분 전이 되겠죠? 정말 소프트웨어가 돌아는 가지만, 유지보수와 가독성에는 최악의 상황이 펼쳐질 것입니다.
혹시 눈치채셨나요? 사실 저 또한 블로그에 글을 작성할 때 최대한 일관성 있는 문단 나눔, 글 스타일을 유지하려고 노력하고 있습니다.
이렇게 여러명이 각자의 스타일대로 하는 것이 아닌, 회사가 임의로 정한 규칙 혹은 정의대로 코드를 칠 수 있게 "스타일 가이드"라는 것을 정해둡니다. 이를 토대로 소속 개발자들이 일관되고 통일된 스타일로 코드를 작성할 수 있을 것입니다. 하지만 이러한 규정은 회사가 보기 쉽게 코드를 작성하기 위함이기 때문에, 모든 개발자가 꼭 따라야 할 필요는 없습니다. 다만 영향력 있는 회사가 규정한 "깔끔한 코드"의 철학을 엿볼 수 있고, 자신의 코드도 조금 더 깔끔하게 정리할 수 있지 않을까 생각합니다.
Name (이름)
먼저 파이어폭스는 클래스명에는 FirstLetterUpperCase를 사용합니다. 즉 className이 아닌, ClassName 이렇게 사용합니다. 여기서 말하는 FirstLetter는 글자를 표시하는데요, 단어를 기준으로 끊었습니다. 그리고 메서드에는 camelCase를 사용합니다. camelCase라는 것은 낙타를 생각하시면 편한데요. 낙타의 등이 가운데만 뽈록 튀어나온 것을 생각하시면 됩니다. Medial Capitals, 즉 가운데를 대문자로 작성하는 것입니다. iPhone, eBay 같은 글자를 생각하시면 기억하기 쉬울 것 같습니다. 앞의 FirstLetterUpperCase는 PascalCase라고도 불립니다.
이때 클래스의 변수, 즉 인스턴스는 m 접두사를 붙입니다. "mSomeClassVariable" 이렇게요. static 형태의 변수는 s를 붙입니다. "sSomeStaticVariable" 이렇게요. static 변수는 아시다시피 생성과 동시에 메모리에 적재가 되기 때문에, 다른 일반적인 인스턴스와 구분지어서 관리하기 위함이 아닐까 생각이 듭니다.
Declaration (선언)
파이어폭스는 변수나 메서드의 선언을 라인당 한 개로 정의하고 있습니다.
int x, y; // 나쁜 예 int a; // 이렇게 두 줄로 int b; // 나누세요
위의 코드를 보면 변수 x, y를 한 줄이 아닌, 두 줄로 나누었습니다. 아무래도 변수나 메서드를 나누어서, 의도를 좀 더 명확하게 하기 위함이 아닌가 싶습니다. "사실 변수가 2개 있을 때는 그냥 한 줄에 적는 게 좀 더 가독성 있지 않나?"라는 생각도 들기는 합니다. 하지만 모질라처럼 큰 회사는 변수가 헤아릴 수 없을 만큼 많을 것이고, 이것들을 한 줄로 적기 시작하면 재앙이 될 수도 있을 것 같습니다.
또한 패키지 import에 있어서 와일드카드(wildcard)의 사용을 금지하고 있습니다. "import java.uitl.*;"를 예로 들고 있습니다. 아무래도 해당 파일에서 사용한 패키지를 명확히 하기 위함인 것 같습니다. 패키지명만 읽었을 때 이 코드의 전체적인 내용을 "유추" 할 수 있게 한 것 같습니다. import 패키지의 순서에 대해서도 정의하고 있습니다. "com.example.Foo"가 "com.example.bar"보다 먼저 위치하도록 하고 있습니다. 이는 Foo의 대문자가, bar의 소문자보다 앞서고 있기 때문이라고 정의하고 있습니다.
Braces (중괄호)
중괄호는 클래스 혹은 메서드의 시작 줄과 같은 줄에 오도록 하고, 끝나는 중괄호는 새로운 줄에 오도록 정의하고 있습니다.
public void func(int arg) { if (arg != 0) { while (arg > 0) { arg--; } } else { arg++; } }
위의 코드를 보면 func이라는 메서드의 시작 중괄호는 같은 라인, 끝나는 중괄호는 새로운 라인을 차지하고 있습니다. 사실 이러한 중괄호는 언어마다 회사마다 다를 것으로 생각합니다. C#을 사용하시는 분들은 같은 라인이 더 익숙하지 않을까 싶습니다. 하지만 자바는 회사, 개발자에 관계없이 보통은 같은 줄에 사용합니다. 혹시나 다른 줄에 사용하신다면, 같은 줄에 작성하는 것을 고려해보는 것이 어떨까 싶습니다.
Indent (들여 쓰기)
이것은 개발자, 회사마다 다른 대표적인 방식 같습니다. 대표적으로 tab키를 이용, 스페이스 4번을 이용한 들여 쓰기 방식이 있는데요. 파이어폭스에서는 스페이스 4번으로 들여 쓰기를 하라고 하고 있습니다. tab을 아얘 쓰지 말라고 하고 있습니다. 정말 싫어하나 봅니다. 개인적으로는 tab키를 선호합니다. 왜냐하면 스페이스 3번 쳤는지, 5번 쳤는지 생각하는 게 은근히 귀찮을 것 같기 때문입니다.
Not restricting character line (라인 당 글자 수 제한 X)
파이어폭스에서는 라인 당 80개의 글자로 제한을 두지 말라고 합니다. 여기서 구글의 안드로이드 스타일 가이드를 언급하는데요, 구글에서도 100자까지는 괜찮다고 하고 있는 것을 언급합니다.
자바는 아래로 길에 늘어지는 코드의 경향을 보이기 때문에 "적절히" 괄호로 감싸라고 언급하고 있습니다. 가끔 자바로 코드를 만들다 보면, 괄호가 너무 많아져 들여 쓰기를 깊게 하는 경우가 있는데요. 이러한 것을 피하라고 합니다. 이렇게 철저히 들여 쓰기를 강조하는 이유를 아래에 설명하고 있는데요. 고정된 들여 쓰기가 아닌 이전 줄과 단순히 맞추려고 하다 보면, 줄 바꿈을 할 때마다 코드를 이동시켜야 하고, 이때 공백의 변경이 일어난다고 설명하고 있습니다.
수정사항
6월 14일
내용 추가
참고 문헌
반응형'Java & Kotlin' 카테고리의 다른 글
(Java)Math.max vs 삼항연산자 (0) 2021.01.30 [Java]2차원 배열이란? (0) 2020.09.02 [Java]초기화란? (330) 2020.05.30 (JAVA)hasNext() vs next() 메서드 차이점? (0) 2020.05.18 [Java]Static 메서드란? 사용하는 이유 (0) 2020.04.18