10, retryCount, MAX_RETRY, null, void는 모두 값 주변에서 보이지만 같은 역할을 하지 않는다. 값 자체인지, 값을 가리키는 이름인지, 값이 없다는 표시인지부터 나누면 타입 오류도 읽기 쉬워진다.
아래 그림은 직접 쓴 값, 바뀌는 이름, 고정한 이름과 값·반환값이 없는 경우를 서로 분리한다.
literal variable constant는 어떻게 다를까?
그림의 왼쪽은 값과 이름의 관계를, 오른쪽은 값이 없거나 반환하지 않는 계약을 보여 준다. 먼저 왼쪽의 재시도 예제를 코드로 옮겨 보자.
MAX_RETRY = 3
retryCount = 0
retryCount = retryCount + 1| 용어 | 뜻 | 예 |
|---|---|---|
literal | 코드에 직접 적은 값 | 3, 0, "failed" |
variable | 값을 저장하거나 가리키는 이름 | retryCount |
constant | 실행 중 바꾸지 않기로 정한 값이나 이름 | MAX_RETRY |
상수의 보장 범위는 언어마다 다르다. 이름이 다른 객체를 가리키지 못하게 하는 것과 객체 내부까지 바뀌지 못하게 하는 것은 별개일 수 있다. const라는 철자만 보고 깊은 불변성을 가정하지 말고 언어의 타입·객체 규칙을 확인한다.
type은 값에 어떤 경계를 만들까?
data type은 값이 어떤 형태이며 어떤 연산을 허용하는지 정한다. 정수에 덧셈을 적용하고 문자열에 연결 연산을 적용할 수 있는 이유도 타입 규칙 때문이다.
primitive data type은 언어가 기본으로 제공하는 단순 값 타입을 가리킬 때 쓰지만, 정확한 종류와 메모리 표현은 언어마다 다르다. int, double, boolean을 모든 언어에서 똑같이 취급한다고 일반화하면 안 된다.
cast는 값을 다른 타입으로 보거나 변환하는 동작이다. 변환 과정에서 범위 초과, 정밀도 손실, 해석 실패가 생길 수 있으므로 성공 여부와 손실 가능성을 확인해야 한다.
null nil void는 모두 비어 있다는 뜻일까?
null이나 nil은 값 또는 객체 참조가 없음을 나타낼 때 사용한다. 반면 void는 함수가 값을 반환하지 않음을 나타내는 반환 타입이나 표기다.
findUser() -> User or null
logMessage() -> void첫 함수는 반환 자리는 있지만 사용자를 찾지 못하면 값이 없을 수 있다. 두 번째 함수는 애초에 호출자에게 결과값을 돌려주는 계약이 아니다. null을 반환한 함수와 void 함수는 호출하는 쪽의 처리도 달라야 한다.
빈 문자열 "", 숫자 0, 빈 목록 []도 null과 같지 않다. 값은 존재하지만 내용이나 개수가 0인 상태다. 언어의 truthy·falsy 규칙이 이 값을 거짓처럼 처리해도 의미까지 같은 것은 아니다.
reference와 pointer는 무엇을 조심해야 할까?
reference는 다른 객체나 값을 참조하는 연결을, pointer는 메모리 주소를 저장하거나 가리키는 값을 뜻한다. 언어와 문맥에 따라 직접 주소 연산을 허용하는지, 런타임이 안전성을 관리하는지가 다르다.
두 변수가 같은 변경 가능한 객체를 가리키면 한쪽에서 수정한 결과가 다른 쪽에서도 보일 수 있다. 값 복사인지 참조 공유인지 확인하지 않으면 “분명 복사했는데 원본도 바뀌었다”는 오류가 생긴다.
핵심 요약
literal은 코드에 직접 쓴 값, variable은 값을 저장하거나 가리키는 이름, constant는 바꾸지 않기로 한 값이나 이름이다. null/nil은 값의 부재, void는 반환값이 없는 계약이다. 타입과 참조 규칙은 언어마다 다르므로 키워드만 외우지 말고 변경 가능성, 값의 부재, 복사와 공유 범위를 함께 확인하자.

