Kotlin에서 클래스와 객체의 차이점


101

저는 Kotlin을 처음 사용하며 최근에 간단한 파일을 Java에서 Kotlin으로 변환했습니다. Android 변환기가 Java 클래스를 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 ...
}

어떤 도움이라도 대단히 감사하겠습니다.

답변:



168

이것에 대한 Kotlin의 문서 는 꽤 훌륭하므로 자유롭게 읽으십시오.

이 질문에 대해 선택한 답변에는 설명에 잘못된 문구가 포함되어있어 사람들을 쉽게 오도 할 수 있습니다. 예를 들어, 객체는 "정적 클래스 그 자체"가 아니라 a static instance of a class that there is only one of싱글 톤이라고도하는입니다.

차이점을 보여주는 가장 좋은 방법은 디 컴파일 된 Kotlin 코드를 Java 형식으로 보는 것입니다.

Kotlin 객체 및 클래스 :

object ExampleObject {
  fun example() {
  }
}

class ExampleClass {
  fun example() {
  }
}

를 사용하려면 ExampleClass인스턴스를 만들어야합니다. ExampleClass().example()하지만 객체를 사용하면 Kotlin이 단일 인스턴스를 생성하고 생성자를 호출하지 않고 대신 다음을 사용하여 정적 인스턴스에 액세스합니다. 이름 : ExampleObject.example().

동등한 자바 코드 Kotlin은 다음을 생성합니다.

Kotlin은 자바 바이트 코드로 컴파일되지만 위에서 컴파일 된 Kotlin 코드를 자바 코드로 리버스 컴파일하면 다음과 같은 결과를 얻을 수 있습니다.

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()

Kotlin에서 objectS를 도입하는 이유는 무엇 입니까?

objectKotlin 의 주요 사용 사례는 Kotlin이 정적 및 기본 요소를 없애고 순수한 객체 지향 언어를 사용하기 때문입니다. Kotlin은 여전히 static내부적으로 및 기본 요소를 사용하지만 개발자가 이러한 개념을 더 이상 사용하지 않도록 권장합니다. 대신 이제 Kotlin은 static을 싱글 톤 객체 인스턴스로 대체합니다. 이전에 자바에서 정적 필드를 사용했던 곳에서 Kotlin에서 이제를 만들고 object해당 필드를 object.

Java와의 상호 운용성 :

Kotlin은 자바와 100 % 상호 운용이 가능하기 때문에 때때로 자바가 읽기에 더 좋은 방식으로 특정 API 또는 필드를 노출하고 싶을 것입니다. 이를 위해 @JvmStatic주석을 사용할 수 있습니다 . objectwith 에있는 필드 또는 함수에 주석을 달면 @JvmStaticJava가 더 쉽게 사용할 수있는 정적 필드로 컴파일됩니다.

컴패니언 개체 :

마지막으로 언급 할 가치가있는 것은 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)
  }
}

6
좋은 설명입니다. 감사합니다.
덴마크 Ansari

12

객체는 싱글 톤입니다. 이를 사용하기 위해 인스턴스를 만들 필요는 없습니다.

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

Java에서 Math.sqrt (2)라고 말하고 sqrt를 사용하기 위해 Math 인스턴스를 만들 필요가없는 것과 같은 방식으로 Kotlin에서 이러한 메서드를 보유 할 객체를 만들 수 있으며 사실상 정적입니다.

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

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

IntelliJ는 정적 자바 메소드 만 있기 때문에 객체가 필요하다는 것을 감지 할만큼 똑똑했습니다.


잠깐, 내 클래스 Human에 static int 필드 Population가 있다면 Kotlin에서 어떻게 보일까요? companion object { @JvmField val Population; }또는 뭔가?
Squirrelkiller


1

@ speirce7의 답변을 바탕으로 :

다음 코드는 Kotlin과 관련하여 Class와 Object의 기본적인 차이점을 보여줍니다.

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.
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.