Kotlinでの無限ループの作り方とその対処法12選

Kotlinを使った無限ループの詳細解説 Kotlin
この記事は約12分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、Kotlinでの無限ループの作り方やその対処法を習得することができるようになります。

無限ループはプログラミングにおいて頻繁に出会う現象です。

それは、プログラムが予定された終了ポイントに達することなく、延々と続いてしまう状態を指します。

これは時として意図的に用いられることもありますが、多くの場合、プログラマのミスから発生するものです。

●Kotlinと無限ループとは

Kotlinは、静的型付けプログラミング言語で、Javaに比べてシンプルで安全なコードを書くことができます。

Androidアプリ開発の主要言語としても注目されており、その学習が推奨されています。

○Kotlinの基本概要

KotlinはJetBrainsによって開発されました。

この言語の特徴は、簡潔で読みやすいコードを書けること。

また、Javaと100%互換性があるため、Javaで書かれたコードと混在させて使用することが可能です。

そのため、Javaを基本にしている人でも比較的スムーズに移行、あるいは並行して学ぶことができます。

無限ループとは、文字通りプログラムのループが無限に続いてしまう現象です。

これは、条件判定のミスや、ループを抜ける処理の不足などから起こります。

無限ループは意図的に作成することもありますが、多くの場合はバグやエラーとして扱われ、その解消が求められます。

○無限ループの概要とその特徴

無限ループは、特定の条件が満たされない限り、ループが終わらない状態を指します。

これはコードのバグ、つまり、プログラマのエラーから発生することが多いですが、意図的に無限ループを作成して、特定の条件下でのみループを終了させる、という使い方も一般的です。

無限ループが発生すると、プログラムはそのループ内でずっと動作を続け、次のステップに進むことができません。

これにより、プログラム全体が停止したり、意図しない動作を引き起こしたりする可能性があります。

そのため、無限ループを意図的に利用する場合でも、それを制御するスキルと知識が必要です。

●Kotlinでの無限ループの作り方

無限ループというのは、プログラムが終わらないループを意味します。

一般にこれはエラーとして認識されることが多いですが、ある特定の条件下では意図的に使用されることもあります。

ここでは、Kotlinでの無限ループの作り方を3つのサンプルコードと共に紹介します。

○サンプルコード1:基本的な無限ループの作成

このコードでは、最もシンプルな無限ループの形を表しています。

fun main() {
    while (true) {
        println("これは無限ループです。")
    }
}

このコードを実行すると、「これは無限ループです。」という文字が延々と表示され続けます。

while(true)という条件式が常にtrueであるため、ループが終了することはありません。

○サンプルコード2:条件を使用した無限ループ

このコードでは、特定の条件下でのみ無限ループを実行します。

fun main() {
    var input: String?
    do {
        println("終了するには exit と入力してください。")
        input = readLine()
    } while (input != "exit")
}

このコードを実行すると、「終了するには exit と入力してください。」というメッセージが表示され、ユーザーがexitと入力するまでループが継続します。

ユーザーがexitを入力すると、ループが終了します。

○サンプルコード3:リストを用いた無限ループ

このコードでは、リストの要素をひとつずつ取り出して処理し、リストの要素がなくなったら最初から繰り返すという無限ループを表しています。

fun main() {
    val list = listOf("A", "B", "C")
    while (true) {
        for (item in list) {
            println(item)
        }
    }
}

このコードを実行すると、ABCという文字が順に表示され、Cの後には再びAから表示が始まります。

このように、リストの最後の要素まで処理が終わると、再びリストの最初から処理が始まるため、無限ループが発生します。

●無限ループの詳細な対処法

Kotlinを使用してプログラミングを行っている際、意図しない無限ループが発生することがあります。

このような場合、アプリケーションがフリーズしたり、予期しない動作を引き起こす可能性があります。

そこで、ここでは、無限ループが発生したときの対処法を3つのサンプルコードを用いて紹介します。

○サンプルコード4:無限ループの停止方法

無限ループが発生した場合、まずはそのループを安全に停止する方法を知ることが重要です。

下記のコードでは、特定の条件下でループを停止する方法を表しています。

var counter = 0

fun main() {
    while (true) {
        println("ループ実行中...")
        counter++

        // counterが5になった時点でループを終了
        if (counter == 5) {
            println("ループを終了します。")
            break
        }
    }
}

このコードを実行すると、ループが5回実行された後、”ループを終了します。”と表示され、ループが停止します。

breakキーワードを使用することで、無限ループから抜けることができます。

○サンプルコード5:例外処理を用いた無限ループの対処

例外処理を利用して、エラーが発生した場合にループを終了する方法も効果的です。

fun main() {
    try {
        while (true) {
            println("ループ実行中...")
            // 何らかのエラーが発生した場合を想定して例外を発生
            throw Exception("エラーが発生しました。")
        }
    } catch (e: Exception) {
        println(e.message)
    }
}

上記のコードは、例外が発生した際にそのエラーメッセージを表示して、無限ループから脱出します。

○サンプルコード6:外部入力でループを抜ける方法

ユーザーの入力を受け取り、その入力に基づいてループを終了する方法も考えられます。

fun main() {
    while (true) {
        println("終了する場合は「exit」と入力してください。")
        val input = readLine()

        if (input == "exit") {
            println("ループを終了します。")
            break
        }
    }
}

ユーザーがexitと入力すると、”ループを終了します。”と表示されてループが停止します。

このように、外部からの入力を利用して制御を行うことも可能です。

●Kotlinでの無限ループの応用例

無限ループは、単にプログラムのバグや誤動作として知られるだけでなく、多くの応用的なシーンで利用される重要な技術です。

