Saltar al contenido principal

📦 변수

📖 변수란?

변수는 데이터를 저장하는 상자입니다. 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 등의 타입을 자세히 알아보세요!