🏗️ 클래스
📖 클래스란?
**클래스(Class)**는 객체를 만드는 설계도입니다. 데이터(프로퍼티)와 동작(메서드)을 하나로 묶어 관리합니다.
💡 기본 클래스
간단한 클래스
class Person {
var name: String = ""
var age: Int = 0
fun introduce() {
println("안녕하세요, ${name}입니다. ${age}살입니다.")
}
}
fun main() {
val person = Person()
person.name = "홍길동"
person.age = 25
person.introduce()
// 안녕하세요, 홍길동입니다. 25살입니다.
}
생성자
class Person(val name: String, val age: Int) {
fun introduce() {
println("안녕하세요, ${name}입니다. ${age}살입니다.")
}
}
fun main() {
val person = Person("홍길동", 25)
person.introduce()
}
🎯 생성자
주 생성자
// 주 생성자 (Primary Constructor)
class Person(val name: String, val age: Int)
fun main() {
val person = Person("홍길동", 25)
println("이름: ${person.name}")
println("나이: ${person.age}")
}
초기화 블록
class Person(val name: String, val age: Int) {
init {
println("Person 객체 생성: $name, $age")
}
init {
// 여러 개 가능
println("초기화 완료!")
}
}
fun main() {
val person = Person("홍길동", 25)
// Person 객체 생성: 홍길동, 25
// 초기화 완료!
}
보조 생성자
class Person(val name: String, val age: Int) {
var email: String = ""
// 보조 생성자
constructor(name: String, age: Int, email: String) : this(name, age) {
this.email = email
}
}
fun main() {
val person1 = Person("홍길동", 25)
val person2 = Person("김철수", 30, "kim@example.com")
println(person2.email) // kim@example.com
}
기본값
class Person(
val name: String,
val age: Int,
val email: String = "없음" // 기본값
) {
fun info() {
println("이름: $name, 나이: $age, 이메일: $email")
}
}
fun main() {
val person1 = Person("홍길동", 25)
val person2 = Person("김철수", 30, "kim@example.com")
person1.info() // 이메일: 없음
person2.info() // 이메일: kim@example.com
}
🔧 프로퍼티
getter와 setter
class Person(private var _age: Int) {
var age: Int
get() = _age
set(value) {
if (value >= 0) {
_age = value
}
}
}
fun main() {
val person = Person(25)
println(person.age) // 25
person.age = 30
println(person.age) // 30
person.age = -5 // 무시됨
println(person.age) // 30
}
계산 프로퍼티
class Rectangle(val width: Int, val height: Int) {
val area: Int
get() = width * height
val perimeter: Int
get() = 2 * (width + height)
}
fun main() {
val rect = Rectangle(10, 5)
println("면적: ${rect.area}") // 50
println("둘레: ${rect.perimeter}") // 30
}
🎨 메서드
기본 메서드
class Calculator {
fun add(a: Int, b: Int): Int {
return a + b
}
fun subtract(a: Int, b: Int): Int = a - b // 단일 표현식
}
fun main() {
val calc = Calculator()
println(calc.add(10, 5)) // 15
println(calc.subtract(10, 5)) // 5
}
메서드 오버로딩
class Printer {
fun print(text: String) {
println("문자열: $text")
}
fun print(number: Int) {
println("정수: $number")
}
fun print(number: Double) {
println("실수: $number")
}
}
fun main() {
val printer = Printer()
printer.print("Hello") // 문자열: Hello
printer.print(42) // 정수: 42
printer.print(3.14) // 실수: 3.14
}
🎯 실전 예제
은행 계좌
class BankAccount(val accountNumber: String, private var balance: Int = 0) {
fun deposit(amount: Int) {
if (amount > 0) {
balance += amount
println("${amount}원 입금. 잔액: ${balance}원")
}
}
fun withdraw(amount: Int): Boolean {
return if (amount > 0 && balance >= amount) {
balance -= amount
println("${amount}원 출금. 잔액: ${balance}원")
true
} else {
println("잔액 부족!")
false
}
}
fun getBalance(): Int = balance
}
fun main() {
val account = BankAccount("123-456", 10000)
account.deposit(5000) // 15000원
account.withdraw(3000) // 12000원
account.withdraw(20000) // 잔액 부족!
println("현재 잔액: ${account.getBalance()}원")
}
도서 관리
class Book(
val title: String,
val author: String,
val year: Int
) {
var isBorrowed: Boolean = false
private set
fun borrow(): Boolean {
return if (!isBorrowed) {
isBorrowed = true
println("'${title}' 대출 완료")
true
} else {
println("'${title}'는 이미 대출 중입니다")
false
}
}
fun returnBook() {
isBorrowed = false
println("'${title}' 반납 완료")
}
fun info() {
println("제목: $title, 저자: $author, 출판년도: $year")
}
}
fun main() {
val book = Book("코틀린 완벽 가이드", "홍길동", 2024)
book.info()
book.borrow()
book.borrow() // 이미 대출 중
book.returnBook()
book.borrow() // 성공
}