๊ธฐ๋ณธ ๋ฌธ๋ฒ
ํจ์
fun ํจ์ ์ด๋ฆ([๋ณ์ ์ด๋ฆ: ์๋ฃํ, ๋ณ์ ์ด๋ฆ: ์๋ฃํ..]): [๋ฐํ ๊ฐ ์๋ฃํ]{ // fun: ํจ์ ์์ฝ์ด
ํํ์...
[return ๋ฐํ๊ฐ]
}
// ex
fun sum(a: Int, b: Int): Int{
var sum = a + b
return sum
}
1. ์ฝํ๋ฆฐ์ ๋ค์ค ํจ๋ฌ๋ค์ ์ธ์ด
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ(FP: Funtional Programming)
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP: Object-Oriented Programming)
2. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ์ฝ๋ ๊ฐ๋ต, ํ ์คํธ๋ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ
- ์์ ํจ์, ๋๋ค์, ๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํด ๊ตฌ์ฑ
→ ex) main(), sum(), max() ํจ์
3. ์ผ๋ฐ์ ์ ์ธ
fun sum(a: Int, b: Int): Int {
return a + b
}
4. ๊ฐ๋ตํ ์ ์ธ
fun sum(a: Int, b: Int): Int = a + b
fun sum(a: Int, b: Int) = a + b
์์
fun sum(a: Int, b: Int): Int{
var sum = a + b
return sum
}
fun main() {
val result1: Int
val result2: Int
result1 = sum(3, 2) // IntelliJ IDEA์์ ๋งค๊ฐ๋ณ์(a: 3, b: 2)๋ฅผ ๋ณด์ฌ์ค
result2 = sum(6, 7) // IntelliJ IDEA์์ ๋งค๊ฐ๋ณ์(a: 6, b: 7)๋ฅผ ๋ณด์ฌ์ค
println(result1)
println(result2)
}
fun main() { // ์ต์ด์ ์คํ ํ๋ ์
val num1 = 10 // ์์ ๋ณ์ ํน์ ์ง์ญ ๋ณ์
val num2 = 3 // ์์ ๋ณ์ ํน์ ์ง์ญ ๋ณ์
val result: Int
result = max(num1, num2) // ๋ ๋ฒ์งธ ์คํ ํ๋ ์
println(result)
}
fun max(a: Int, b: Int) = if (a > b) a else b // a์ b๋ max์ ์์ ๋ณ์
// ๋๊ฐ์ ์ซ์๋ฅผ ์
๋ ฅ ๋ฐ์์ ๋ง์
, ๋บ์
, ๊ณฑ์
์ ํจ์๋ฅผ ์ด์ฉํด ์ถ๋ ฅํ์์ค
fun sum(a: Int, b: Int) = a + b
fun sub(a: Int, b: Int): Int = a - b
fun mul(a: Int, b: Int): Int{
return a * b
}
fun main() {
var num1: Int
var num2: Int
print("number1 = ")
num1 = readLine()!!.toInt() // !! : ๋ฐ๋์ ์
๋ ฅ๋ฐ์๋ผ -> ์ฝํ๋ฆฐ์ ๊ฒฝ์ฐ .๋ง์ฐ๋ฉด ์ค๋ฅ๋๋ฏ๋ก !!์จ์ค์ผํจ
print("number2 = ")
num2 = readLine()!!.toInt()
println("number1+number2 = ${sum(num1, num2)}")
println("number1-number2 = ${sub(num1, num2)}")
println("number1*number2 = ${mul(num1, num2)}")
}
โป ๋ง์ฝ ๋ค๋ฅธ ํ์ผ์์ sum()์ ์จ์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์๋ค๋ฉด, ํจ์์ ์ด๋ฆ์ ๋ฐ๊ฟ๋ผ
์์ ํจ์(pure function) (→ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ์๋ ํจ์)
- ๋ถ์์ฉ(side-effect)์ด ์๋ ํจ์
- ๋์ผํ ์ ๋ ฅ ์ธ์์ ๋ํด์๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ ํน์ ๋ฐํํจ
- ๊ฐ์ด ์์ธก์ด ๊ฐ๋ฅํด ๊ฒฐ์ ์ ์
fun sum(a: Int, b: Int): Int{
return a + b // ๋์ผํ ์ธ์์ธ a, b๋ฅผ ์
๋ ฅ ๋ฐ์ ํญ์ a + b๋ฅผ ์ถ๋ ฅ(๋ถ์์ฉ์ด ์์)
}
- ์์ ํจ์์ ์กฐ๊ฑด
- ๊ฐ์ ์ธ์์ ๋ํ์ฌ ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐํ
- ํจ์ ์ธ๋ถ์ ์ด๋ค ์ํ๋ ๋ฐ๊พธ์ง ์์
๋๋ค์(Lambda Expression)
- ์ต๋ช ํจ์์ ํ๋์ ํํ๋ก ์ด๋ฆ์ด ์์ด ์ฌ์ฉ ๋ฐ ์คํ์ด ๊ฐ๋ฅ
- ๋๋ค ๋์(Lambda calculus)๋ก ๋ถํฐ ์ ๋
(x, y -> x + y)
- ๋๋ค์์ ์ด์ฉ
- ๋๋ค์์ ๊ณ ์ฐจ ํจ์์์ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํ ๋ฑ์ ํ ์ ์์
- ๋ณ์์ ๋๋ค์ ์ ์ฉ
fun main(){
var result: Int
val multi = {x: Int, y: Int -> x * y} // ์ผ๋ฐ ๋ณ์์ ๋๋ค์ ํ ๋น
result = multi(10, 20) // ๋๋ค์์ด ํ ๋น๋ ๋ณ์๋ ํจ์์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
println(result)
}
- ๋๋ค์
// ํผ๋ผ๋ฏธํฐ 2๊ฐ๋ฅผ ๋ฐ์์ ํจ๊ณ๋ฅผ ์ถ๋ ฅํ๋ ์ผ๋ฐ์ ์ธ ๋ฉ์๋ ํ์
fun addNumber(n1: Int, n2: Int): Int{
return n1 + n2
}
// ๋๋ค์์ผ๋ก ํํ
val addNumbe = {n1: Int, n2: Int -> n1 + n2}
- ํน์ง
1. ๋๋ค์์ { }๋ก ๊ฐ์ธ๋ฉฐ fun ์์ฝ์ด๋ฅผ ์ฌ์ฉํ์ง ์์
2. { } ์ ->์ ์ผ์ชฝ์ ํ๋ผ๋ฏธํฐ, ์ค๋ฅธ์ชฝ์ ํจ์์ ๋ด์ฉ
3. -> ์ค๋ฅธ์ชฝ ๋ฌธ์ฅ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๊ตฌ๋ถ
4. ๋ด์ฉ ์ค ๋ง์ง๋ง ๋ฌธ์ฅ์ ๋ฐํ ๊ฐ(return)์
// ex) ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์คํ๋๋ ๋๋ค์
๋ฒํผ๋ณ์.SetOnClickListener{
// ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์คํ๋ ๋ด์ฉ
}
๊ณ ์ฐจ ํจ์(high-order function)
- ์ผ๋ฐ ํจ์๋ฅผ ์ธ์๋ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉ
fun main(){
println(highFunc({x, y -> x + y}, 10, 20)) // ๋๋ค์ ํจ์๋ฅผ ์ธ์๋ก ๋๊น
}
fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b) // sum ๋งค๊ฐ๋ณ์ ํจ์
๋ฉ์๋์ ์ ์ญ๋ณ์, ์ง์ญ๋ณ์
๋ฉ์๋
- ๊ธฐ๋ณธ ๋ฉ์๋์ธ main( ) ํจ์ ์ธ์ ์ฌ์ฉ์๊ฐ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ ์ ์์
- ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธธ ์ ์์
- ๋ฉ์๋์์ ์ฌ์ฉ๋ ๊ฒฐ๊ณผ๋ฅผ return ๋ฌธ์ผ๋ก ๋๋ ค์ค ์๋ ์์
๋ณ์
- ์ ์ญ๋ณ์(global variable)
- ์ ์ญ๋ณ์๋ ๋ชจ๋ ๋ฉ์๋์์ ์ฌ์ฉ๋จ
- ์ง์ญ๋ณ์(local variable)
- ๋ฉ์๋ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋จ
var myVar: Int = 100 // ์ ์ญ๋ณ์
fun main() {
var myVar: Int = 0 // ์ง์ญ๋ณ์
println(myVar)
var sum: Int = addFunction(10, 20)
println(sum)
}
fun addFunction(num1: Int, num2: Int): Int{
var hap: Int
hap = num1 + num2 + myVar
return hap
}
// ๊ฒฐ๊ณผ
// 0
// 130
ํด๋์ค์ ์ธ์คํด์ค
ํด๋์ค(class)
- ๋ณ์(ํ๋)์ ๋ฉ์๋๋ก ๊ตฌ์ฑ
- ๊ฐ์ฒด์งํฅ ๊ด์ ์์์ ํด๋์ค : ์ค์ธ๊ณ์ ๊ฐ์ฒด๋ค์ด ๊ฐ์ง ์ ์๋ ์ํ(๋ณ์)์ ํ๋(๋ฉ์๋)
class Car{
var color: String = ""
var speed: Int = 0
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
}
}
fun main() {
var myCar1: Car = Car()
myCar1.color = "๋นจ๊ฐ"
myCar1.speed = 0
var myCar2: Car = Car()
myCar2.color = "ํ๋"
myCar2.speed = 0
var myCar3: Car = Car()
myCar3.color = "์ด๋ก"
myCar3.speed = 0
myCar1.upSpeed(50)
println("์๋์ฐจ1์ ์์์ " + myCar1.color + "์ด๋ฉฐ, ์๋๋ " + myCar1.speed + "km์
๋๋ค.")
myCar2.upSpeed(20)
println("์๋์ฐจ2์ ์์์ " + myCar2.color + "์ด๋ฉฐ, ์๋๋ " + myCar2.speed + "km์
๋๋ค.")
myCar3.upSpeed(250)
println("์๋์ฐจ3์ ์์์ " + myCar3.color + "์ด๋ฉฐ, ์๋๋ " + myCar3.speed + "km์
๋๋ค.")
}
- ์์ฑ์ ์ฝ๋ ์ถ๊ฐ → ์์ ์ฝ๋๋ฅผ ๊ฐ์ (์๋ ์ฝ๋)
class Car{
var color: String = ""
var speed: Int = 0
constructor(color: String, speed: Int){ // ์์ฑ์ ์ฝ๋ ์ถ๊ฐ
this.color = color
this.speed = speed
}
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
}
}
fun main() {
var myCar1:Car = Car("๋นจ๊ฐ", 0)
var myCar2:Car = Car("ํ๋", 0)
var myCar3:Car = Car("์ด๋ก", 0)
myCar1.upSpeed(50)
println("์๋์ฐจ1์ ์์์ " + myCar1.color + "์ด๋ฉฐ, ์๋๋ " + myCar1.speed + "km์
๋๋ค.")
myCar2.upSpeed(20)
println("์๋์ฐจ2์ ์์์ " + myCar2.color + "์ด๋ฉฐ, ์๋๋ " + myCar2.speed + "km์
๋๋ค.")
myCar3.upSpeed(250)
println("์๋์ฐจ3์ ์์์ " + myCar3.color + "์ด๋ฉฐ, ์๋๋ " + myCar3.speed + "km์
๋๋ค.")
}
- ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
- ํ ํด๋์ค ๋ด์์ ๋ฉ์๋์ ์ด๋ฆ์ด ๊ฐ์๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์๋ ๋ฐ์ดํฐ ํ์๋ง ๋ค๋ฅด๋ฉด ์ฌ๋ฌ ๊ฐ๋ฅผ ์ ์ธํ ์ ์์
class Car{
var color: String = ""
var speed: Int = 0
constructor(color: String, speed: Int){ // ์์ฑ์ ์ฝ๋ ์ถ๊ฐ
this.color = color
this.speed = speed
}
constructor(color: String){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
this.color = color
}
constructor(speed: Int){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
this.speed = speed
}
constructor(){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
}
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
}
}
fun main() {
// ์๋ต
}
์ ์ ํ๋, ์ ์ ๋ฉ์๋, ์์ ํ๋
- ์ ์ ํ๋(static field)
- ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ํด๋์ค ์์ฒด์์ ์ฌ์ฉ๋๋ ๋ณ์
- companion object { } ์์ ์์ฑํ์ฌ ์ ์ ํ๋๋ฅผ ๋ง๋ฆ
- ์ ์ ๋ฉ์๋(static method)
- ๋ฉ์๋ ๋ํ companion object { } ์์ ์์ฑํ๋ฉด ๋จ
- ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ‘ํด๋์ค๋ช .๋ฉ์๋๋ช ( )’์ผ๋ก ํธ์ถํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ
- ์์ ํ๋
- ์ ์ ํ๋์ ์ด๊น๊ฐ์ ์ ๋ ฅํ๊ณ const val๋ก ์ ์ธ
- ์ ์ธํ ํ์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์
- ์์ ํ๋๋ ๋๋ฌธ์๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
- ํด๋์ค ์์ ์์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ
class Car{
var color: String = ""
var speed: Int = 0
companion object{
var carCount: Int = 0 // ์ ์ ํ๋
const val MAXSPEED: Int = 200 // ์์ ํ๋
const val MINSPEED: Int = 0 // ์์ ํ๋
fun currentCarCount(): Int{ // ์ ์ ๋ฉ์๋
return carCount
}
}
constructor(color: String, speed: Int){ // ์์ฑ์ ์ฝ๋ ์ถ๊ฐ
this.color = color
this.speed = speed
}
constructor(color: String){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
this.color = color
}
constructor(speed: Int){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
this.speed = speed
}
constructor(){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
}
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
}
}
fun main() {
var myCar1:Car = Car("๋นจ๊ฐ", 0)
var myCar2:Car = Car("ํ๋", 0)
var myCar3:Car = Car("์ด๋ก", 0)
println("์์ฐ๋ ์ฐจ์ ๋์(์ ์ ํ๋) ==> " + Car.carCount)
println("์์ฐ๋ ์ฐจ์ ๋์(์ ์ ๋ฉ์๋) ==> " + Car.currentCarCount())
println("์ฐจ์ ์ต๊ณ ์ ํ ์๋ ==> " + Car.MAXSPEED)
println("PI์ ๊ฐ ==> " + Math.PI)
println("3์ 5์ ๊ณฑ ==> " + Math.pow(3.0, 5.0))
}
// ๊ฒฐ๊ณผ
// ์์ฐ๋ ์ฐจ์ ๋์(์ ์ ํ๋) ==> 0
// ์์ฐ๋ ์ฐจ์ ๋์(์ ์ ๋ฉ์๋) ==> 0
// ์ฐจ์ ์ต๊ณ ์ ํ ์๋ ==> 200
// PI์ ๊ฐ ==> 3.141592653589793
// 3์ 5์ ๊ณฑ ==> 243.0
ํด๋์ค ์์(inheritance)
- ๊ธฐ์กด์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ์ผ๋ฉด์ ํ์ํ ํ ๋๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐ๋ก ์ ์ํ๋ ๊ฒ์ ์๋ฏธํจ
open class Car{
var color: String = ""
var speed: Int = 0
companion object{
var carCount: Int = 0 // ์ ์ ํ๋
const val MAXSPEED: Int = 200 // ์์ ํ๋
const val MINSPEED: Int = 0 // ์์ ํ๋
fun currentCarCount(): Int{ // ์ ์ ๋ฉ์๋
return carCount
}
}
constructor(color: String, speed: Int){ // ์์ฑ์ ์ฝ๋ ์ถ๊ฐ
this.color = color
this.speed = speed
}
constructor(color: String){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
this.color = color
}
constructor(speed: Int){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
this.speed = speed
}
constructor(){ // ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ
}
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(){
}
fun conutSeatNum(): Int{
return seatNum
}
override fun upSpeed(value: Int){
if (speed + value >= 300)
speed = 300
else
speed = speed + value
}
}
fun main() {
var auto: Automobile = Automobile()
auto.upSpeed(250)
println("์น์ฉ์ฐจ์ ์๋๋ " + auto.speed + "km์
๋๋ค.")
}
// ๊ฒฐ๊ณผ
// ์น์ฉ์ฐจ์ ์๋๋ 250km์
๋๋ค.
ํด๋์ค ์์ - ์ถ์ํด๋์ค์ ๋ฉ์๋
- ์ถ์(abstract) ํด๋์ค
- ์ถ์ ํด๋์ค๋ ์ธ์คํด์ค ์์ฑ ๋ถ๊ฐ
- ์ถ์ ํด๋์ค๋ ํด๋์ค ์์ abstract ํค์๋๋ฅผ ๋ถ์ฌ์ ์ง์ ํจ
- ์ธ์คํด์คํ๋
var myCar1: Car = Car("๋นจ๊ฐ", 0)
var myCar2: Car = Car("์ด๋ก", 0)
var myCar3: Car = Car("ํ๋", 0)
var auto: Automobile = Automobile()
- ์ถ์ ๋ฉ์๋
- ๋ณธ์ฒด๊ฐ ์๋ ๋ฉ์๋
- ๋ฉ์๋ ์์ abstract ํค์๋๋ฅผ ๋ถ์ฌ์ ์ง์
- ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ๋ ํด๋์ค๋ ์ถ์ ํด๋์ค๋ก ์ง์ ํด์ผ ํจ
- ์ถ์ ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์
- ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ์ถ์ ๋ฉ์๋๋ก ์ ์ธ ํด๋๊ณ , ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ ํ์ ์ถ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ฉํ๊ธฐ ์ํจ
- ‘๊ตฌํํ๋ค(implement)’ : ์ถ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๊ฒ์ ์๋ฏธํจ
- ๋๋ฌผ ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ง๋ค๊ณ ์ถ์ ๋ฉ์๋์ธ ‘์ด๋ํ๋ค( )’๋ฅผ ํฌํจํจ
abstract class Animal {
var name: String = ""
abstract fun move()
}
class Tiger: Animal(){
var age: Int = 0
override fun move(){
println("๋ค ๋ฐ๋ก ์ด๋ํ๋ค.")
}
}
class Eagle: Animal(){
var home: String = ""
override fun move(){
println("๋ ๊ฐ๋ก ๋ ์๊ฐ๋ค.")
}
}
fun main() {
var tiger1 = Tiger() // var tiger1 = Animal()์ ๋ถ๊ฐ, ์ถ์ ํด๋์ค์ด๋ฏ๋ก
var eagle1 = Eagle()
tiger1.move()
eagle1.move()
}
ํด๋์ค ์์ - ํด๋์ค ๋ณ์์ ๋คํ์ฑ
- ๋คํ์ฑ(polymorphism)
- ์๋ธํด๋์ค์์ ์์ฑํ ์ธ์คํด์ค๋ฅผ ์์ ์ ํด๋์ค ๋ณ์์ ๋์ ํ ์ ์๋ ๊ฒ์ ์๋ฏธํจ
- ํ๋์ ๋ณ์์ ์ฌ๋ฌ ์ข ๋ฅ์ ์ธ์คํด์ค๋ฅผ ๋์ ํ ์ ์์
// ์ ์ฝ๋์ Animal, Tiger, Eagle ํด๋์ค์ ๋์ผ
fun main() {
var animal: Animal // animal: ํด๋์ค ๋ณ์
animal = Tiger()
animal.move()
animal = Eagle()
animal.move()
}
ํด๋์ค ์์ - ์ธํฐํ์ด์ค์ ๋ค์ค ์์
- ์ธํฐํ์ด์ค(interface)
- ์ถ์ ํด๋์ค์ ์ฑ๊ฒฉ์ด ๋น์ทํจ
- interface ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๊ณ ๋ด๋ถ์๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํจ
- ํด๋์ค์์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ์ ์์ฑํ ๋ ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ‘ : ์ธํฐํ์ด์ค ์ด๋ฆ’ ํ์์ ์ฌ์ฉํจ
- ์ธํฐํ์ด์ค๋ ‘์์๋ฐ๋๋ค’๊ณ ํ์ง ์๊ณ ‘๊ตฌํํ๋ค’๊ณ ํจ
- Kotlin์ ๋ค์ค ์์์ ์ง์ํ์ง ์์
- ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ์์๊ณผ ๋น์ทํ๊ฒ ์์ฑํ ์ ์์
abstract class Animal {
var name: String = ""
abstract fun move()
}
interface iAnimal{
abstract fun eat()
}
class iCat: iAnimal{
override fun eat(){
println("์์ ์ ์ข์ํ๋ค.")
}
}
class iTiger: Animal(), iAnimal{
override fun move() {
println("๋ค ๋ฐ๋ก ์ด๋ํ๋ค.")
}
override fun eat() {
println("๋ฉง๋ผ์ง๋ฅผ ์ก์๋จน๋๋ค.")
}
}
class Eagle: Animal(){
var home: String = ""
override fun move(){
println("๋ ๊ฐ๋ก ๋ ์๊ฐ๋ค.")
}
}
fun main() {
var cat = iCat()
cat.eat()
var tiger = iTiger()
tiger.move()
tiger.eat()
}
// ๊ฒฐ๊ณผ
// ์์ ์ ์ข์ํ๋ค.
// ๋ค ๋ฐ๋ก ์ด๋ํ๋ค.
// ๋ฉง๋ผ์ง๋ฅผ ์ก์๋จน๋๋ค.
์ถ๊ฐ์ ์ธ ๋ฌธ๋ฒ
ํ๋ก์ ํธ, ๋ชจ๋, ํจํค์ง
ํ๋ก์ ํธ, ๋ชจ๋, ํจํค์ง, ํ์ผ์ ๊ด๊ณ
๋ชจ๋: ํจํค์ง๋ค์ ๋ฌถ์
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํจํค์ง: default, ์๋ฌด๊ฒ๋ ์ฐ์ง ์์๋ ๊ธฐ๋ณธ ์์ฑ๋จ
ํจํค์ง
- ํด๋์ค์ ์ธํฐํ์ด์ค๊ฐ ๋ง์์ง๋ฉด ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ํจํค์ง ๋จ์๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํจ
- ์ฌ์ฉ์๊ฐ ์์ฑํ ํด๋์ค๊ฐ ํฌํจ๋ ํจํค์ง๋ *.kt ํ์ผ ์ฒซ ํ์ ์๋์ ๊ฐ์ด ์ง์
package ํจํค์ง๋ช
- ์๋๋ก์ด๋์์ ์ ๊ณตํ๋ ํจํค์ง ๋ชฉ๋ก ํ์ธ ๋งํฌ: https://developer.android.com/reference/kotlin/packages
- ์๋ฐ ํ๋ก์ ํธ์ฒ๋ผ ๋๋ ํฐ๋ฆฌ์ ๋งค์น ๋์ด์ผ ํ์ง๋ ์์
package com.example.edu
class Person(val name: String, val age: Int)
...
- ํจํค์ง๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ด๋ฆ์ด ์๋ ๊ธฐ๋ณธ(default) ํจํค์ง ํฌํจ
- import์ ์ด๋ฆ์ด ์ถฉ๋ํ๋ฉด as ํค์๋๋ก ๋ก์ปฌ์์ ์ฌ์ฉํ ์ด๋ฆ์ ๋ณ๊ฒฝ ํ ์ฌ์ฉ
import com.example.edu.Person
import com.example.edu.Person as User
// com.example.edu.Person์ User๋ก ์ง์
- import๋ ํด๋์ค ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ฒ๋ ์ํฌํธ ํ ์ ์์
- ์ต์์๋ ๋ฒจ ํจ์์ ํ๋กํผํฐ, ์ค๋ธ์ ํธ ์ ์ธ์ ํจ์์ ํ๋กํผํฐ, ์ด๊ฑฐํ ์์
- ํจํค์ง ์ ์
ํจํค์ง ์ด๋ฆ | ์ค๋ช |
kotlin.* | Any, Int, Double ๋ฑ ์ฝ์ด ํจ์์ ์๋ฃํ |
kotlin.text.* | ๋ฌธ์์ ๊ด๋ จ๋ API |
kotlin.sequences.* | ์ปฌ๋ ์ ์๋ฃํ์ ํ๋๋ก ๋ฐ๋ณต์ด ํ์ฉ๋๋ ๊ฐ์ฒด๋ฅผ ์ด๊ฑฐ |
kotlin.ranges.* | If๋ฌธ์ด๋ for๋ฌธ์์ ์ฌ์ฉํ ๋ฒ์ ๊ด๋ จ ์์ |
kotlin.io.* | ์ ์ถ๋ ฅ ๊ด๋ จ API |
kotlin.collections.* | List, Set, Map ๋ฑ์ ์ปฌ๋ ์ |
kotlin.annotation.* | ์ ๋ ธํ ์ด์ ๊ด๋ จ API |
์ ๋ค๋ฆญ์ค(Generics)
: ๋ฐ์ดํฐ ํ์์ ์์ ์ฑ์ ๋ณด์ฅ
- ์ ๋ค๋ฆญ์ค๋ฅผ ์ฌ์ฉํ์ฌ strList์ ๋ฌธ์์ด๋ง ๋ค์ด๊ฐ๋๋ก ์ค์ ํ ์ ์์
- ๋ค์ ์ฝ๋์ ๋ง์ง๋ง ํ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์
var strList = ArrayList<String>(4)
strList.add("์ฒซ ๋ฒ์งธ")
strList.add("๋ ๋ฒ์งธ")
strList.add(3)
- ์ ๋ค๋ฆญ์ค๋ <String>๋ฟ ์๋๋ผ <Int>, <Double> ๋ฑ์ ์ฌ์ฉํ ์ ์์
- ์ฌ์ฉ์๊ฐ ์ ์ํ ํด๋์ค ํ์๋ ์ฌ์ฉํ ์ ์์
try ~ catch
- ์์ธ(exception)
: Kotlin ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ก ์คํ ๋์ค์ ์ ์ฌ์ ์ธ ์ค๋ฅ๊น์ง ๊ฒ์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์์ ์ผ๋ก ์คํ์ด ๋๋ค๊ฐ ๋น์ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ
- ์ด์์ฒด์ ์ ๋ฌธ์ (์๋ชป๋ ์์คํ ํธ์ถ์ ๋ฌธ์ )
- ์ ๋ ฅ๊ฐ์ ๋ฌธ์ (์กด์ฌํ์ง ์๋ ํ์ผ ํน์, ์ซ์ ์ ๋ ฅ๋์ ๋ฌธ์ ์ ๋ ฅ ๋ฑ)
- ๋ฐ์๋ค์ผ ์ ์๋ ์ฐ์ฐ (0์ผ๋ก ๋๋๊ธฐ ๋ฑ)
- ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ์คํจ ๋ฐ ๋ถ์กฑ
- ์ปดํจํฐ ๊ธฐ๊ณ ์์ฒด์ ๋ฌธ์ (์ ์ ๋ฌธ์ , ๋ง๊ฐ์ง ๊ธฐ์ต ์ฅ์น ๋ฑ)
try {
// ์์ธ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์๋ ๋ฌธ์ฅ
} catch (e: ์์ธ์ฒ๋ฆฌ ํด๋์ค๋ช
) {
// ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฌธ์ฅ
} finally {
// ๋ฐ๋์ ์คํ๋์ด์ผ ํ๋ ๋ฌธ์ฅ
}
fun main() {
var num1: Int = 1000
var num2: Int = 0
try {
println(num1/num2)
} catch (e: ArithmeticException){
println("๊ณ์ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค")
}
}
fun main() {
val a = 6
val b = 0
val c: Int
try {
c = a/b
} catch (e: Exception){
println("Exception is handled")
} finally {
println("finally ๋ธ๋ก์ ๋ฐ๋์ ํญ์ ์คํ๋จ")
}
}
// ๊ฒฐ๊ณผ
// Exception is handled
// finally ๋ธ๋ก์ ๋ฐ๋์ ํญ์ ์คํ๋จ
// b๊ฐ 0์ด ์๋ ๋ค๋ฅธ ์ ์์ผ ๊ฒฝ์ฐ try๋ฌธ๊ณผ finally ๋ฌธ์ด ์คํ๋จ
๋ ์ง ํ์
- DateFormat ํด๋์ค๋ฅผ ์์๋ฐ์ SimpleDate Format ์ฌ์ฉ
- ‘์ฐ์์ผ’์ด๋ ‘์๋ถ์ด’์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํํ์ด ๊ฐ๋ฅํจ
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util*
fun main(){
var now = Date()
var sFormat: SimpleDateFormat
sFormat = SimpleDateFormat("yyyyMMdd")
sFormat = SimpleDateFormat("HH:mm:ss")
println(sFormat.format(now)) // 23:15:21 ํ์์ผ๋ก ์ถ๋ ฅ
}
๊ธฐํ ํจ์
๋ฌธ์์ด ๋น๊ต
- String ํด๋์ค์ equals( ) ๋ฉ์๋ ์ฌ์ฉ
var str: String = "์๋
ํ์ธ์"
if (str.equals("์๋
ํ์ธ์)) {
// ๋ฌธ์์ด์ด ๊ฐ์ผ๋ฉด ์ด๊ณณ์ ์ํ
}
๋ฌธ์์ด ๋น๊ต
- String ํด๋์ค์ equals( ) ๋ฉ์๋ ์ฌ์ฉ
// fun <T, R> T.let(block: (T) -> R): R
val result = str?.let { // Int
Integer.parseInt(it)
}
with( ) ํจ์
- ์ธ์๋ก ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ ๋ธ๋ก์์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์
// fun <T, R> with(receiver:T, block T.() -> R): R
with(str) {
println(toUpperCase())
}
apply( ) ํจ์
- ๋ธ๋ก์ ์๊ธฐ ์์ ์ ์ ๋ฌํ๊ณ ์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์
// fun <T> T.apply(block: T.() -> Unit): T
val result = car?.apply {
car.setColor(Color.RED)
car.setPrice(1000)
}
run( ) ํจ์
- ์ต๋ช ํจ์์ฒ๋ผ ์ฌ์ฉํ๊ฑฐ๋, ๋ธ๋ก์ ์๊ธฐ ์์ ์ ์ ๋ฌํ๊ณ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์
// fun <R> run(block: () -> R): R
val avg = run {
val korean = 100
val english = 80
val math = 50
(korean + english + math) / 3.0
}
- ๊ฐ์ฒด์์ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด๋ฅผ ๋ธ๋ก์ ๋ฆฌ์๋ฒ ๊ฐ์ฒด๋ก ์ ๋ฌํ๊ณ ๋ธ๋ก์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ
- ์์ ํ ํธ์ถ์ ์ฌ์ฉํ ์ ์์ด์ with ( ) ํจ์๋ณด๋ค๋ ๋ ์ ์ฉํจ
// fun <T, R> T.run(block: T.() -> R): R
str?.run {
println(toUpperCase())
}
์ปฌ๋ ์
๋ฆฌ์คํธ
- ๋ฐฐ์ด๊ฐ์ ์๋ฃํ์ ๋ฐ์ดํฐ๋ค์ ์์๋๋ก ๊ฐ์ง๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ
- ์ค๋ณต๋์์ดํ ์ ๊ฐ์ง ์ ์๊ณ ์ถ๊ฐ, ์ญ์ , ๊ต์ฒด ๋ฑ์ด ์ฌ์
// ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฆฌ์คํธ๋ listOf() ๋ฉ์๋๋ก ์์ฑํ ์ ์์
val foods: List<String> = listOf("๋ผ๋ฉด", "๊ฐ๋น", "๋ฐฅ")
// ํ์ถ๋ก ์ผ๋ก ์๋ฃํ์ ์๋ตํ ์ ์์
val foods = listOf("๋ผ๋ฉด", "๊ฐ๋น", "๋ฐฅ")
// ์์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ ๋๋ mutableListOf ( ) ๋ฉ์๋๋ฅผ ์ฌ์ฉํจ
val foods = mutableListOf("๋ผ๋ฉด", "๊ฐ๋น", "๋ฐฅ")
foods.add("์ด๋ฐฅ") // ์ด๋ฐฅ์ ๋งจ ๋ค์ ์ถ๊ฐ
foods.removeAt(0) // ๋งจ ์์ ์์ดํ
์ญ์
foods[1] = "๋ถ๋์ฐ๊ฐ" // foods.set(1, "๋ถ๋์ฐ๊ฐ") (1๋ฒ์งธ ์์ดํ
์ ๋ถ๋์ฐ๊ฐ๋ก ๋ณ๊ฒฝ)
println(foods) // [๊ฐ๋น, ๋ถ๋์ฐ๊ฐ, ์ด๋ฐฅ]
println(foods[0]) // ๊ฐ๋น
println(foods[1]) // ๋ถ๋์ฐ๊ฐ
println(foods[2]) // ์ด๋ฐฅ
๋งต
- ํคkey์ ๊ฐvalue์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ํค๊ฐ ์ค๋ณต๋ ์ ์๋ ์๋ฃ๊ตฌ์กฐ
// ๋งต์ ์์์ ์ ๊ทผํ ๋๋ ๋๊ดํธ ์์ ํคkey๋ฅผ ์์๋ช
์ผ๋ก ์์ฑํ์ฌ ์ ๊ทผ
// ์ฝ๊ธฐ ์ ์ฉ ๋งต
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
// ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋งต
val citiesMap = mutableMapOf("ํ๊ตญ" to "์์ธ". "์ผ๋ณธ" to "๋๊ฒฝ", "์ค๊ตญ" to "๋ถ๊ฒฝ")
// ์์์ ๋ฎ์ด์ฐ๊ธฐ
citiesMap["ํ๊ตญ"] = "์์ธํน๋ณ์"
// ์ถ๊ฐ
citiesMap["๋ฏธ๊ตญ"] = "์์ฑํด"
// ๋งต ์ ์ฒด์ ํค์ ๊ฐ์ ํ์ํ ๋๋ ๊ฐ๋จํ ํ์ํ ์ ์์
// ๋งต์ ํค์ ๊ฐ์ ํ์
for((k, v) in map){
println("$k -> $v")
}
์งํฉ
- ์งํฉset์ ์ค๋ณต๋์ง ์๋ ์์๋ค๋ก ๊ตฌ์ฑ๋ ์๋ฃ๊ตฌ์กฐ
- setOf ( ) ๋ฉ์๋๋ก ์ฝ๊ธฐ ์ ์ฉ ์งํฉ์ mutableSetOf( ) ๋ฉ์๋๋ก ์์ ๊ฐ๋ฅํ ์งํฉ ์์ฑ
// ์ฝ๊ธฐ ์ ์ฉ ์งํฉ
val citySet = setOf("์์ธ", "์์", "๋ถ์ฐ")
// ์์ ๊ฐ๋ฅํ ์งํฉ
val citySet2 = mutableSetOf("์์ธ", "์์", "๋ถ์ฐ")
citySet2.add("์์") // [์์ธ, ์์, ๋ถ์ฐ, ์์]
citySet2.add("์์") // [์์ธ, ๋ถ์ฐ, ์์]
// ์งํฉ์ ํฌ๊ธฐ
println(citySet2.size) // 3
// '์์ธ'์ด ์งํฉ์ ํฌํจ๋์ด์๋์ง
println(citySet2.contains("์์ธ")) // true
์ฐ์ฐ์ ์ ๋ฆฌ
์ฐ์ฐ์ | ์ค๋ช |
+, -, *, /, % | ์ฌ์น ์ฐ์ฐ์๋ก %๋ ๋๋จธ์ง๊ฐ์ ๊ณ์ฐํ๋ค. |
+, - | ๋ถํธ ์ฐ์ฐ์๋ก ๋ณ์, ์, ์, ์์ ๋ถ์ผ ์ ์๋ค. |
= | ๋์ ์ฐ์ฐ์๋ก ์ค๋ฅธ์ชฝ์ ์ผ์ชฝ์ ๋์ ํ๋ค. |
++, -- | 1์ฉ ์ฆ๊ฐ ๋๋ ๊ฐ์์ํจ๋ค. |
==, ===, !=, !==, <, >, <=, >= | ๋น๊ต ์ฐ์ฐ์๋ก ๊ฒฐ๊ณผ๋ true ๋๋ false์ด๋ฉฐ, if ๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ์ ์กฐ๊ฑด์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. |
&&, ||, ! | ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ก and, or, not์ ์๋ฏธํ๋ค. |
and, or, xor, inv() | ๋นํธ ์ฐ์ฐ์๋ก, ๋นํธ ๋จ์๋ก and, or, exclusive or, not ์ฐ์ฐ์ ํ๋ค. |
shr, shi | ์ํํธ ์ฐ์ฐ์๋ก, ๋นํธ ๋จ์๋ก ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ค. |
+=, -=, *=, /= | ๋ณตํฉ ๋์ ์ฐ์ฐ์๋ก, 'a += b'๋ 'a = a+b'์ ๋์ผํ๋ค. |
toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble(), toChar() | ๋ฐ์ดํฐ ํ์์ ๊ฐ์ ๋ก ๋ณํํ๋ ํจ์์ด๋ค. ์๋ฅผ ๋ค์ด 'var a: Int = (3.14).toInt()'๋ Doubleํ์ธ 3.14 ๊ฐ์ intํ์ผ๋ก ๊ฐ์ ๋ก ๋ณํํ์ฌ a์ ๋์ ํ๋ค. ์ฆ a์ 3์ด ๋์ ๋๋ค. |
ํ๋ณํ
// ์ซ์ํ ์๋ฃํ๋ผ๋ฆฌ๋ to์๋ฃํ() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ณํ์ด ๊ฐ๋ฅ
val a = 10L
val b = 20
val c = a.toInt() // Long์ Int๋ก
val d = b.toDouble() // Int๋ฅผ Double๋ก
val e = a.toString() // Long์ String์ผ๋ก
// ์ซ์ํ ๋ฌธ์์ด์ ์ซ์๋ก ๋ฐ๊ฟ ๋๋ Integer.parseInt() ๋ฉ์๋ ์ฌ์ฉ
val intStr = "10"
val str = Integer.parseInt(intStr)
// ์ผ๋ฐ ํด๋์ค ๊ฐ์ ํ๋ณํ์ ํ๋ ค๋ฉด as ํค์๋๋ฅผ ์ฌ์ฉํจ.
open class Animal
class Dog: Animal()
val dog = Dog()
val animal = dog as Animal // dog๋ฅผ Animalํ์ผ๋ก ๋ณํ
//
val str = "hello"
if (str is String) { // str์ด Stringํ์ด๋ผ๋ฉด
println(str.toUpperCase())
}