---
title: Область видимости
seo:
  title: Область видимости — Kotlin Developer
  description: "Тема «Область видимости» для собеседования Kotlin Developer. Опишите, что представляет собой область видимости (scope). Какие модификаторы видимости есть в Kotlin и чем они отличаются?"
---

[Все темы Kotlin Developer](/kotlin-developer)

## <strong>Опишите, что представляет собой область видимости</strong> <code>&#40;scope&#41;</code><strong>.</strong> [#q-14bee738d69b8107b76fc3f41224be6d]

Область видимости (scope) в программировании определяет доступность переменных и других идентификаторов в определенных частях кода. Это означает, что переменная может быть использована только в определенном контексте, который определяется областью видимости, в которой она была объявлена. Область видимости может быть локальной (ограниченной блоком кода), глобальной (доступной из любой части программы) или принадлежать к другим уровням, таким как классы, функции, модули и т.д.

:::note[Ссылки для изучения]

1. [Функции области видимости в Kotlin](https://kotlinlang.ru/docs/scope-functions.html)
   :::

---

## Какие модификаторы видимости есть в Kotlin и чем они отличаются? [#q-14bee738d69b817681f0e40e13ff9c97]

В Kotlin существуют следующие типы областей видимости&#58;

1. <code>public</code>&#58; Видимость по умолчанию. Доступно везде.

1. <code>private</code>&#58; Видимость только в пределах класса или файла.

1. <code>protected</code>&#58; Видимость в пределах класса и подклассов.

1. <code>internal</code>&#58; Видимость в пределах модуля.

:::note[Ссылки для изучения]

1. [Функции области видимости в Kotlin](https://kotlinlang.ru/docs/scope-functions.html)
   :::

---

## <strong>Как работает ключевое слово</strong> <code>private</code> <strong>в контексте класса и объекта?</strong> [#q-14bee738d69b816cac09e718ce4d2f26]

<code>Private</code> в контексте класса и объекта&#58;

- <strong>В контексте класса</strong>&#58; Члены, объявленные с
  <code>private</code>, видны только внутри этого класса.

  ```kotlin
  class MyClass {
      private val secret = "Secret"
      fun revealSecret() = secret
  }
  ```

- <strong>В контексте файла</strong>&#58; Функции и свойства, объявленные с
  <code>private</code>, видны только внутри этого файла.

  ```kotlin
  private fun secretFunction() = "Secret Function"
  ```

:::note[Ссылки для изучения]

1. [Функции области видимости в Kotlin](https://kotlinlang.ru/docs/scope-functions.html)
   :::

---

## <strong>Объясните, как использовать</strong> <code>internal</code> <strong>в Kotlin и в каких случаях это полезно.</strong> [#q-14bee738d69b8112adf7e4de6c7e0804]

<code>internal</code> означает, что элемент виден только в пределах модуля, в
котором он объявлен.

Пример&#58;

```kotlin
internal class InternalClass {
    internal val internalProperty = "Internal Property"
}

fun main() {
    val instance = InternalClass()
    println(instance.internalProperty)
}
```

Полезно для&#58;

- Сокрытия реализации внутри модуля.

- Защиты внутренних деталей библиотеки, оставляя публичными только необходимые части.

:::note[Ссылки для изучения]

1. [Функции области видимости в Kotlin](https://kotlinlang.ru/docs/scope-functions.html)
   :::

---

## <strong>Что такое</strong> <code>&#34;shadowing&#34;</code> <strong>переменных и как его избежать?</strong> [#q-14bee738d69b81c4b90bc22d94713c96]

<code>Shadowing</code> — это ситуация, когда локальная переменная скрывает
переменную с таким же именем из внешней области видимости.

Пример&#58;

```kotlin
val x = 10
fun printX() {
    val x = 20  // Эта переменная скрывает внешнюю переменную x
    println(x)  // Выведет 20
}
```

Чтобы избежать <code>shadowing</code>&#58;

- Используйте уникальные имена для переменных.

- Избегайте дублирования имен переменных в разных областях видимости.

```kotlin
val outerX = 10
fun printX() {
    val innerX = 20
    println(innerX)  // Теперь переменные имеют разные имена
}
```

:::note[Ссылки для изучения]

1. [Функции области видимости в Kotlin](https://kotlinlang.ru/docs/scope-functions.html)
   :::
