레쭈고 코틀린

Kotlin 4차시

정땅미 2024. 9. 13. 22:07

블로그를 시작하자 마자~~~~ 코드 투!척 ~_~

// open 을 사용하면 다른 곳에서도 사용 가능
open class Car {
    // 속성, 필드
    var color : String = ""
    var speed : Int = 0
    
    // 생성자 constructor
    constructor() { }
    constructor(color: String, speed: Int) {
        this.color = color
        this.speed = speed
    }
    
    // 메소드, 기능
    open fun upSpeed(value : Int) {
        if ((speed + value) >= 200)
        	speed = 200
      	else
        	speed = speed + value
    }
    fun downSpeed(value : Int) {
        if (speed - value < 0)
        	speed = 0
        else
        	speed = speed - value
    }
}

// 상속
class Automobile : Car {
    // 속성 부모 : 색상, 스피드
    
    var seatNum : Int = 0
    // 생성자
    constructor() { }
    
    // 기능, 함수
	override fun upSpeed(value : Int) {
        if (speed + value >= 300)
        	speed = 300
        else
        	speed = speed + value
    }
}

class Car2 {
    var name : String = ""
    var color : String = ""
    var speed : Int = 0
    
    constructor(name : String, color : String, speed : Int) {
        this.name = name
        this.color = color
        this.speed = speed
    }
    
    fun upSpeed(value : Int) {
        if ((speed + value) >= 500)
        	speed = 500
      	else
        	speed = speed + value
    } 
}

fun main() {
    var myCar1 : Car = Car("White", 0)
    // myCar1.color = "White"
    // myCar1.speed = 0
    
    var myCar2 : Car = Car("Blue", 100)
    // myCar2.color = "Blue"
    // myCar2.speed = 100
    println("내 차 1 = " +  myCar1.color + ", " + myCar1.speed)
    
    myCar2.upSpeed(70)
    println("내 차 2 = " +  myCar2.color + ", " + myCar2.speed)
    
    var automycar : Automobile = Automobile()
    automycar.upSpeed(289)
    println("내 승용차의 속도는 " + automycar.speed)
    
    var myCar3 : Car2 = Car2("테슬라", "Green", 400)
    myCar3.upSpeed(20)
    println("내 차 3 = " + myCar3.name + ", " + myCar3.color + ", " + myCar3.speed)
    
}

 

오늘 Kotlin 시간에서는 상속에 대해서 배웠습니당. 자바와 비슷해서 신기했던 점도 있었어유~

우선 open 을 작성해 줘야 다른 곳에서도 사용이 가능하다는 것을 배웠습니다.

color 와 speed 는 속성, 즉 필드이며 생성자는 기본 생성자와 color, speed 두 개의 매개변수를 받는 생성자를 만들어 주었답니당.

메소드는 speed 를 올리는 upSpeed 메소드와 speed 를 내리는 downSpeed 를 생성해 주었습니다.

 

다음은 Car 클래스를 상속 받은 Automobile 클래스를 생성해 주었습니다.

그리고 override 기능을 통해 부모의 메소드를 재정의할 수 있습니닷!!

그래서 이 override 기능을 통해 클래스는 부모보다는 더 나은 기능을 사용하기 위해 upSpeed 에서 숫자를 200 -> 300 으로 변경해줄 수 있습니당.

 

Car2 클래스는 name, color, speed 를 필드로 받으며 이 세 개를 받는 생성자를 가지고 있고 upSpeed 라는 메소드가 있는 클래스입니닷.

 

이제 main 부분에서 각 클래스에 해당하는 클래스를 만들어 줍니다. 그리고 괄호 옆에 해당하는 매개변수의 값을 채워서 넣어줍니당.

출력할 때는 myCar1.color 이런 형식으로 작성해 줘야 합니당.

메소드에서도 걱정할 것 없이 지정한 타입에 맞는 값을 괄호 안에 넣어주시면 됩니당.

 

너무 쉽죠?! 게다가 Java 와 다른 부분이 거의 없고 open 이나 변수를 선언하는 부분들만 달랐기 때문에 이는 코드를 많이 작성해 보고, 적응하는 것이 좋다고 생각해욤!

fun main() {
    val add = {x:Int, y:Int -> x + y}
    val result3 = add(2, 3)
    val result4 = add(6, 7)
    
    println(result3)
    println(result4)
    
    val mul = {x:Int, y:Int -> x * y}
    println(mul(2, 3))
    println(mul(4, 5))
    
    val minus = {x:Int, y:Int -> x - y}
    println(minus(2, 3))
    println(minus(40, 5))
    
    val greeting = fun(){println("Hello")}
    val result = greeting()
    print(result)
    
    val greeting2 = {name : String, age : Int -> "Hello. My name is $name. I am $age years old"}
    
    val result2 = greeting2("dongyang", 20)
    print(result2)
}

 

