🎈클래스
// 생성자 실습
class User1 constructor(name: String) {
val userName: String
init {
userName = name
println("init에 출력가능")
}
}
val user1 = User1("박소현") // 클래스를 호출 -> 인스턴스화
println(user1.userName)
////////////////////////////////////////
class User2 constructor(name: String) {
val userName: String = name
}
val user2 = User2("박소현2")
println(user2.userName)
////////////////////////////////////////
class User3(name: String) {
val userName: String = name
}
val user3 = User3("박소현3")
println(user3.userName)
////////////////////////////////////////
class User4(name: String = "박소현4"){ // 기본값이 있는 주생성자
val userName = name
}
val user4 = User4()
println(user4.userName)
////////////////////////////////////////
// 생성자에서 받는 속성이 복수개인 경우
// Java 스타일
class User5(name: String, age: Int) {
val name: String
val age: Int
init {
this.name = name
this.age = age
}
}
val user5 = User5("박소현5", 5)
println(user5.age)
// 부생성자 (Secondary Constructor)
//실행순서
// 부생성자 호출 -> 부생성자 안의 주생성자 호출 -> init 호출 -> 부생성자 실행
class User1(name: String) {
var age: Int = 0 //init블럭 안에 들어가있지 않기 때문에 여기서 직접 초기화해줘야 한다.
var name: String
init { // 초기화블럭은 클래스가 생성될 때 무조건 실행되기 때문에 무조건 초기화된다.
// 따라서 초기화블럭에 없는 속성은 선언할 때 초기화해줘야한다.
this.name = name
//println 동작함
}
// 부생성자
// - 부생성자는 클래스명 우측에 올 수 없다.
// - 클래스의 본문에 있어야 한다.
constructor(name: String, age: Int) : this(name) {
this.age = age
//println 동작함
}
}
val user1 = User1("가나다", 20)
println(user1.name)
///////////////////////////////////////////////////////////////////////////
class User4(name: String, age: Int) {
var userName: String = name
var userAge: Int = age
var gender: String = "여자"
constructor(name: String, age: Int, gender: String) : this(name, age) {
this.gender = gender
}
}
val user4 = User4("박소현", 23, "남자")
println(user4.gender)
// 실습
class Player(uniform: String, ball: String) {
val uniform: String
val ball: String
init {
this.uniform = uniform
this.ball = ball
}
fun kick() {
println("공 참")
}
}
val player = Player("빨간색", "축구공")
println(player.uniform)
player.kick()
///////////////////////////////////////////////////////
class Player2(uniform: String, ball: String) {
val uniform: String = uniform
val ball: String = ball
fun kick() {
println("공 참")
}
}
val player2 = Player2("빨간색", "축구공")
println(player2.uniform)
player2.kick()
🎈클래스 속성
// 실습
class Bank {
fun save(account: Account, money: Int) {
if (money >= 0) account.balance += money
else println("마이너스는 예금 불가능")
}
fun withdraw(account: Account, money: Int) {
if (account.checkBalance() >= money) account.balance -= money
else println("잔액부족")
}
}
class Account(val initBalance: Int = 0) {
var balance: Int = 0
init {
this.balance = initBalance
}
fun checkBalance(): Int {
return balance
}
}
val account = Account(1000)
val bank = Bank()
println(account.checkBalance())
bank.save(account, 1000)
println(account.checkBalance())
/////////////////////////////////////////////////////////
class Bank2 {
fun save(account: Account2, money: Int) {
if (money >= 0) account.balance += money
else println("마이너스는 예금할 수 없습니다.")
}
fun withdraw(account: Account2, money: Int) {
if (money <= account.balance) account.balance -= money
else println("잔액부족")
}
}
class Account2 {
var balance: Int = 0
fun checkBalance() : Int{
return balance
}
}
val user2 = Account2()
println(user2.checkBalance())
val bank2 = Bank2()
bank2.save(user2, 333)
println(user2.checkBalance())
bank2.withdraw(user2, 222)
println(user2.checkBalance())
🎈 상속
// 실습
// 부모클래스
open class Warrior(var name: String, var age: Int) {
fun attack(){
println("공격")
}
}
// 자식클래스 1 -> 주생성자가 부모클래스를 만들어 주는 경우
class DefenceWarrior(name: String, age: Int, height: Int): Warrior(name, age){
fun defence() {
println("방어")
}
}
val defenceWarrior = DefenceWarrior("박소현", 20, 5)
defenceWarrior.defence()
defenceWarrior.attack()
println("//////////////")
// 자식클래스 2 -> 주생성자가 없는 경우
class HardAttackWarrior: Warrior{
var power: Int = 0
constructor(name: String, age: Int, power: Int): super(name, age){
this.power = power
}
fun hardAttack(){
println("강하게 공격")
}
}
val hardAttackWarrior = HardAttackWarrior("박소현", 20, 50)
hardAttackWarrior.hardAttack()
hardAttackWarrior.attack()
// 오버로딩 -> 사용빈도 낮음
class Sum {
fun sum(): Int {
return 10
}
fun sum(number1: Int): Int{
return number1 + 10
}
fun sum(number1: Int, number2: Int): Int {
return number1 + number2 + 10
}
}
val sum = Sum()
println(sum.sum())
println(sum.sum(10))
// 오버라이딩
open class Warrior(var name: String, var age: Int) {
open fun attack(){ // 오버라이드 해주기 위해 open시키자
println("공격")
}
open fun getDefencePower() : Int {
return 10
}
}
// 자식클래스 1 -> 주생성자가 부모클래스를 만들어 주는 경우
class DefenceWarrior(name: String, age: Int, height: Int): Warrior(name, age){
fun defence() {
println("방어")
}
override fun attack() {
super.attack()
}
override fun getDefencePower(): Int {
// return super.getDefencePower()
val defenceWarrior: Int = super.getDefencePower()
return defenceWarrior + 5
}
}
val defenceWarrior = DefenceWarrior("박소현", 39, 12)
defenceWarrior.attack()
// 실습 - 총정리
open class Warrior(name: String, age: Int){
var userName: String = name
var userAge: Int = age
open fun attack(): Int{
println("공격!!")
return 10
}
}
class DefenceWarrior(name: String, age: Int, height: Int): Warrior(name, age){
var userHeight: Int = height
fun defence() {
println("방어..")
}
}
val defenceWarrior = DefenceWarrior("박소현", 23, 23434)
println(defenceWarrior.userHeight)
println(defenceWarrior.userAge)
println(defenceWarrior.userName)
defenceWarrior.attack()
defenceWarrior.defence()
class HardAttackWarrior: Warrior{
var power: Int = 0
constructor(name: String, age: Int, power: Int ): super(name, age){
this.power = power
}
fun hardAttack(){
println("강하게 공격")
}
override fun attack(): Int {
val attack: Int = super.attack()
return attack + 10
}
}
val hardAttackWarrior = HardAttackWarrior("박", 24, 4555)
hardAttackWarrior.hardAttack()
hardAttackWarrior.attack()
'# 1. Language > 🔰 Kotlin' 카테고리의 다른 글
Kotlin # 배열/콜렉션/이터러블 (0) | 2022.07.01 |
---|---|
Kotlin # 접근제한자/예외처리 (0) | 2022.07.01 |
Kotlin # 함수/람다식/흐름제어/반복문 (0) | 2022.06.29 |
Kotlin # 변수/Null/연산자/형변환 (0) | 2022.06.29 |
Kotlin # text 보여주는 방법 (0) | 2022.06.29 |