1. ๋ ์ธ์ดํํฐ
: Null ์์ธ๋ก๋ถํฐ ์์ ํ ์ค๊ณ๋ฅผ ์ํด ์๋ฃํ์ Null ์ฌ๋ถ๋ฅผ ๋ช ์
- ?, !!, ?. , ?:
1) ? null ํ ๋น ํ์ฉ ๊ธฐํธ
* null ํ์ฉ ์ฌ๋ถ์ ๋ฐ๋ผ String๊ณผ String? ๋ ์๋ก ๋ค๋ฅธ ์๋ฃํ์
// null์ ์ ์ฅํ์ง ์๊ณ ์ค๊ณํ๋ ค๋ฉด lateinit var ๋ก ๋์ฒดํ ์ ์์
<-- ์ด๋ฌ๋ฉด ๋์ค์ null ๊ฒ์ฌ ์ํด๋ ๋จ. ์ด๊ธฐํํ ๊ฑฐ๋ผ๊ณ ๋ณด์ฅํ๋๊ฑฐ๋๊น.
fun main(){
var s = Student()
s.name = "์ฐธ์"
s.address = "์์ธ"
s.displayInfo()
}
class Student {
lateinit var name:String
var address:String? = null //null ์ ์ฅ
fun displayInfo() {
println("์ด๋ฆ์: ${name} ์
๋๋ค")
println("์ฃผ์๋: ${address} ์
๋๋ค")
}
}
2) !! non-null ๋จ์ ๊ธฐํธ
* ๊ฐ์ ๋ก null์ด ์๋๋ผ๊ณ ํ๋ ๊ฒ. (์ฌ์ฉ ์ง์ํ ๊ฒ)
//null์ด ์์ด๋ ์ปดํ์ผ์ ์งํ๋๋ ์คํ ์ค ์์ธ ์ค๋ฅ ๋ฐ์...
fun main(){
// var data = readLine()!!.toInt() //์ด๋ ๊ฒ ํ์ค๋ก ๋ํ๋ผ ์๋ ์์
var inputData = readLine()!! //readLine ๋ฉ์๋ ํธ์ถ ์์ ๋ฆฌํด๊ฐ์ด null์ด ์๋์ ๋ณด์ฅ
var data = inputData.toInt() //์ฌ๊ธฐ์ null ์ฒดํฌ๋ฅผ ํ์ง ์์. ์์์ ๋ณด์ฅํ๋๊น!
println("Null์๋ ๊ฐ: ${data}")
}
3) ?. ์์ ํธ์ถ์ฐ์ฐ์, ์ธ์ดํ ์ฝ
: null์ด ํ ๋น๋์ด์์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ณ์๋ฅผ ๊ฒ์ฌ, ์์ ํ๊ฒ ํธ์ถ. null์ด๋ฉด ์ ๊ทผ X
fun main(){
var s = Student()
s.name = "์ฐธ์" //์ด ๋จ๊ณ์์ address๋ null์
s.displayAddressLength()
s.address = "์์ธ" //์ฌ๊ธฐ์์ address๊ฐ ๋ฐ๋
s.displayInfo()
}
class Student {
lateinit var name:String
var address:String? = null
fun displayInfo() {
println("์ด๋ฆ์: ${name} ์
๋๋ค")
println("์ฃผ์๋: ${address} ์
๋๋ค")
}
fun displayAddressLength() {
println("์ฃผ์์ ๊ธธ์ด๋: ${address?.length} ์
๋๋ค") //null์ด๋ฉด ํธ์ถ๋์ง ์์
}
}
4) ?: ์๋น์ค ์ฐ์ฐ์
: ๋ณ์๊ฐ null์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ, null์ด ์๋๋ฉด ์ข์ธก ์์, null์ด๋ฉด ์ฐ์ธก ์ ์คํ
fun main(){
var s = Student()
s.name = "์ฐธ์"
s.displayAddressLength()
s.address = "์์ธ"
s.displayInfo()
}
class Student {
lateinit var name:String
var address:String? = null
fun displayInfo() {
println("์ด๋ฆ์: ${name} ์
๋๋ค")
println("์ฃผ์๋: ${address} ์
๋๋ค")
}
fun displayAddressLength() {
println("์ฃผ์์ ๊ธธ์ด๋: ${address?.length ?: "์ด๊ธฐํํ์ธ์"} ์
๋๋ค")
//?.length๋ก ํ๋ฒ ๊ฒ์ฌ๋ฅผ ํ๋๋ฐ ๊ทธ ๋ค์ ?:๋ก ์ด๋ค๊ฑธ ๋ฆฌํดํ ์ง ๊ฒฐ์
}
}
2. ํ์ฉ
fun main() {
val worldName = "์ค์ฝ์๋"
var myName = inputMyInfo("name").toString() //" " ์์ ์ข
๋ฅ ๋ฃ์ด์ฃผ๊ธฐ
var myAge = inputMyInfo("age").toString().toInt() //๋ฐ์์ ๋ฆฌํด๊ฐ์ด ์ซ์๋ผ์ .toString().toInt()
var myJob = inputMyInfo("job").toString()
var isNamePass = true
var names = arrayOf("์ฐธ์", "๊ฟฉ", "๋น๋๊ธฐ")
for(name in names) {
if(myName == name) {
println("์ค๋ณต๋ ์ด๋ฆ์ด ์กด์ฌํฉ๋๋ค.")
isNamePass = false //๋ฐ์์ && ์ด์ฉํด ๋ค ๋ง์กฑ ์์๋ง ๋์ด๊ฐ๊ฒ
break
}
}
fun inputMyInfo(type:String): Any? { //๋ชจ๋ ํ์
๋๋ null์ ๋ฐํ ๊ฐ๋ฅ
return when(type) {
"name" -> {
println("์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์")
while(true) {
try {
var originName = readLine()
if(originName?.first() != '_' && originName?.first() != '!') { //.first()๋ ์ฒซ๋ฒ์งธ ์ธ์ ๋ฐํ
return originName
} else {
println("์ด๋ฆ์ ๋ค์ ์
๋ ฅํด์ฃผ์ธ์")
}
} catch(e:Exception) { //์์ธ์ฒ๋ฆฌ
println("์ด๋ฆ์ ๋ค์ ์
๋ ฅํด์ฃผ์ธ์")
}
}
}
"age" -> {
println("๋์ด๋ฅผ ์
๋ ฅํด์ฃผ์ธ์")
while(true) {
try {
var originAge:String? = readLine()
return originAge?.toInt() ?: -1 //originAge๊ฐ null์ด ์๋๋ฉด .toInt()๊ฐ ๋ฆฌํด, ์๋ -1๋ฆฌํด
} catch(e:Exception) {
println("๋์ด๋ฅผ ๋ค์ ์
๋ ฅํด์ฃผ์ธ์")
}
}
}
"job" -> {
println("์ง์
์ ์
๋ ฅํด์ฃผ์ธ์")
while(true) {
try {
var originName = readLine()
if(originName?.equals("๊ถ์") == true || originName?.equals("๋ง๋ฒ์ฌ") == true) {
return originName
} else {
println("์ง์
์ ๋ค์ ์
๋ ฅํด์ฃผ์ธ์")
}
} catch(e:Exception) {
println("์ง์
์ ๋ค์ ์
๋ ฅํด์ฃผ์ธ์")
}
}
}
else -> {
return "no"
}
}
}