1. Папка src — где живёт ваш код
Если бы Kotlin-проект был домом, то папка src (от слова source) — это уютная гостиная, где собираются все основные обитатели. Именно сюда помещаются все исходные файлы с кодом, а не в корень проекта, не в папку с настройками и не на рабочий стол (даже если очень хочется).
Почему отделять исходники от всего остального?
- В папке
srcхранятся только файлы, которые вы пишете руками: .kt. - Всё, что появляется в процессе сборки (скомпилированные .class-файлы, которые читает виртуальная машина JVM), складывается в другие папки out, build и т.д.
- Это облегчает навигацию, делает проект чище, а IDE — счастливее.
Пример структуры простого проекта:
MyFirstProject/
├── .idea/ # служебные файлы IntelliJ IDEA, не трогаем
├── out/ # тут появляются скомпилированные .class-файлы
├── src/ # вот тут живёт ваш исходный код!
│ └── Main.kt
├── MyFirstProject.iml
└── README.md
src. Не кладите туда картинки, музыку и секретные рецепты — для этого существуют другие папки.
2. Пакеты package
Когда ваш код перерастает один файл Main.kt, в Kotlin принято группировать файлы по "пакетам" — это как папки в файловой системе, только для кода. Пакеты помогают:
- Избежать конфликтов имён. Если в проекте две разные функции
calculate(), но они лежат в разных пакетах — они не будут мешать друг другу. - Логически структурировать код. Например,
com.kotlin.lesson05,com.kotlin.utils.
Синтаксис объявления пакета
На самой первой строке каждого Kotlin-файла пишется:
package com.kotlin.lesson05
Это значит: всё содержимое этого файла принадлежит пакету com.kotlin.lesson05.
Важное правило хорошего тона:
В отличие от Java, компилятор Kotlin позволяет положить файл с пакетом com.kotlin прямо в корень папки src. Но делать так категорически не рекомендуется! Официальный стиль Kotlin Style Guide требует, чтобы структура папок на диске строго совпадала с именем пакета. То есть путь к файлу должен быть таким:
src/com/kotlin/lesson05/Main.kt
Как создать пакет в IntelliJ IDEA
- В панели проекта кликните правой кнопкой мыши по папке
src. - Выберите New → Package.
- Введите имя, например: com.kotlin.lesson05 (IDE сама создаст нужные вложенные папки).
- Теперь создайте новый файл внутри этого пакета: клик правой кнопкой мыши по папке com.kotlin.lesson05 → New → Kotlin Class/File → введите имя, например,
Utils.
Пример:
src/
└── com/
└── kotlin/
└── lesson05/
└── Utils.kt
Обратите внимание на путь к вашему файлу в панели снизу. Помните, при создании проекта мы поставили галочку Use compact project structure? Вот как она работает.
Если убрать компактный режим, то будут пустые папки.
Почему нельзя просто всё складывать в src?
Если положить все файлы вперемешку, проект быстро превратится в "свалку", где найти нужную функцию будет сложнее, чем найти зарядку для ноутбука в студенческом общежитии. Используйте пакеты — так будет проще ориентироваться в проекте.
3. Полное имя
Каждая функция или инструмент из стандартной библиотеки Kotlin тоже находится в своём пакете. Например:
- Математическая функция для поиска максимума max() лежит в пакете kotlin.math. Её полное имя — kotlin.math.max.
- Генератор случайных чисел Random лежит в kotlin.random. Полное имя — kotlin.random.Random.
То есть полное имя = имя пакета + точка + имя функции/класса.
Попробуем использовать это в коде, чтобы найти максимальное из двух чисел:
fun main() {
val a = 10
val b = 20
val maximum = kotlin.math.max(a, b)
println("Maximum number: $maximum")
}
Здесь мы явно пишем kotlin.math.max. Компилятор точно понимает, какую именно функцию мы вызываем.
4. Оператор import
Писать каждый раз полное длинное имя жутко неудобно. Именно для этого в Kotlin существует оператор import (импорт).
Если мы пишем в самом верху файла, сразу под package:
import kotlin.math.max
Это значит: "В этой программе я буду использовать функцию max из пакета kotlin.math". После этого мы можем писать коротко и красиво:
val maximum = max(10, 20)
Обычный import
Мы указываем конкретный инструмент, который хотим использовать:
import kotlin.math.max
import kotlin.random.Random
Импорт всего пакета *
Иногда нам нужно сразу много математических функций. Тогда можно написать звёздочку:
import kotlin.math.*
Это значит: "Разрешить использовать ВСЁ из пакета kotlin.math без полного имени".
Default Imports
Вы наверняка задались вопросом: "Подождите, но мы ведь уже пользовались println(), readln() и типом String без всяких импортов! Как это работало?"
Дело в том, что язык Kotlin заботится о вас. В каждый ваш файл он "невидимо" добавляет так называемые базовые импорты. Пакеты kotlin.*, kotlin.io.* где живут функции ввода-вывода, kotlin.collections.* импортируются по умолчанию. Поэтому самые частые команды доступны вам сразу "из коробки".
5. Classpath — как JVM ищет ваш код
Classpath — это "маршрут", по которому виртуальная машина Java (JVM) ищет ваши скомпилированные программы перед запуском. Можно представить это как список папок, где JVM будет искать нужные .class-файлы (в которые Kotlin превратил ваш код).
По умолчанию IntelliJ IDEA всё делает за вас. Она сама добавляет папку со скомпилированным кодом, например, out/production/ProjectName в classpath. То есть, если вы написали код в пакете com.kotlin.lesson05, IDEA сама объяснит виртуальной машине, где его найти.
Вам пока не нужно настраивать его вручную, но если вы увидите в консоли странную ошибку вроде "ClassNotFoundException" — знайте, проблема где-то в путях сборки.
6. Организация кода в проекте
В Kotlin нет правила «Один класс = один файл»
Если вы когда-нибудь слышали о Java, то знаете её жесткое правило: имя публичного класса обязано совпадать с именем файла. В Kotlin программировать гораздо удобнее: в одном файле может находиться сколько угодно функций или классов.
Главное правило Kotlin — логическая группировка. Если у вас есть функции для математики, положите их в файл MathUtils.kt.
src/com/kotlin/lesson05/MathUtils.kt
package com.kotlin.lesson05
fun calculateSum(a: Int, b: Int): Int {
return a + b
}
fun calculateDifference(a: Int, b: Int): Int {
return a - b
}
Файл должен называться осмысленно. Названия вроде aaa.kt или Test2.kt IDEA стерпит, но вы сами запутаетесь в них через пару дней.
Где хранить ресурсы (картинки, текстовые файлы)?
- Если вашей программе нужно читать текст из стороннего файла, для ресурсов обычно создают отдельную папку в корне проекта, например, resources или data.
- В IntelliJ IDEA можно сообщить проекту, что это важная папка: правый клик по папке → Mark Directory as → Resources Root.
Пример правильной структуры:
MyFirstProject/
├── src/
│ └── com/kotlin/lesson05/
│ └── Main.kt
├── resources/
│ └── config.txt
7. Типичные ошибки при работе со структурой проекта
Слово package написано не на первой строке
В Kotlin объявление пакета package обязано быть первой значимой строкой в файле (комментарии до него писать можно, а вот код или импорты — нет). Если вы напишете импорты, а под ними пакет — компилятор выдаст ошибку.
Несовпадение структуры папок и пакета
Если в начале файла написано package com.kotlin.lesson05, а сам файл физически лежит просто в src, IDEA подчеркнет название пакета желтым, предупреждая о несоответствии. Помните о правилах хорошего тона: папки должны отражать пакеты!
Ручное перемещение файлов через проводник Windows/macOS
Если вы переместили файл .kt в другую папку через обычный проводник на компьютере, строка package внутри файла сама не обновится, и проект сломается. Делайте перемещения (Drag and Drop) только внутри окна Project в IntelliJ IDEA — умная среда сама обновит все пакеты и пути!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