アニメーションの再生やゲームのメインループ、ユーザーからの入力を待機する際など、無限ループを適切に使用することで、多彩な表現や効果を得ることができます。

ここでは、Kotlinでの無限ループの具体的な応用例を3つのサンプルコードを通して紹介します。

○サンプルコード7:無限ループを用いたアニメーション

アニメーションのループ再生には無限ループが活用されることがよくあります。

下記のコードは、簡易的な文字アニメーションを表しています。

fun main() {
    var index = 0
    val animationFrames = listOf("◡", "⬤", "◠")

    while (true) {
        print("\r${animationFrames[index]}")
        Thread.sleep(500)
        index = (index + 1) % animationFrames.size
    }
}

上記のコードを実行すると、画面上で「◡」、「⬤」、「◠」が順番に表示され、疑似的なアニメーションを作成します。

○サンプルコード8:ゲームループの作成

ゲーム開発における中核となるのがゲームループです。

このループ内で、ゲームの更新や描画処理が繰り返し行われます。

fun main() {
    while (true) {
        updateGame()
        drawGame()
        Thread.sleep(16)  // 60FPSを目指す場合の待機時間
    }
}

fun updateGame() {
    // ゲームのロジックやキャラクターの動きなどの更新処理
}

fun drawGame() {
    // ゲームの画面描画処理
}

このコードは、ゲームの更新と描画を約60FPSで繰り返し行う基本的なゲームループの構造を示しています。

○サンプルコード9:ユーザー入力待ちのループ

特定の操作や入力をユーザーから待つ場合、無限ループを使用して入力を監視します。

fun main() {
    var userInput: String?

    do {
        println("操作を選択してください:(1.開始 2.終了)")
        userInput = readLine()
    } while (userInput != "2")

    println("アプリケーションを終了します。")
}

ユーザーが「2.終了」を選択するまで、操作の選択を繰り返し促します。

このように、ユーザーの意図した操作を得るための方法として無限ループが使われます。

●無限ループの詳細な注意点

無限ループは有効な場面が多く存在する一方で、正しく管理しないとアプリケーションの挙動やパフォーマンスに大きな影響を及ぼすことがあります。

特に、無限ループによって引き起こされるメモリリークやCPUの高負荷は、プログラムの安定性や快適性を低下させる原因となるため、注意が必要です。

ここでは、それらの問題点と対策について詳しく解説します。

○サンプルコード10:メモリリークを防ぐための対策

無限ループ内で新しいオブジェクトを継続的に生成すると、メモリリークのリスクが高まります。

下記のサンプルコードは、そのようなリスクを低減する方法を表しています。

var myList = mutableListOf<String>()

while (true) {
    // 危険な例:無限ループ内で新しいオブジェクトを継続的に生成
    // myList.add(UUID.randomUUID().toString())

    // 対策:オブジェクトの生成を最小限に抑える
    if (myList.size < 10) {
        myList.add(UUID.randomUUID().toString())
    } else {
        myList.clear()
    }
}

このコードでは、リストが10件以上のデータを持つ場合にリストをクリアすることで、無駄なメモリの消費を抑制しています。

○サンプルコード11:CPU使用率を下げる工夫

無限ループは、CPUの負荷を非常に高める原因となることがあります。

この問題を緩和する方法として、Thread.sleepを用いてループの実行間隔を制御する方法が考えられます。

while (true) {
    // プロセスの実行
    // ...

    // 1秒間の休止を挟むことで、CPUの負荷を軽減
    Thread.sleep(1000)
}

上記のコードは、ループの各回の実行後に1秒間の休止を入れることで、CPUの使用率を下げる工夫を施しています。

●カスタマイズの方法

Kotlinの無限ループは、単なるループを繰り返すだけではなく、さまざまなカスタマイズが可能です。

これにより、より効果的なプログラムを作成することができるのです。

ここでは、無限ループのバリエーションの作成方法を中心に、どのようにカスタマイズできるのかをサンプルコードを用いて詳しく説明します。

○サンプルコード12:無限ループのバリエーションを作成する方法

□タイマー機能を取り入れた無限ループ

タイマーを使って一定の時間ごとに特定の処理を実行する無限ループの例です。

import kotlin.concurrent.timer

timer(period = 3000) {
    println("3秒ごとにこのメッセージが表示されます")
}

このコードでは、timer関数を使って3秒ごとに指定の処理を実行しています。

このようにして、特定の間隔での処理実行を繰り返す無限ループを簡単に作成できます。

□イベント駆動型の無限ループ

イベントの発生を待ち受けて、発生した場合のみ特定の処理を行う無限ループの例です。

while (true) {
    val input = readLine()
    if (input == "exit") break

    println("入力された文字: $input")
}

このコードでは、ユーザーからの入力を待ち受けており、”exit”という文字列が入力された場合のみループを終了します。

それ以外の文字列が入力された場合は、その文字列を表示します。

まとめ

この記事では、その作成方法から応用例、注意点、さらにはカスタマイズ方法までを詳細に解説しました。

特にKotlinにおける無限ループは、ただのループを繰り返すだけではなく、多様なカスタマイズや応用が可能であり、プログラミングの幅を大いに広げる要素となっています。

しかし、その利便性とは裏腹に、無限ループを不適切に使用するとシステムのリソースを過度に消費してしまい、パフォーマンスの低下やシステムのクラッシュを引き起こす可能性があります。

したがって、無限ループの実装には十分な注意が必要です。

Kotlinを学ぶ過程では、無限ループの理解とその適切な使用方法を身につけることで、より高度で効率的なプログラミングが可能となるでしょう。

今後もKotlinの機能やテクニックを深く学び、技術の向上を目指しましょう。