//키워드 변수명 : 타입 값
val a : Int = 1
//타입을 생략해도 추론해서 컴파일됨
val b = 1
//지연 할당시 타입 지정은 필수
val c : Int
c = 3
//fun 함수명(함수의 인자) : 반환타입 {바디에 메인로직}
fun sum(a: Int, b: Int) : Int {
return a + b
}
//표현식 스타일
fun sum2((a: Int, b: Int) : Int = a + b
//표현식 + 반환타입 생략
fun sum3((a: Int, b: Int) = a + b
//반환타입이 없는 함수는 Unit타입을 반환한다
fun sum(a: Int, b: Int) {
println("$a + $b = ${a + b}")
}
//디폴트 파라미터
fun greeting(message : String = "안녕하세요") {
println(message)
}
fun main() {
greeting()
greeting("Hi)
} // 결과값 : 안녕하세요와 Hi 두개가 반환됨
//named argument
fun log(level: String = "INFO", message : String) {
println("[$level]$messag")
}
fun main() {
log(massage = "인포 로그")
log(level = "DEBUG", "디버그 로그")
log("WARN", "워닝 로그")
log(level = "ERROR", message = "에러 로그")
}
// 결과값 : [INFO]인포 로그, [DEBUG]디버그 로그...
if-else식
val job = "Developer"
if(job == "Developer") {
println("개발자")
} else {
println("개발자아님")
}
val age : int = 10
val str = if(age > 20) {
"성인"
} else {
"미성년자"
}
val day = 2
val result = when (day) {
1 -> "월요일"
2 -> "회요일"
3 -> "수요일"
4 -> "목요일"
5 -> "금요일"
else -> "주말"
}
println(result) //결과 화요일
//예시2
enum class Color {
red, green
}
fun getColor() = Color.red
fun main() {
when (getColor()) {
Color.red -> print("RED")
Color.green -> print("GREEN")
else -> {
print("BLUE")
}
}
}
for (i in 0..3) {
print(i)
}
//결과 0123 (0<=..<=3)
for (i in 0 until 3) {
print(i)
}
//결과 012 (0<=until<3)
for (i in 0..6 step 2) {
print(i)
}
//결과 0246 (2씩증가)
for (i in 3 downTo 1) {
print(i)
}
//결과 321 (1씩감소)
val num = arrayOf(1,2,3)
for(i in num) {
print(i)
}
//결과 123 for문과 동일
val x = 5
while (x>0) {
print(x)
x--
}
//결과 54321 while문과 동일
val a : String = null
// null에 빨간 밑줄이 생겨서 알려줌
val b : String = "abc"
b= null
// null을 재할당해도 알려줌
val a : String? = null
println(a?.length)
val b : Int = if (a != null) a.length else 0
println(b)
// 결과값 null,0
// 안전연산자(?)를 붙이면 nullable하기 때문에 컴파일 오류가 사라짐
val c = a?.length ?: 0
println(c)
// 엘비스 연산자를 사용하면,
// 좌변이 null일때 우변을 리턴하여 null을 처리함
throw NullPointException()
//직접 호출하면 NPE발생함
val name: String? = null
val length: Int = name!!.length
// 단언연산자(??)를 사용하면 null이 발생하지않는
// 안전한 코드다 라고 컴파일러에게 알려주는 역할을 하는데
// 이때 null이 들어오면 NPE가 발생함
try {
Thread.sleep(1)
} catch (e: Exception) {
println("예외 발생")
} finally {
println("finally발생")
}
val a = try {
"1234".toInt()
} catch (e: Exception) {
println("예외 발생")
}
println(a)
fun failFast(massage: String): Nothing {
throw IllegalArgumentException(message)
}
//직접 호출할 수도 있다.
class Coffee {
}
// 클래스 생성
class BodyEmptyClass
// 바디가 없는 클래스 생성
class Coffee constructor(val name:String){
}
//생성자가 있는 클래스
class Coffee(
val name:String = "", // 후행쉼표
val price: Int = 0, // 후행쉼표
) {...}
fun main() {
val coffee = Coffee()
coffee.name = "아메리카노"
coffee.price = 2000
println("${coffee.name} 가격은${coffee.price})
}
// 결과 아메리카노 가격은 2000
val brand: String
get() = "스타벅스"
// getter 커스텀 방법 1
val brand: String
get() {
return "스타벅스"
}
// getter 커스텀 방법 2
val quantity: Int = 0
set(value) {
if(value>0) {
field = value
}
}
// field식별자 사용예시
coffee.iecd = true
if(coffe.iced) {
println("아이스 커피")
}
//if안에 쓰인 coffe.iced는 프로퍼티이다.
open class Cat {
open var age: Int = 0
open fun crying() {
println("냐옹")
}
}
// open키워드 사용
class Persian : Cat() { // 상속받음
override var age : Int = 0
override fun crying() {
println("미야")
}
}
// 상속받음
class RussianBlue(override var age : Int = 0) : Cat() {
override fun crying() {
println("미야")
}
}
fun main() {
val cat = RussianBlue(2)
println(cat.age)
cat.crying()
//기본생성자 사용예시
abstract class Developer {
abstract var age: Int
abstract fun code(language: String)
}
class BackendDeveloper(override var age : Int) : Developer() {
override fun code(language: String) {
println("I code with $language")
}
}
fun main() {
val backendDeveloper = BackendDeveloper(20)
println(backendDeveloper.age)
backendDeveloper.code("Kotlin")
}
//추상클래스 예시
class Product(val name: Stringm val price: Int)
Interface Wheel { //상위 인터페이스
fun roll()
}
Interface Cart : Wheel { //하위 인터페이스
var coin: Int // 구현체에서 무조건 구현해야할 추상 프로퍼티가 됨
fun add(product: Product)
fun rent() {
if (coin > 0) {
println("카트를 대여합니다.")
}
}
override fun roll() {
println("카트가 굴러갑니다.")
}
}
class MyCart(override var coin: Int) : Cart { //프로퍼티 구현함
override fun add(product: Product) {
if(coin <= 0) prontln("코인을 넣어주세요.")
else println("${product.name}이 카트에 추가되었습니다.")
}
}
fun main() {
val cart = MyCart(coin=0)
cart.rent()
val cart = MyCart(coin=100)
cart.rent()
cart.roll()
cart.add(Product(name = "연필", price = 1000))
}
// 결과값: 코인을 넣어주세요., 결과 카트를 대여합니다.,
// 카트가 굴러갑니다., 연필이 카트에 추가되었습니다.
enum class PaymentStatus(val label: String) {
UNPAID("미지급") {
override fun isPayable(): Boolean = true
},
PAID("지급완료") {
override fun isPayable(): Boolean = false
},
FAILED("지급실패") {
override fun isPayable(): Boolean = false
},
REFUNDED("환불") {
override fun isPayable(): Boolean = false
};
abstract fun isPayable(): Boolean
}
fun main() {
if(PaymentStatus.UNPAID.ispayable()) {
println("결제 가능 상태")
}
}
// 결과: 결제 가능 상태
출처: 패스트캠퍼스 코틀린강의