Do it! 코틀린 프로그래밍 [셋째마당, 코틀린 표준 라이브러리의 활용] 학습
📌 apply() 함수
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this}fun main() {
data class Person(var name: String, var skills: String)
ver person = Person("Kildong", "Kotlin")
val returnObj = person.apply {
this.name = "Sean" // this는 person 객체
skills = "Java" // this 생략 가능
}
}
📌 run() 함수
public inline fun <R> run(block: () -> R): R = return block()public inline fun <T, R> T.run(block: T.() -> R): R = return block()apply()와 똑같이 동작하지만 수신객체가 아닌 run블록의 마지막 라인을 returnfun main() {
data class Person(var name: String, var skills: String)
var person = Person("Kildong", "Kotlin")
val returnObj = person.apply {
name = "Sean"
skills = "Java"
"success" //사용되지 않음, person객체 반환
}
val returnObj2 = person.run {
name = "Dooly"
skills = "C#"
"success" // 문자열 반환
}
}
📌 with() 함수
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()run() 함수와 기능이 거의 동일한데, with()함수에서는 receiver로 전달할 객체를 처리하므로 객체의 위치가 달라짐fun main() {
data class Person(var name: String, var skills: String)
var person = Person("Kildong", "Kotlin")
val result = with(person) {
name = "Sean"
skills = "Java"
}
}
📌 use() 함수
public inline fun <T: Closeable?, R> T.use(block: (T) -> R): Rclose() 함수를 자동적으로 호출해 닫아줌fun main() {
PrintWriter(FileOutputStream("d:\\test\\output.txt")).use {
it.println("hello")
}
}
📌readLine() 함수
fun main() {
print("Enter: ")
val input = readLine()!!
println("You entered: $input")
}
-> 표준 입력 장치인 콘솔로부터 입력받아 input에 String형으로 할당
-> 입력에 실패할 경우 null 가능성이 생기기 때문에 !! 혹은 ?를 사용해 NPE 발생 여부 처리
-> 입력받은 값들은 문자열 값이 기본
📌 Kotlin의 입출력 API
| 처리 목적 | 관련 자바 라이브러리 |
|---|---|
| 파일 처리 | java.io.File |
| 바이트 단위의 입력 처리 | java.io.InputStream |
| 바이트 단위의 출력 처리 | java.io.OutputStream |
| 문자 기반 읽기 처리 | java.io.Reader |
| 문자 기반 쓰기 처리 | java.io.Writer |
| 버퍼를 가진 읽기 처리 | java.io.BufferedReader |
📌 자바의 io, nio 개념
| 구분 | java.io | java.nio |
|---|---|---|
| 입출력 | 스트림(Stream)방식 | 채널(Channel) 방식 |
| 버퍼 방식 | 넌버퍼(Non-buffer) | 버퍼(Buffer) |
| 비동기 지원 | 지원 안 함(블로킹 방식) | 지원함(넌블로킹 지원) |
📌 스트림과 채널
📌 넌버퍼와 버퍼 방식
📌 블로킹과 넌블로킹
📍 URI(Uniform Resource Identifier) : URL과 비슷하게 사용되는데 각종 자원의 위치를 식별하기 위해 사용하는 규약
📌 File의 PrintWriter
print(), printf(), write() 등..)를 제공하고 있어 기존에 콘솔에 출력하듯이 바이트 단위로 파일에 쓸수 있음fun main() {
val outString: String = "안녕하세요!"
val path = "D:\\test\\testfile.txt"
// use() 내부적으로 close()를호출
File(path).printWriter().use { it.println(outString) }
// 메모리의 특정 공간에 저장한 뒤 파일로 다시 쓰여짐
File(path).bufferedWriter().use { it.write(outString) }
}
📌 File의 writeText()
val file = File(path)
file.writeText(outString)
file.appendText(" Do great work!") // 파일에 문자열을 추가
📌 File의 FileReader
fun main() {
val path = "D:\\test\\testfile.txt"
try {
val read = FileReader(path)
println(read.readText())
} catch (e: Exception) {
println(e.message)
}
}
-> read의 멤버 메서드 readText() 를 통해 읽어옴
-> readText()는 내부적으로 StringWriter()를 호출해 텍스트를 메모리로 가져온 후 그 내용을 반환
📌 코틀린의 파일 읽기
fun main() {
val path = "D:\\test\\testfile.txt"
val file = File(path)
val inputStream: InputStream = file.inputStream()
val text = inputStream.bufferedReader().use { it.readText() }
print(text)
}
⬇️ BufferedReader로만 구성
fun main() {
val path = "D:\\test\\testfile.txt"
val bufferedReader: BufferedReader = File(path).bufferedReader()
val inputString = bufferedReader.use { it.readText() }
print(inputString)
}
-> file객체를 생략하고 BufferedReader로만 구성
-> 줄단위로 처리하려면 use() 대신 useLines()를 사용할 수 있음
-> 마찬가지로 useLines()는 처리가 완료된 뒤 파일을 닫아줌
📌 copyTo() 함수
File(path).copyTo(File("D:\\test\\testfile.txt"))