자 변수명과 메소드명은 그냥 단순하게 x,y,temp 편하신걸로 단순하게 작성하십쇼!! 라고 하면... 안되겠죠...
우리는 꽤나 많은 시간을 이름을 작성하는데 소비합니다. (아무래도 영어권의 나라가 아닌 이상 쉽게 떠오르지 않나봅니다.) 그래서 오늘은 변수명 또는 메소드명과 같은 이름을 쉽게 작성하는 컨벤션과 팁을 알려드리려고 합니다.
자바 변수명 및 네이밍 컨벤션 소개
우선, 변수명을 포함한 네이밍 컨벤션은 코드의 가독성을 높이고 협업에 필요한 일관성을 유지하는 중요한 원칙입니다. 특히 자바는 객체 지향 언어로, 변수, 메소드, 클래스명 등 각 요소에 맞는 이름을 작성하는 것이 더욱 중요합니다. 자바에서 따를 수 있는 대표적인 네이밍 컨벤션을 알아봅시다.
1. 자바 네이밍 컨벤션의 기본 원칙
- 패키지명
- 모두 소문자로 작성하며, 주로 도메인 이름을 역순으로 사용합니다.
- 예: com.example.project, org.openai.gpt
- 클래스 및 인터페이스명
- 각 단어의 첫 글자는 대문자로 작성하는 파스칼 케이스(PascalCase) 형식을 사용합니다.
- 예: UserController, AccountService, Employee
- 메소드와 변수명
- 메소드와 변수는 모두 소문자로 시작하고, 이후 각 단어의 첫 글자를 대문자로 작성하는 카멜 케이스(camelCase) 형식을 사용합니다.
- 변수명 예: userName, orderTotal
- 메소드명 예: calculateTotal(), isValidUser()
- 상수명
- 상수는 모두 대문자로 작성하며 단어 간 구분은 언더스코어(_)를 사용합니다.
- 예: MAX_LIMIT, DEFAULT_TIMEOUT
2. 의미 있는 변수명 작성 방법
변수명은 해당 변수의 역할과 의미를 잘 드러내야 합니다. 특히 길더라도 의미를 명확하게 전달할 수 있는 이름이 중요합니다. 예를 들어, 아래와 같이 작성해보세요:
// 구체적이고 직관적인 변수명
int userAge; // 사용자의 나이
String orderDate; // 주문 날짜
boolean isMember; // 회원 여부
변수명이 a, b, temp와 같이 모호하면 코드 해석이 어려워집니다. 이름은 되도록 간결하게, 그러나 구체적으로 작성하는 것이 좋습니다.
3. 메소드 네이밍: 애매한 이름보다 명확한 동사 사용하기
메소드명은 동사형으로 작성하여 해당 메소드가 어떤 기능을 수행하는지 알 수 있게 해야 합니다. 특히, 메소드가 특정 작업을 수행하는지 여부를 명확하게 나타내는 동사를 사용합니다.
- get, set, is로 시작하는 메소드는 관례상 값 반환과 값 설정에 사용됩니다.
- 기타 기능은 행위에 맞는 동사를 활용합니다.
예를 들어, 애매한 메소드명보다 명확하게 작성하면 다음과 같습니다:
// 애매한 이름
public void dataProcess() { ... }
// 명확한 이름
public void processUserData() { ... }
4. 메소드의 단일 책임 원칙 (Single Responsibility Principle)
메소드가 한 가지 이상의 기능을 하도록 작성하면 가독성이 떨어지고 유지보수가 어려워집니다. 메소드는 한 가지 기능만 수행하도록 하여 그 역할을 분명히 하고, 이름 역시 해당 역할을 설명하도록 지어야 합니다.
예를 들어, 아래와 같이 기능이 여러 개인 메소드를 하나의 기능만 담당하는 메소드로 분리할 수 있습니다:
// 기능이 여러 개인 메소드
public void manageOrderAndSendNotification() {
processOrder();
sendNotification();
}
// 단일 책임 원칙을 적용한 예
public void processOrder() { ... }
public void sendNotification() { ... }
5. 이름 짓기 어렵다면 다른 사람의 코드 참고하기
변수명이나 메소드명이 애매할 때는 같은 기능을 수행하는 다른 개발자들의 코드를 참고하는 것도 좋은 방법입니다. 또한 메소드가 지나치게 복잡하게 느껴진다면 메소드가 여러 기능을 수행하고 있는 것인지 점검하고, 하나의 기능만 수행하도록 리팩토링하는 것도 좋습니다.
public class OrderService {
// 명확한 변수명 사용
private double orderTotalAmount;
private String orderDate;
// 단일 기능을 수행하는 메소드
public void placeOrder() {
processOrder();
sendOrderNotification();
}
private void processOrder() {
// 주문 처리 로직
System.out.println("Processing order...");
}
private void sendOrderNotification() {
// 알림 전송 로직
System.out.println("Sending order notification...");
}
}
이 예제에서는 placeOrder() 메소드가 processOrder()와 sendOrderNotification()이라는 두 가지 하위 기능을 호출하지만, 각 기능을 별도 메소드로 분리하여 단일 책임 원칙을 적용했습니다. 이를 통해 메소드의 가독성이 높아지고, 유지보수가 쉬워집니다.
6. 변수명에 자료형을 포함하지 않기
자바에서는 변수의 타입이 이미 선언되어 있기 때문에, 변수명에 굳이 List나 Collection 같은 자료형을 추가할 필요가 없습니다. 변수명은 역할과 목적을 반영하는 것이 좋으며, 자료형을 나타내는 명칭은 가독성에 오히려 방해가 될 수 있습니다.
예를 들어, 다음과 같이 작성하면 좋습니다.
// 잘못된 변수명 예시
List<String> userList; // List라는 자료형을 이름에 포함
Map<String, String> userMap; // Map이라는 자료형을 이름에 포함
// 좋은 변수명 예시
List<String> users; // users라는 명칭만으로 충분히 의미 전달 가능
Map<String, String> userRoles; // 역할을 나타내는 userRoles로 의미 명확히
Tip: 변수명은 자료형을 드러내지 않고, 해당 변수가 무엇을 표현하는지 명확하게 전달하는 것이 중요합니다.
⚠️ 변수명으로 사용할 수 없는 경우
변수명을 작성할 때는 몇 가지 규칙과 제한 사항을 지켜야 합니다. 자바에서 변수명으로 사용할 수 없는 경우는 다음과 같습니다.
- 예약어(Keyword)
자바는 class, public, static, void, int 등 예약어를 변수명으로 사용할 수 없습니다. 예약어는 자바 언어의 기본 구문을 위해 미리 예약되어 있기 때문에 다른 용도로 사용할 수 없습니다.- 예: int class; // 오류 발생
- 예: String void; // 오류 발생
- 숫자로 시작하는 변수명
변수명은 숫자로 시작할 수 없습니다. 대신 첫 글자는 문자로 시작하고, 그 뒤에는 숫자나 문자, 밑줄(_), 또는 $를 사용할 수 있습니다.- 예: int 1stUser; // 오류 발생
- 예: int user1; // 사용 가능
- 특수 문자 사용 제한
변수명에 밑줄(_)과 달러 기호($) 외의 특수 문자는 사용할 수 없습니다. 일반적으로 $ 기호는 자바에서 잘 사용하지 않으며, 밑줄도 특수한 경우 외에는 지양하는 것이 좋습니다.- 예: String user-name; // 오류 발생
- 예: String _userName; // 사용 가능하지만, 권장하지 않음
- 의미 없는 단어 또는 모호한 이름
변수명으로 temp, data, value와 같은 모호한 이름은 지양하는 것이 좋습니다. 이러한 이름은 변수의 의미를 파악하기 어렵게 하므로, 변수가 실제로 무엇을 나타내는지 명확하게 나타내는 이름을 선택하는 것이 좋습니다.- 예: String temp; // 의미 불명확
- 예: String userName; // 의미 명확
변수명을 지을 때 주의할 점 요약
- 예약어는 변수명으로 사용할 수 없습니다.
- 숫자로 시작하거나 특수 문자를 포함한 변수명은 사용할 수 없습니다.
- 변수명은 의미가 명확하게 드러나도록 작성하고, temp 같은 모호한 이름은 피하는 것이 좋습니다.
추가:
클래스 필드에서 변수명을 간결하게 사용해도 되는 이유
User와 같은 클래스에서 필드명을 userName, userPhoneNumber처럼 작성하는 경우를 종종 볼 수 있지만, 사실 이름이 중복되기 때문에 굳이 이렇게 길게 쓸 필요는 없습니다. 클래스명 자체가 객체가 무엇을 나타내는지 드러내므로, 필드명에는 해당 객체의 속성만을 간결하게 표현하면 충분합니다.
예를 들어:
class User {
String name; // 이미 "User" 클래스 안에 있으므로 'name'만으로 충분
String phoneNumber; // 마찬가지로, 'userPhoneNumber'처럼 작성할 필요 없음
}
이렇게 작성하면 다음과 같은 장점이 있습니다:
- 중복 방지: 클래스명과 필드명에 같은 단어를 반복하는 중복을 피할 수 있습니다.
- 가독성 향상: 필드명이 짧아져 코드가 깔끔하고 간결해집니다. 이로 인해 필드가 가진 의미가 더 명확하게 드러납니다.
필드명이 간결해도 괜찮은 예와 그렇지 않은 예
이 원칙은 User 클래스의 name, phoneNumber처럼 클래스가 필드의 의미를 이미 충분히 설명할 수 있을 때 유효합니다. 다만, 클래스가 일반적이고 필드의 의미가 모호할 수 있는 경우에는 명확한 의미 전달을 위해 조금 더 구체적으로 작성해야 합니다. 예를 들어:
class Record {
String creatorName; // name만으로는 모호하므로 'creatorName'이라고 작성
String creationTimestamp; // 'timestamp'만 적기엔 의미가 불명확하므로 'creationTimestamp'라고 작성
}
이렇게 필드의 의미가 모호해질 수 있을 때는 조금 더 구체적으로 작성하고, 그렇지 않은 경우는 간결하게 작성하는 것이 좋은 변수명 작성의 기본 원칙입니다.
더 많은 내용이 있겠지만, 제가 기억나는 부분은 여기까지입니다. 😭 처음에는 이름을 짓는 게 어렵겠지만, 다른 사람들의 코드를 보거나 코딩 경험이 쌓이다 보면 사실 사용하는 단어는 비슷하기 때문에 점점 괜찮아질 거예요.
'IT' 카테고리의 다른 글
DTO와 Entity, VO의 차이점, 개념, 그리고 분리의 목적 (0) | 2024.11.16 |
---|---|
Java 오버로딩(Overloading)과 오버라이딩(Overriding)??? (3) | 2024.11.15 |
AngularJS Git Commit Message Convention이란? (1) | 2024.11.15 |
배포 중에도 서비스 중단 없이! - 무중단 배포 전략 알아보기 (1) | 2024.11.13 |
상태 없는 객체와 static 메서드 활용법 (0) | 2024.11.13 |