programing

Kotlin의 클래스와 객체의 차이

javaba 2022. 9. 3. 23:45
반응형

Kotlin의 클래스와 객체의 차이

저는 Kotlin에 처음 와서 최근 java에서 Kotlin으로 간단한 파일을 변환했습니다.안드로이드 컨버터가 왜 자바 클래스를 Kotlin 오브젝트로 변경했는지 궁금합니다.

자바:

public class MyClass {
    static public int GenerateChecksumCrc16(byte bytes[]) {

        int crc = 0xFFFF;
        int temp;
        int crc_byte;

        for (byte aByte : bytes) {

            crc_byte = aByte;

            for (int bit_index = 0; bit_index < 8; bit_index++) {

                temp = ((crc >> 15)) ^ ((crc_byte >> 7));

                crc <<= 1;
                crc &= 0xFFFF;

                if (temp > 0) {
                    crc ^= 0x1021;
                    crc &= 0xFFFF;
                }

                crc_byte <<= 1;
                crc_byte &= 0xFF;

            }
        }

        return crc;
    }
}

변환된 Kotlin:

object MyClass {
    fun GenerateChecksumCrc16(bytes: ByteArray): Int {

        var crc = 0xFFFF
        var temp: Int
        var crc_byte: Int

        for (aByte in bytes) {

            crc_byte = aByte.toInt()

            for (bit_index in 0..7) {

                temp = crc shr 15 xor (crc_byte shr 7)

                crc = crc shl 1
                crc = crc and 0xFFFF

                if (temp > 0) {
                    crc = crc xor 0x1021
                    crc = crc and 0xFFFF
                }

                crc_byte = crc_byte shl 1
                crc_byte = crc_byte and 0xFF

            }
        }

        return crc
    }
}

왜 그렇지 않았을까:

class MyClass {
    ... etc ...
}

어떤 도움이라도 주시면 감사하겠습니다.

이것에 관한 Kotlin의 문서는 꽤 좋기 때문에, 부담없이 읽어 주세요.

이 질문에 대한 선택된 답변은 설명에 약간의 서투른 표현들이 있어 사람들을 쉽게 오도할 수 있다.들어 는 "가 아니라 "static class per se"입니다.a static instance of a class that there is only one of싱글톤이라고도 합니다.

아마도 차이를 보여주는 가장 좋은 방법은 자바 형태로 디컴파일된 Kotlin 코드를 보는 것입니다.

Kotlin 개체 및 클래스:

object ExampleObject {
  fun example() {
  }
}

class ExampleClass {
  fun example() {
  }
}

「 」를 하려면 , 「 」를 합니다.ExampleClass를 들어서 예를 예를 들면 예를 들 수 ExampleClass().example()오브젝트를 하여 하나의 를 만듭니다.이 인스턴스는 "Kotlin"이라는컨스트럭터를 호출하지 않고 다음 이름을 사용하여 스태틱인스턴스에 액세스합니다.ExampleObject.example().

Kotlin이 생성하는 동등한 Java 코드:

Kotlin은 Java 바이트 코드로 컴파일하지만 위의 컴파일된 Kotlin 코드를 Java 코드로 역컴파일하면 다음과 같이 됩니다.

public final class ExampleObject {
   public static final ExampleObject INSTANCE = new ExampleObject();

   private ExampleObject() { }

   public final void example() {
   }
}

public final class ExampleClass {
   public final void example() {
   }
}

Kotlin의 오브젝트는 다음과 같이 사용할 수 있습니다.

ExampleObject.example()

이는 다음 항목에 대해 동등한 Java 바이트 코드로 컴파일됩니다.

ExampleObject.INSTANCE.example()

왜 코틀린을 할까?objects?s?

「 」의예:object코틀린에서는 코틀린이 정적이고 원초적인 것을 없애려고 하기 때문에 순수하게 객체 지향적인 언어를 우리에게 남깁니다.은 아직 Kotlin을 사용하고 있다.static 인스턴스로 지금까지에서 스태틱필드Kotlin에서 스태틱필드가 생성됩니다.object 를 에 object.

Java와의 상호 운용성:

Kotlin은 Java와 100% 상호 운용이 가능하기 때문에 특정 API나 필드를 Java가 읽기 쉬운 방법으로 공개하고 싶을 수 있습니다.는 , 「 」를 사용합니다.@JvmStatic어노멘트. 어노멘트, 어노멘트를 하다.object@JvmStaticJava java java java java java java java java java java java java java java java java.

Companion 객체:

마지막으로 언급할 가치가 있는 것은companion objects. Java에서는 일반적으로 정적 콘텐츠뿐만 아니라 정적/인스턴스 콘텐츠도 포함하는 클래스가 있습니다.Kotlin은 동반 객체에 대해 다음과 같은 작업을 수행할 수 있습니다.object에 묶이다class클래스는 컴패니언 객체의 개인 함수 및 속성에 액세스할 수 있습니다.

