Kotlin에서 스코프(scope)는 변수, 함수, 객체 등이 접근 가능한 영역을 정의하는 개념입니다. 코틀린의 스코프는 블록(block), 클래스, 패키지, 그리고 파일 단위로 나뉘며, 이 스코프는 프로그램의 구조와 가독성, 유지보수성을 크게 향상시킵니다.


1. 스코프의 종류

(1) 지역 스코프 (Local Scope)

  • 변수나 함수가 특정 블록 {} 내에서만 접근 가능.
  • 일반적으로 if, for, while, 또는 함수 내에서 사용.

(2) 클래스 스코프 (Class Scope)

  • 클래스 내부에서 정의된 변수와 메서드는 해당 클래스의 스코프 안에서 접근 가능.
  • 클래스 내의 변수는 기본적으로 인스턴스 변수(멤버 변수)로 관리.

(3) 파일 스코프 (File Scope)

  • 파일에 정의된 함수나 변수는 파일 내부에서만 접근 가능.
  • 다른 파일에서 접근하려면 public, internal, private 접근자를 사용.

(4) 패키지 스코프 (Package Scope)

  • 패키지 내에 정의된 함수, 클래스, 객체 등이 패키지 내부에서 접근 가능.
  • 코틀린은 기본적으로 패키지 스코프를 제공하며, Java처럼 명시적으로 package를 선언하지 않아도 됨.

 

2. 스코프별 예시

(1) 지역 스코프

fun localScopeExample() {
    val outerVariable = "I'm accessible throughout this function"

    if (true) {
        val innerVariable = "I'm only accessible inside this if block"
        println(innerVariable) // 접근 가능
    }

    // println(innerVariable) // 오류: innerVariable은 if 블록 외부에서 접근 불가
    println(outerVariable) // 접근 가능
}

 

(2) 클래스 스코프

class Person(val name: String) {
    private val age: Int = 30 // 클래스 내부에서만 접근 가능

    fun displayInfo() {
        println("Name: $name, Age: $age") // 접근 가능
    }
}

fun classScopeExample() {
    val person = Person("John")
    person.displayInfo() // 가능
    // println(person.age) // 오류: age는 private 스코프
}

 

(3) 파일 스코프

private val fileVariable = "I'm only accessible in this file"

fun publicFunction() {
    println("I'm accessible from other files if imported")
}

private fun privateFunction() {
    println("I'm only accessible in this file")
}

 

다른 파일에서

import com.example.Utils.publicFunction

fun fileScopeExample() {
    publicFunction() // 가능
    // privateFunction() // 오류: privateFunction은 접근 불가
    // println(fileVariable) // 오류: fileVariable은 접근 불가
}

 

(4) 패키지 스코프

package com.example

fun packageScopedFunction() {
    println("I'm accessible within this package")
}

다른 패키지에서:

import com.example.packageScopedFunction

fun main() {
    packageScopedFunction() // 가능 (default: public)
}

3. Kotlin 스코프 함수

코틀린에는 **스코프 함수(scope functions)**라고 하는 특수한 함수도 있습니다. 이 함수들은 람다 블록 내에서 객체를 다룰 수 있는 간결한 방법을 제공합니다.

스코프 함수 종류

  • let
  • run
  • with
  • apply
  • also

 

kotlin 스코프 함수에 대해서는 다음번 글에 상세히 알아아보도롭 하겠습니다.

코틀린 suspend에 대한 내용을 아래와 같이 정리해보았습니다. 

개념 및 사용예제를 통해 이해해보자.

 

suspend란?

Kotlin에서 suspend 키워드는 코루틴을 사용해 비동기 작업을 처리하기 위해 함수에 붙이는 키워드입니다. suspend 함수는 일반 함수처럼 호출할 수 없으며, 코루틴 내부 또는 다른 suspend 함수에서만 호출할 수 있습니다. 이는 해당 함수가 잠재적으로 시간이 오래 걸릴 수 있는 작업을 포함하고 있다는 의미입니다. 예를 들어, 네트워크 요청이나 파일 I/O와 같은 작업은 코루틴을 사용해 메인 스레드를 차단하지 않고 처리할 수 있습니다.

 

