읽기 좋고 코드에 의도가 드러나는 코드가 좋은 코드라고 생각합니다.
하지만 의도가 분명하지 않은 코드를 작성하면 뭐가 문제일까요?
변수의 의도를 파악하지 못한다.
int a = 25;
int age = 25;
두 변수는 모두 나이 정보를 나타내는 변수입니다. 뭐가 더 바람직할까요? a의 같은 경우는 무엇을 나타내는지 의도를 파악하기 힘듭니다. 반면에 age라는 변수는 단번에 나이라는 정보를 유추해 낼 수 있죠.
좋은 변수 네이밍을 하는데에 시간이 걸리겠지만, 결과적으로 변수 네이밍을 통해 얻는 시간 절약이 더 큽니다!
협업자에 대한 배려가 필요하다.
개발자라면 협업은 피할 수 없는 일입니다. 하지만 자신만 아는 코드를 작성하면 어떤 일이 벌어질까요?
1번으로 예를 들면, a라는 변수의 의미를 찾기 위해 여러 클래스들을 찾아다니고 유추해 내는 노력이 필요할 것입니다. 만약 age라고 쓰면 나이를 나타내는 변수구나라고 생각하며 수고로움을 덜겠죠.
그럼 좋은 네이밍 방법은 무엇이 있을까요?
변수 명명 규칙
보통 자바 프로젝트에선 파스칼 표기법, 카멜 표기법을 사용합니다.
파스칼 표기법 :첫 글자를 대문자로 구성하며 단어가 합성될 때마다 각 단어의 첫 글자를 대문자로 표기하는 방식방법이며, 보통 클래스에 사용합니다.
ex) CircleTest, BonusNumber …
카멜 표기법 : 첫 글자를 소문자로 구성하며 단어와 단어가 만나면 뒤에 오는 단어의 첫 글자를 대문자로 써준다.
보통 변수명에 사용합니다.
ex) userName, bonusNumber …
의도를 드러내기
public void hp(int d) {...}
보면 어떤 기능을 하는 메서드인지 한 눈에 파악이 가능한가요? d라는 것이 무엇을 의미하는지도 모르겠지 않나요?
반면에,
public void decreaseHp(int damage) {...}
단번에 이해가 가시나요? decreaseHp라는 건 Hp가 감소하는 기능을 담당하는 함수인지 보이고 얼마나 감소하냐? 바로 int damage로 쉽게 의도를 드러내는 거죠! 즉, damage만큼 Hp를 감소하라 라는 의미입니다.
상수화를 이용하자
private void validatePlayerLength(String name) {
if (name.length() > 5) {...}
}
프로그램의 규칙을 잘 모르는 상태에서 이 코드를 보면 5가 어떤 걸 의미하는 건지 알 수 있을까요?
물론, 메서드의 이름을 보면 어느정도 유추가 가능하겠지만 좀 더 복잡한 프로그램이면 단번에 파악하기 힘들 거 같다고 생각합니다.
private static final int MAX_PLAYER_NAME_LENGTH = 5;
private void validatePlayerLength(String name) {
if (name.length() > MAX_PLAYER_NAME_LENGTH {...}
}
느낌이 오시나요? 상수화를 통해 의미를 나타냈습니다! 플레이어 이름의 길이의 최대라는 의미이며, 즉 플레이어의 이름이 길이가 5 이상으로 넘어가면 예외가 발생한다는 의미입니다!
축약하지 않는다.
과도한 축약은 코드 가독성을 저해한다. 무조건 짧다고 좋은 것은 아닙니다.
메서드의 이름이 긴 이유 중 하나는, 책임을 너무 많이 갖고 있거나, 적절한 클래스의 아래에 위치하지 않아서 일 수 있습니다.
클래스와 메서드 이름을 한 두 단어로 유지하려고 노력하고 문맥을 중복하는 이름을 자제해야 합니다.
public class Order {
void shipOrder() { ... }
}
클래스 이름이 Order라면 shipOrder라고 메서드 이름을 지을 필요가 없다.
public class Order{
void ship() { ... }
}
짧게 ship()이라고 하면 클라이언트에서는 order.ship()라고 호출하며, 간결한 호출의 표현이 된다.
객체 지향 생활 체조 원칙 5: 줄여쓰지 않는다 (축약 금지)
변수 이름의 자료형
결국 의도를 드러내는 코드는 유지보수 측면에서 좋습니다. 하지만 변수 이름이 다음과 같이 지었다고 합시다.
private List<Integer> lottoList = new ArrayList<>();
List 대신 다른 자료형(Set 등등)을 써야 하는 경우가 오면 어떻게 해야 할까요? 기존 변수명이 적절한 의미를 나타내지 못하게 되므로 결국 변수명을 변경해야 하는 번거로움이 생깁니다. 변수 이름에 자료형을 쓰지 않아도 타입을 통해 충분히 어떤 변수인지 파악이 가능하다.
자료형을 썼을 때 변수 네이밍
List와 같은 자료형은 여러개의 데이터를 가지고 있습니다.
private List<Integer> numbers = new ArrayList<>();
그래서 논리적으로 복수형을 써주는게 좋을 거라 생각합니다!
불린 변수의 네이밍
- is + 명사
- (명사)인가?
- is + 형용사
- 단어 자체가 형용사 (opaque, readable, visible 등)
- can : ~할 수 있는가?
- should, will : ~할 것인가? ~해야 하는가?
- has + 명사
- ~를 가지고 있는가?
보통 저는 객체에 물어볼 때 boolean을 많이 씁니다.
public boolean isDead() {
return hp <= HP_ZERO;
}
isDead() ⇒ 죽었는가? 라는 네이밍으로 쉽게 알 수 있겠죠!
메서드나 함수명을 잘 짓기
- 함수는 동작을 나타내므로 현재형 동사로 시작해야한다. ex) startGame()
- 현재형 동사로 시작하는 문장은 명령형을 나타낸다.
- 축약어 사용하지 않는다.
- 많은 축약어를 사용하였는데, 이점을 유의해야겠다고 생각했다.
- 동사는 두개 이상 못쓴다.
- 3인칭 단수를 사용한다.
'JAVA' 카테고리의 다른 글
UncheckedException과 CheckedException (1) | 2024.09.13 |
---|---|
ArrayList는 어떻게 크기가 조절될까? (0) | 2024.09.11 |
Garbage Collection(GC) 더 자세히 살펴보기 (0) | 2024.09.09 |
Java final과 불변성 (0) | 2024.09.08 |
가비지 컬렉션이란? (1) | 2024.09.06 |
제네릭이란? (2) | 2024.09.04 |
인터페이스와 추상 클래스 (3) | 2024.09.03 |
나만의 메서드가 한 가지 기능만 하는지 확인하는 기준 (0) | 2023.10.07 |