컴퓨터 과학에서 어려운 문제는 딱 두 가지,
캐시 무효화(cache invalidation)와 명명(naming)이다. - 필 칼튼
class Rover {
static final double WALKING_SPEED = 3;
final string serialNumber;
double milesPerHour;
Rover(String SerialNumber) {
this.serialNumber = SerialNumber;
}
void drive() {
milesPerHour = WALKING_SPEED;
}
void stop() {
milesPerHour = 0;
}
}
자바 코드 규칙은 1997년부터 있었다.
이 규칙은 이름을 비롯해 자바 코드를 서식화하는 실질적 표준이다.
enum
은 CamelCase
로 작성한다.CAPITAL_SNAKE_CASE
로 작성한다.camelCase
로 작성한다.is
, has
, save
, get
, set
등과 같이 동사로 시작해야 한다.class Member {
private String name;
private boolean status;
public Member() {
}
public Member(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
}
Getter
와Setter
는 표준화가 잘 되어 있어서 여러 프레임워크에서 대부분 따르고 있다.
이에Getter
와Setter
만의 명세인 자바 빈 명세도 따로 존재한다.
private
으로, Getter
와 Setter
는 public
으로 작성한다.Getter
와 Setter
의 이름은 getXxx
, setXxx
로 한다.boolean
타입의 필드는 isXxx
로 이름을 붙인다.
Setter
는 무분별하게 사용하면 안 된다.
Setter
는 의도를 쉽게 파악하기 어렵고, 일관성을 지키는 것을 힘들게 만든다.
한 글자 이름에는 이유가 있을 수 없다.
코드가 비효율적이게 될까 봐 걱정할 수 있는데,
어차피 컴파일러는 컴파일 타임에 이름을 바이트코드로 대체해 버리므로 상관없다.
자신만의 축약어는 코드의 의미를 파악하는 데 큰 걸림돌이 될 수 있다.
class MainSpaceShipManager {
AbstractRocketPropulsionEngine abstractRocketPropulsionEngine;
INavigationController navigationController;
boolean turboEnabledFlag;
void navigateSpaceShipTo(PlanetInfo planetInfo) {
RouteData data = navigationController.calculateRouteData(planetInfo);
LogHelper.logRouteData(data);
abstractRocketPropulsionEngine.invokeTask(data, turboEnabledFlag);
}
}
간결성과 명명: 끝없는 투쟁
간결한 명명이 항상 미덕인 것은 아니다.
알아 들을 수 없는 축약어 대신 길지만 의미 있는 서술적인 이름이 낫다.
이름은 쓸 일보다 읽힐 일이 훨씬 많기 때문에 명확함을 추구하는 것이 좋다.
class spaceShip {
Engine engine;
Navigator navigatonr;
boolean turboEnabled;
void navigateTo(Planet destination) {
Route route = navigator.calculateRouteTo(destination);
Logger.log(route);
engine.follow(route, turboEnabled);
}
}
flag
, info
, data
등)을 제거했다.Spring 프레임워크에는 유명한 클래스명이 하나 있다.
장미는 붉고 잎사귀는 푸른데 유독 자바에만AbstractSingletonProxyFactryBean
클래스가 있다.
class Person {
String lastName;
String role;
int travels;
LocalDate employedSince;
String serializeAsLine() {
return String.join(",",
Arrays.asList(lastName,
role,
String.valueOf(travels),
String.valueOf(employedSince))
);
}
}
serializeAsLine()
메서드는 어떤 형식을 다루는가?클래스나 패키지처럼 범위가 넓은 이름은 메서드 내 변수 같은, 범위가 좁은 이름보다 훨씬 많이 읽힌다.
따라서 중요한 이름에는 더 많은 노력을 쏟아야 한다.
class Astronaut {
String tagName;
String rank;
int missions;
LocalDate activeDutySince;
String toCSV() {
return String.join(",",
Arrays.asList(tagName,
rank,
String.valueOf(missions),
String.valueOf(activeDutySince))
);
}
}
toCSV()
로 변경하여 메서드의 의도를 더 확실히 알 수 있게 되었다.가능하면 코드 내 이름은 해당 도메인에 맞게 짓고 포괄적인 명칭은 피하자.
완벽한 명명은 불가능하다. 더 나은 이름이 떠오를 때까지 항상 리팩터링하자.
이 장의 내용은 [자바 코딩의 기술: 똑똑하게 코딩하는 법]의 4장 내용을 정리한 것입니다.