이것은 람다 형식으로 지정된 함수입니다!!!!!!

람다 형식이란 ... -> (화살표)를 사용해서 함수를 간단하게 나타내는 것입니당.

val add = {x:Int, y:Int -> x + y} 이렇게 말이죠~ 아주아주 간단하게 나타낼 수 있습니당.

val greeting2 = {name : String, age : Int -> "Hello. My name is $name. I am $age years old"}

그리고 이렇게 $변수이름 으로도 사용할 수 있습니다.

그럼 함수 호출문에서 값을 넣어주면 해당 형식의 문장에 지정해준 값이 삽입되어 출력돼요!!!!!!!!!!!!

진짜 신기한 것 같습니다. ㅎ OwO

package com.example.app2

import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity() {
    // AppCompatiActivity() 상속 
    override fun onCreate(savedInstanceState: Bundle?) {
        // 부모의 것을 재정의 하겠다.
        super.onCreate(savedInstanceState)
        // 부모의 onCreate 를 가리킴
        enableEdgeToEdge()
        // this 생략 (나 자신) = this.enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        // this 생략
        var btn : Button = findViewById(R.id.button1);
        // 선언 btn 은 Button 타입
        // id 를 통해서 찾는데 button1 이라는 아이디를 찾는다.
        btn.setOnClickListener {
            Toast.makeText(applicationContext, "버튼클릭~~~~~", Toast.LENGTH_SHORT).show()
        }
        // btn 이라는 버튼을 클릭했을 때
        // Toast 는 톡하고 튕기는 거
        // 객체를 안 만들어도 사용할 수 있음
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
    }
}

 

이는 Kotlin 프로젝트를 처음 실행했을 때 뜨는 MainActivity.kt 코드입니당.

오늘은 이 코드를 해석하기 위해 노력하였습니당.

class MainActivity : AppCompatActivity() {

 

우선 이 부분에서는 상속 관계!!! 라는 것을 알 수 있죠? 위에서 배웠던 것처럼~

MainActivity 라는 파일이 AppCompatActivity 라는 파일을 상속 받았습니닷.

override fun onCreate(savedInstanceState: Bundle?) {

 

여기서는 override 기능을 통해 부모의 onCreate 을 재정의하였습니당~

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

 

그리고 여기서 super. 은 부모의 onCreate 를 가리키고 있습니당.

그리고 클래스 자기 자신을 가리킬 때는 this 를 사용합니다. 하지만 이는 생략할 수 있기 때문에 여기서는 생략하였습니다!

 var btn : Button = findViewById(R.id.button1);
        // 선언 btn 은 Button 타입
        // id 를 통해서 찾는데 button1 이라는 아이디를 찾는다.
        btn.setOnClickListener {
            Toast.makeText(applicationContext, "버튼클릭~~~~~", Toast.LENGTH_SHORT).show()
        }
        // btn 이라는 버튼을 클릭했을 때
        // Toast 는 톡하고 튕기는 거
        // 객체를 안 만들어도 사용할 수 있음

 

그리고 제가 activity_main.xml 에서 미리 버튼 두 개를 만들어 뒀는데요 그 버튼의 아이디를 button1 이라 지정을 해 뒀습니당.

그 아이디 button1 의 값을 Button 타입의 btn 으로 가져옵니닷.

그리고 이 버튼을 클릭하였을 때 "버튼 클릭~~~~~" 이라는 문장이 뜨게 됩니닷.

Toast 는 static 이기 때문에 객체를 생성하지 않아도 사용할 수 있어요!

다음 코드부터는 아직 공부하지 않아서 미작성입니다. . . 

그리고 아직 Toast 코드 부분도 제대로 공부하지 못하였습니다 ㅠ-ㅠ
다음 Koltin 5차시 때는 더 자세한 블로그 글로 돌아올게여~

상속에 대해 마스터를 하고 계시길 바랍니닷.~!

다음 번에는 돌고 돌지 않는 대화로 돌아오겠습니닷. ㅎ^ㅎ 감사합니당.
즐거운 추석 연휴 보내세여!!!!!!!!! ^o^

'레쭈고 코틀린' 카테고리의 다른 글

Kotlin 6차시  (3) 2024.09.27
Kotlin 5차시  (0) 2024.09.26
Kotlin 3차시  (1) 2024.09.06
Kotlin 2차시  (1) 2024.09.04
Kotlin 1차시  (1) 2024.08.29