변수 이름 짓기가 코딩의 절반이다
코딩에서 가장 어려운 일이 뭘까요? 알고리즘? 디버깅? 실은 프로그래머들 사이에서 유명한 농담이 있습니다: "컴퓨터 과학에서 어려운 것은 딱 두 가지 — 캐시 무효화와 이름 짓기."
농담이지만 진짜입니다. 변수, 함수, 파일의 이름은 코드의 설명서 역할을 합니다. 이름만 잘 지으면 주석이 필요 없고, 6개월 후에 코드를 다시 열어도 바로 이해할 수 있습니다.
나쁜 이름 vs 좋은 이름
// 나쁜 예
const d = [1.85, 0.42, 2.10, 0.15];
const t = 0.5;
let c = 0;
for (let i = 0; i < d.length; i++) {
if (d[i] >= t) c++;
}
// 좋은 예
const odValues = [1.85, 0.42, 2.10, 0.15];
const odThreshold = 0.5;
let passedCount = 0;
for (let i = 0; i < odValues.length; i++) {
if (odValues[i] >= odThreshold) passedCount++;
}두 코드는 완전히 같은 동작을 합니다. 하지만 아래 코드는 읽는 순간 "OD 값들 중에서 기준치 이상인 것을 세는 코드구나"라고 바로 이해됩니다. d, t, c로는 절대 알 수 없는 정보입니다.
표기법 4가지: 언제 뭘 쓰나
코딩에서 이름을 짓는 규칙을 **네이밍 컨벤션(Naming Convention)**이라고 합니다. 4가지 주요 표기법이 있습니다:
| 표기법 | 형태 | 사용 대상 | 예시 |
|---|---|---|---|
| camelCase | 첫 단어 소문자, 이후 대문자 | 변수, 함수 | sampleCount, getGeneInfo() |
| PascalCase | 모든 단어 대문자 시작 | 클래스, React 컴포넌트 | GeneCard, SampleList |
| snake_case | 소문자 + 밑줄 | Python 변수/함수, 파일명 | sample_count, gene_info.py |
| SCREAMING_SNAKE | 대문자 + 밑줄 | 상수 | MAX_RETRY, OD_THRESHOLD |
JavaScript에서는 camelCase가 기본입니다. Python에서는 snake_case가 기본입니다. 이것은 각 언어 커뮤니티의 약속이므로, 규칙을 따르면 다른 개발자들이 코드를 읽기 쉬워집니다.
// JavaScript (camelCase)
const sampleCount = 96;
function calculatePassRate(samples) { /* ... */ }
// React 컴포넌트 (PascalCase)
function GeneCard(props) { /* ... */ }
// 상수 (SCREAMING_SNAKE)
const MAX_OD_VALUE = 4.0;
const MIN_SAMPLE_VOLUME = 0.5;바이오 데이터와 네이밍: 실전 문제
생명공학 데이터를 코딩할 때 특유의 고민이 있습니다. 유전자 이름, 데이터베이스 식별자, 분석 파라미터를 변수명으로 어떻게 정제할까요?
유전체 기관별 명명 규칙이 다르다
| 기관/DB | 유전자 표기 | 예시 |
|---|---|---|
| NCBI (Gene) | 대문자 이탤릭 (인간) | TP53, BRCA1 |
| ENSEMBL | ENSG + 숫자 ID | ENSG00000141510 |
| UniProt | 단백질명_종 약자 | P53_HUMAN |
| HGNC | 공식 심볼 (대문자) | TP53, EGFR |
코드에서는 이탤릭을 쓸 수 없으므로, 변수명으로 옮길 때 규칙이 필요합니다:
// 유전자 이름은 그대로 문자열로
const geneName = "TP53";
const ensemblId = "ENSG00000141510";
// 여러 유전자를 다룰 때
const targetGenes = ["TP53", "BRCA1", "EGFR"];
// 분석 결과 객체
const geneExpression = {
TP53: 12.4,
BRCA1: 8.7,
EGFR: 15.2
};유전자 이름 자체(TP53)는 데이터이므로 문자열로 넣고, 그것을 담는 변수(geneName, targetGenes)는 camelCase로 짓습니다.
좋은 바이오 변수명 예시
| 나쁜 이름 | 좋은 이름 | 이유 |
|---|---|---|
data | qcResults | 무슨 데이터인지 알 수 있음 |
val | odValue | 어떤 값인지 명확 |
list | failedSamples | 무엇의 목록인지 명확 |
flag | isPassed | boolean은 is/has로 시작 |
n | sampleCount | 무엇의 개수인지 명확 |
temp | rawSequence | 임시라는 이유로 이름을 포기하지 말 것 |
res | apiResponse | 약어보다 완전한 단어 |
이름 짓기 5원칙
1. 의도를 드러내라
변수명만 보고 "이것이 무엇인지" 알 수 있어야 합니다. d보다 elapsedDays, x보다 currentIndex.
2. 축약하지 마라
cnt보다 count, btn보다 button, msg보다 message. 자동완성이 있으니 타이핑 시간은 동일합니다. 단, 관례가 굳어진 축약어는 예외: id, url, api, db.
3. Boolean은 is/has/can으로 시작
const isPassed = od >= 1.0;
const hasPermission = user.role === "admin";
const canDelete = hasPermission && !isLocked;passed만 쓰면 "통과된 것"인지 "통과 여부"인지 모호합니다. isPassed는 명확히 true/false를 의미합니다.
4. 함수는 동사로 시작
function calculatePassRate(samples) { /* ... */ }
function fetchGeneData(geneId) { /* ... */ }
function formatDate(timestamp) { /* ... */ }함수는 동작이므로 동사가 자연스럽습니다. passRate()보다 calculatePassRate()가 "이 함수가 통과율을 계산한다"는 것을 바로 알려줍니다.
5. 일관성을 유지하라
한 프로젝트에서 "가져오기"를 get, fetch, retrieve, load 네 가지로 섞어 쓰면 혼란스럽습니다. 하나를 정해서 일관되게 쓰세요. 팀 프로젝트라면 이 규칙을 문서화합니다.
파일명과 폴더명
변수만 규칙이 있는 게 아닙니다. 파일과 폴더도 마찬가지입니다:
| 대상 | 규칙 | 예시 |
|---|---|---|
| JavaScript 파일 | camelCase 또는 kebab-case | geneUtils.js, gene-utils.js |
| React 컴포넌트 파일 | PascalCase | GeneCard.tsx, SampleList.tsx |
| Python 파일 | snake_case | gene_analysis.py, qc_report.py |
| CSS 클래스 | kebab-case | gene-card, sample-list |
| 환경 변수 | SCREAMING_SNAKE | DATABASE_URL, API_KEY |
kebab-case는 단어를 하이픈(-)으로 연결하는 방식입니다. URL이나 CSS에서 주로 쓰입니다.
결론: 이름은 코드의 첫인상이다
좋은 이름을 짓는 데 시간을 쓰는 것은 낭비가 아닙니다. 코드는 한 번 쓰고 수십 번 읽힙니다. 쓰는 데 30초 더 걸려도, 읽을 때마다 10초씩 절약된다면 — 그것은 투자입니다.
논문에서 Figure의 축 라벨을 "value1", "value2"로 적으면 리뷰어가 리젝트하듯, 코드에서 d, t, c로 이름을 짓으면 미래의 자신이 고통받습니다.