📦 변수
📖 변수란?
변수는 데이터를 저장하는 상자입니다. Kotlin에는 두 가지 종류의 변수가 있습니다:
- val (value) - 한 번 할당하면 바꿀 수 없음 (불변)
- var (variable) - 언제든 바꿀 수 있음 (가변)
🎯 비유로 이해하기
val = 영수증 번호
├─ 한 번 발급되면 변경 불가
├─ 안전하고 예측 가능
└─ 권장!
var = 온도계
├─ 계속 변할 수 있음
├─ 필요한 경우만 사용
└─ 주의 필요
💡 val - 불변 변수 (권장!)
기본 사용법
fun main() {
val name = "홍길동"
println(name) // 홍길동
// name = "김철수" // ❌ 컴파일 오류!
// Val cannot be reassigned
}
왜 val을 권장하나요?
val의 장점:
├─ 버그 예방 (실수로 값 변경 불가)
├─ 코드 이해하기 쉬움
├─ 멀티스레딩에 안전
└─ 함수형 프로그래밍 스타일
val 예제
fun main() {
val age = 25
val city = "서울"
val isStudent = true
val pi = 3.14159
println("나이: $age")
println("도시: $city")
println("학생 여부: $isStudent")
println("원주율: $pi")
}
🔄 var - 가변 변수
기본 사용법
fun main() {
var score = 85
println("초기 점수: $score") // 85
score = 90 // ✅ 변경 가능!
println("변경된 점수: $score") // 90
score = score + 5
println("최종 점수: $score") // 95
}
var 사용 예시
fun main() {
var count = 0
// 카운터 증가
count = count + 1 // 1
count += 1 // 2 (축약형)
count++ // 3 (더 짧게)
println("카운트: $count") // 3
}
언제 var을 사용하나요?
var를 사용하는 경우:
├─ 반복문 카운터
├─ 축적되는 값 (합계 등)
├─ 상태가 변하는 값
└─ 정말 필요한 경우만!
📝 변수 선언 문법
타입 명시
fun main() {
// 타입을 명시적으로 작성
val name: String = "홍길동"
val age: Int = 25
val height: Double = 175.5
val isAdult: Boolean = true
println("$name ($age세, ${height}cm)")
}
타입 추론 (권장)
fun main() {
// Kotlin이 자동으로 타입 추론
val name = "홍길동" // String
val age = 25 // Int
val height = 175.5 // Double
val isAdult = true // Boolean
// 더 깔끔하고 읽기 쉬움!
}
🆚 val vs var 비교
실전 예제
fun main() {
// val - 변경 불가
val birthYear = 1995
val hometown = "부산"
// var - 변경 가능
var currentAge = 2024 - birthYear // 29
var currentCity = hometown
// 이사
currentCity = "서울" // ✅ OK
// 생년월일은 바뀔 수 없음
// birthYear = 1996 // ❌ 오류!
println("출생: ${hometown} (${birthYear}년)")
println("현재: ${currentCity} (${currentAge}세)")
}
실수하기 쉬운 경우
fun main() {
var total = 0
total += 10 // 10
total += 20 // 30
total += 30 // 60
println("합계: $total") // 60
// ❌ 나쁜 예
var result = 0
result = 10
result = 20 // 이전 값 무시
result = 30 // 계속 덮어쓰기
println(result) // 30만 출력
// ✅ 좋은 예 (각각 val로)
val step1 = 10
val step2 = 20
val step3 = 30
val finalResult = step1 + step2 + step3
println(finalResult) // 60
}
🎯 명명 규칙
올바른 변수명
fun main() {
// ✅ 좋은 변수명 (camelCase)
val userName = "홍길동"
val studentAge = 20
val totalPrice = 15000
val isLoggedIn = true
val maxRetryCount = 3
// ✅ 여러 단어 조합
val phoneNumber = "010-1234-5678"
val emailAddress = "hong@example.com"
val dateOfBirth = "1995-05-15"
}
잘못된 변수명
fun main() {
// ❌ 나쁜 변수명
val a = "홍길동" // 의미 불명
val x = 20 // 무엇의 값?
val temp = 15000 // 임시? 온도?
val data = true // 어떤 데이터?
// ❌ 문법 오류
// val 123abc = "test" // 숫자로 시작 불가
// val my-name = "홍길동" // 하이픈 사용 불가
// val class = "A" // 예약어 사용 불가
}
명명 규칙
변수명 규칙:
├─ camelCase 사용 (첫 글자 소문자)
├─ 의미 있는 이름
├─ 영문자, 숫자, _ 사용 가능
├─ 숫자로 시작 불가
├─ 예약어 사용 불가
└─ 너무 길지 않게 (적당히)
🔢 상수 (const)
컴파일 타임 상수
// 파일 최상위에 선언
const val MAX_AGE = 100
const val MIN_AGE = 0
const val PI = 3.14159
const val APP_NAME = "MyApp"
fun main() {
println("앱 이름: $APP_NAME")
println("최대 나이: $MAX_AGE")
// MAX_AGE = 200 // ❌ 오류!
}
const vs val
// const - 컴파일 타임 상수 (더 빠름)
const val COMPANY_NAME = "Kotlin Corp"
fun main() {
// val - 런타임 상수
val currentTime = System.currentTimeMillis()
// const는 런타임 값 불가!
// const val time = System.currentTimeMillis() // ❌ 오류!
}
💡 실전 예제
쇼핑 카트
fun main() {
// 상품 정보 (변경 불가)
val productName = "노트북"
val price = 1500000
// 수량 (변경 가능)
var quantity = 1
// 수량 증가
println("=== 쇼핑 카트 ===")
println("$productName: ${price}원 x ${quantity}개")
println("총 가격: ${price * quantity}원")
// 수량 변경
quantity = 3
println("\n수량 변경!")
println("$productName: ${price}원 x ${quantity}개")
println("총 가격: ${price * quantity}원")
}
카운터
fun main() {
var likes = 0
println("좋아요 수: $likes")
// 좋아요 증가
likes++
println("좋아요! (현재: $likes)")
likes++
println("좋아요! (현재: $likes)")
likes += 5
println("좋아요 5개 추가! (현재: $likes)")
}
온도 변환기
fun main() {
val celsius = 25.0 // 섭씨 (고정)
// 화씨로 변환
val fahrenheit = celsius * 9 / 5 + 32
// 켈빈으로 변환
val kelvin = celsius + 273.15
println("섭씨: ${celsius}°C")
println("화씨: ${fahrenheit}°F")
println("켈빈: ${kelvin}K")
}
🤔 자주 묻는 질문
Q1. val과 var 중 뭘 써야 하나요?
A: 기본적으로 val을 사용하세요!
fun main() {
// 👍 좋은 습관
val name = "홍길동" // val부터 시작
val age = 25
var count = 0 // 정말 필요할 때만 var
count++
}
규칙:
1. 기본은 val
2. 변경이 필요하면 var로 변경
3. var를 val로 바꿀 수 있는지 항상 체크
Q2. val도 내부는 바뀔 수 있나요?
A: 네! val은 참조만 고정입니다.
fun main() {
// 리스트 자체는 바꿀 수 없음
val numbers = mutableListOf(1, 2, 3)
// numbers = mutableListOf(4, 5, 6) // ❌ 오류!
// 하지만 내용은 바꿀 수 있음
numbers.add(4) // ✅ OK
println(numbers) // [1, 2, 3, 4]
}
Q3. 변수명이 한글이어도 되나요?
A: 가능하지만 권장하지 않습니다.
fun main() {
val 이름 = "홍길동" // ✅ 문법상 가능
val 나이 = 25
// 하지만 영어를 권장!
val name = "홍길동" // 👍 더 좋음
val age = 25
}
🎬 마치며
변수는 프로그래밍의 기초입니다!
핵심 정리:
✅ 기본은 val (불변)
✅ 필요할 때만 var (가변)
✅ 의미 있는 변수명 사용
✅ camelCase 명명 규칙
다음 단계: 타입 시스템에서 Int, String 등의 타입을 자세히 알아보세요!