suspend 함수의 특징

  1. 비동기 처리 지원: suspend 함수는 비동기로 실행될 수 있어 메인 스레드를 차단하지 않고도 장시간 작업을 수행할 수 있습니다.
  2. 컨텍스트 전환: suspend 키워드를 사용하면 코루틴이 특정 시점에서 중단되었다가 다시 재개될 수 있어 효율적인 스레드 관리가 가능합니다.
  3. 코드 가독성 향상: suspend 함수는 일반적인 비동기 콜백 코드보다 가독성이 높아지고 유지보수성이 증가합니다.

 

suspend 함수 예제

suspend fun fetchData(): String {
    delay(1000L) // 네트워크 요청을 시뮬레이션하는 지연 함수
    return "데이터가 성공적으로 로드되었습니다."
}

fun main() = runBlocking {
    println("로딩 중...")
    val result = fetchData() // `fetchData`가 완료될 때까지 기다립니다.
    println(result)
}

 

위 예제에서 fetchData는 suspend 함수이므로, runBlocking과 같은 코루틴 빌더 내부에서 호출해야 합니다. delay 함수는 일종의 비동기 함수로, Thread.sleep과 달리 스레드를 차단하지 않고 지연을 발생시킵니다.

 

언제 suspend를 사용할지 고려해야 하는 경우

  • 네트워크 요청: 서버에서 데이터를 가져오는 HTTP 요청
  • 데이터베이스 쿼리: 로컬 또는 원격 데이터베이스 접근
  • 파일 I/O 작업: 파일 읽기 및 쓰기 작업
  • 리스트나 대량 데이터 처리: 비동기적으로 처리할 때 유리합니다.

suspend 함수를 설계할 때 작업의 시간이 오래 걸릴 것으로 예상되거나 비동기 처리가 필요한 경우에만 적용하는 것이 좋습니다.

'Kotlin' 카테고리의 다른 글

[코틀린] 스코프란? - 개념 이해하기  (0) 2024.11.22
코틀린에서 함수 재정의(overriding)하기  (2) 2024.11.06

코틀린에서도 자바와 같이 함수를 재정의(overriding) 할 수있습니다.

아래의 정리된 내용은 코틀린에서 함수를 재정의 방법을 정리한 내용이다. 

 

* 함수재정의(overriding)

// super class
open class SmartDevice(val name: String, val category: String) {
	
	open fun turnOn() {
	
	}
	
	open fun turnOff() {
	
	}
}

class SmartTvDevice(deviceName: String, deviceCategory: String) :
	SmartDevice(name = deviceName, category = deviceCategory) {

	override fun turnOn() {
		// super.turnOn()
		println("SmartTV Turn On")
	}
	override fun turnOff() {
		// super.turnOff()
		println("SmartTV Turn Off")
	}
}

 

부모 클래스(슈퍼클래스)의 함수를 재정의 할 때는 재정의가 필요한 부모클래스 함수의 이름 앞에 open 키워드를 써준다.

자식 클래스(서브클래스) 앞에는 override 키워드를 입력하면 재정의를 할수 있다.(자바의 override와 같음)

위 소스코드에 자식 클래스의 오버라이드한 함수안에 주석을 제거 할 경우(super.turnOn() or super.turnOff()) 부모 클래스의 함수를 실행 후 자식 클랙스의 함수를 실행한다. super키워드를 사용하지 않을 경우 부모 함수내의 로직은 무시된다.

 

 

* 서브클래스에서 슈퍼클래스 속성 재정의

 

코틀린에서는 속성값에도 재정의를 사용할수 있다.

// super class
open class SmartDevice(val name: String, val category: String) {
	open val deviceType: String = "Unknow"
}

// sub class
class SmartTvDevice(deviceName: String, deviceCategory: String) :
	SmartDevice(name = deviceName, category = deviceCategory) {

	override val deviceType: String = "Smart TV"
}

 

 

코틀린에서 함수 또는 속성값을 재정의하는 것을 알아보았다.

여기서 핵심으로 기억해야 할 것들은 재정의하고자 하는 부모의 함수 또는 속성값 앞에 "open " 키워드를 입력해줘야한다.

또한 재정의하는 자식 클래스의 함수(또는 속성값)앞에 "override" 키워드를 입력해준다.

'Kotlin' 카테고리의 다른 글

[코틀린] 스코프란? - 개념 이해하기  (0) 2024.11.22
[코틀린] suspend란? - 비동기 작업 처리  (0) 2024.11.14

+ Recent posts