class ExampleClass {
  companion object {
    // Things that would be static in Java would go here in Kotlin
    private const val str = "asdf"
  }

  fun example() {
    // I can access private variables in my companion object
    println(str)
  }
}

Kotlin 객체는 인스턴스화할 수 없는 클래스와 같기 때문에 이름을 불러야 합니다.(스태틱 클래스 그 자체)

Android 컨버터는 당신의 클래스가 정적 메서드만을 포함하는 것을 보고 Kotlin 객체로 변환했습니다.

자세한 내용은 http://petersommerhoff.com/dev/kotlin/kotlin-for-java-devs/ #http://http://petersommerhoff.com/dev/kotlin/kotlin-for-java-devs/ 를 참조해 주세요.

다음 항목 간 차이: object || class || companion object || 데이터 클래스

1. 오브젝트

  • 오브젝트 선언은 처음 액세스 할 때 느릿느릿 초기화됩니다.
  • 객체는 싱글톤 클래스처럼 동작합니다.
  • 전체 앱에 대한 참조는 1개뿐입니다.
  • 액세스 멤버, 인스턴스 생성 없이 메서드

2. 클래스

  • 생성할 수 있는 다중 참조
  • 액세스 멤버, 메서드에 대한 인스턴스 생성 필요

3. 디폴트 오브젝트

  • 지원하는 클래스가 로드되면 지원 개체가 초기화됩니다.
  • object MyClass{}기본적으로 전체 변수는 단일 참조를 가지지만companion objectstatic 메서드를 작성하거나 static 변수를 작성할 수 있습니다.
  • 싱글톤 클래스를 만들 수 있습니다.

4. 데이터 클래스

  • 데이터/상태 유지에 사용되는 클래스
  • Kotlin의 데이터 클래스에서는 긴 보일러 플레이트 코드를 직접 작성/생성할 필요가 없습니다.
  • 컴파일러는 모든 가변 속성에 대해 기본 getter 및 setter를 자동으로 생성합니다.
  • 컴파일러는 다음과 같은 표준 메서드의 구현을 자동으로 유도합니다.equals(),hashCode()그리고.toString()

//---------------1- object ----------------------
object MyClass1 {
        fun checkData {
            // ...
        }
}

MyClass1.checkData()  // call method


//----------------2- class ---------------------
class MyClass2 {
        fun checkData {
            // ...
        }
}

var myClass = MyClass2()
myClass.checkData()  // call method



//----------------3- companion object ---------------------
class MyClass3 {
        companion object {
            fun myStaticMethod() {
                // ...
            }
        }

       fun myInstanceMethod() {
            // ...
        }
}
MyClass3.myStaticMethod() // call companion object member
var myClass = MyClass3()
myClass.myInstanceMethod()  // call simple method using reference

//----------------4- data class ---------------------
data class MyClass4(val name: String, val rId: Int)

물체는 싱글톤이다.이 인스턴스를 사용하기 위해 인스턴스를 생성할 필요가 없습니다.

클래스를 사용하려면 인스턴스화해야 합니다.

Java에서 Math.sqrt(2)라고 하는 것과 같은 방법으로 Sqrt를 사용하기 위해 Math 인스턴스를 작성할 필요가 없습니다.Kotlin에서는 이러한 메서드를 유지하는 오브젝트를 작성할 수 있습니다.이러한 메서드는 사실상 정적입니다.

여기 몇 가지 정보가 있습니다.

https://kotlinlang.org/docs/reference/object-declarations.html

IntelliJ는 정적 Java 메서드만 사용하므로 오브젝트가 필요하다는 것을 확실히 검출할 수 있을 만큼 스마트합니다.

또한 객체 선언 없이 함수를 정의할 수도 있습니다..kt 파일의 예:

fun GenerateChecksumCrc16(bytes: ByteArray): Int {
    ...
}

그리고 이 함수는 .kt 파일이 선언된 패키지와 관련이 있습니다.자세한 것은, https://kotlinlang.org/docs/reference/packages.html 를 참조해 주세요.

@speirce7의 답변을 바탕으로 합니다.

다음 코드는 Kotlin에 관한 클래스와 오브젝트의 기본적인 차이를 나타내고 있습니다.

class ExampleClass(){
    fun example(){
            println("I am in the class.")
    }
}

object ExampleObject{
    fun example(){
            println("I am in the object.")
    }
}

fun main(args: Array<String>){
    val exampleClass = ExampleClass() // A class needs to be instantiated.
    exampleClass.example()            // Running the instance of the object.
    ExampleObject.example()           // An object can be thought of as a Singleton and doesn't need any instantiation.
}

언급URL : https://stackoverflow.com/questions/44255946/difference-between-a-class-and-object-in-kotlin

반응형