[scala] 스칼라에서 객체와 클래스의 차이점

인터넷에서 일부 스칼라 튜토리얼을 살펴보고 예제의 시작 부분에 객체가 선언되어 있음을 알았습니다.

스칼라 class와 의 차이점은 무엇입니까 object?



답변

tl; dr

  • class C Java 또는 C ++에서와 같이 클래스를 정의합니다.
  • object O익명 클래스의 인스턴스로 싱글 톤 객체 O를 만듭니다 . 일부 클래스의 인스턴스와 연관되지 않은 정적 멤버를 보유하는 데 사용할 수 있습니다.
  • object O extends T객체 O를 인스턴스로 만든다 trait T; 그런 다음 O어디든지 통과 할 수 있습니다 T.
  • 가있는 경우 class C, 다음 object C은 IS 동반자 객체 클래스는 C; 컴패니언 개체는 자동으로의 인스턴스 가 아닙니다C .

objectclass에 대한 Scala 설명서도 참조하십시오 .

object 정적 멤버의 호스트로서

가장 object먼저 클래스의 인스턴스를 먼저 인스턴스화하지 않고도 사용할 수있는 메소드 및 값 / 변수를 보유해야합니다. 이 사용은 staticJava 멤버 와 밀접한 관련이 있습니다 .

object A {
  def twice(i: Int): Int = 2*i
}

그런 다음을 사용하여 위의 메소드를 호출 할 수 있습니다 A.twice(2).

twice어떤 클래스의 멤버 라면 A먼저 인스턴스를 만들어야합니다.

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

twice인스턴스 별 데이터가 필요하지 않으므로 이것이 얼마나 중복되는지 확인할 수 있습니다 .

object 특별한 명명 된 인스턴스로서

또한 object클래스 나 특성의 특수 인스턴스로 자체를 사용할 수도 있습니다 . 이렇게하면 trait서브 클래스의 인스턴스가되기 위해 오브젝트를 확장해야 합니다.

다음 코드를 고려하십시오.

object A extends B with C {
  ...
}

이 선언은 첫째을 모두 확장 익명 (액세스) 클래스 선언 BC및 명명 된이 클래스의 단일 인스턴스를 인스턴스화합니다 A.

이 방법은 A형식의 개체 기대 함수에 전달 될 수있다 B거나 C, 또는 B with C.

추가 기능 object

스칼라에는 객체의 특별한 기능이 있습니다. 공식 문서 를 읽는 것이 좋습니다 .

  • def apply(...) 일반적인 메소드 이름없는 구문을 가능하게합니다. A(...)
  • def unapply(...)맞춤 패턴 일치 추출기 를 만들 수 있습니다
  • 동일한 이름의 클래스를 수반하는 경우, 객체는 암시 적 매개 변수를 해석 할 때 특별한 역할을 담당합니다.

답변

A class는 정의, 설명입니다. 다른 유형의 방법 및 구성 측면에서 유형을 정의합니다.

object고유 보장하는 클래스의 인스턴스 – 싱글이다. 모든 object코드에 대해 익명 클래스가 생성되며,이 클래스는 object구현하기로 선언 한 클래스에서 상속됩니다 . 이 클래스는 스칼라 소스 코드에서 볼 수 없지만 리플렉션을 통해 얻을 수는 있습니다.

사이의 관계가있다 object하고 class. 객체가 동일한 이름을 공유하는 경우 클래스의 동반 객체라고합니다. 이런 일이 발생하면 각각은 서로의 private가시성에 접근 할 수 있습니다 . 그러나 이러한 방법은 자동으로 가져 오지 않습니다. 명시 적으로 가져 오거나 클래스 / 개체 이름으로 접두사를 붙여야합니다.

예를 들면 다음과 같습니다.

class X {
  // class X can see private members of object X
  // Prefix to call
  def m(x: Int) = X.f(x)

  // Import and use
  import X._
  def n(x: Int) = f(x)

  private def o = 2
}

object X {
  private def f(x: Int) = x * x

  // object X can see private members of class X
  def g(x: X) = {
    import x._
    x.o * o // fully specified and imported
   }
}


답변

객체에는 정확히 하나의 인스턴스가 있습니다 (호출 할 수 없음 new MyObject). 한 클래스의 인스턴스를 여러 개 가질 수 있습니다 .

Object는 Java의 정적 메소드 및 필드 와 동일한 (및 일부 추가) 목적 으로 사용 됩니다.


답변

많은 사람들이 설명했듯이 object싱글 톤 인스턴스를 정의합니다. 내가 여기에 대답에서 제외 한 것은 object몇 가지 목적 을 제공 한다는 것입니다 .

  • 정적 메소드 또는 편의 메소드로 간주되는 것을 포함 하는 class/ 의 동반자 오브젝트 trait가 될 수 있습니다.

  • 관련 / 자회사 유형 및 정의 등을 포함하는 모듈처럼 작동 할 수 있습니다.

  • class하나 이상의 traits를 확장하여 인터페이스를 구현할 수 있습니다 .

  • sealed trait데이터가없는 경우를 나타낼 수 있습니다 . 이와 관련하여 종종 case class매개 변수가없는 a보다 더 올바른 것으로 간주됩니다 . 구현 sealed trait자만 있는 특수한 경우 case object는 스칼라 버전의 열거 형입니다.

  • implicit논리 기반 논리의 증거로 작용할 수 있습니다 .

  • 싱글 톤 타입을 소개합니다.

매우 강력하고 일반적인 구성입니다. 스칼라 초보자에게 매우 혼란 스러울 수있는 것은 동일한 구성이 크게 다른 용도를 가질 수 있다는 것입니다. 그리고 object한 번에 이러한 여러 가지 용도를 모두 제공 할 수 있으므로 훨씬 더 혼란 스러울 수 있습니다.


답변

스칼라에서 객체를 정의하는 것은 정적 메소드 만있는 Java에서 클래스를 정의하는 것과 같습니다. 그러나 스칼라에서 객체는 다른 수퍼 클래스를 확장하고 인터페이스를 구현하며 마치 클래스의 인스턴스 인 것처럼 전달 될 수 있습니다. (따라서 클래스의 정적 메소드와 비슷하지만 더 좋습니다).


답변

공식적인 차이점-

  1. 객체에 생성자 매개 변수를 제공 할 수 없습니다
  2. 객체 가 유형이 아니므로 new 연산자로 인스턴스를 만들 수 없습니다. 그러나 필드, 메소드, 수퍼 클래스를 확장하고 특성을 혼합 할 수 있습니다.

사용법의 차이 :

  • 스칼라에는 정적 메소드 또는 필드가 없습니다. 대신을 사용해야합니다 object. 관련 클래스 유무에 관계없이 사용할 수 있습니다. 첫 번째 경우에는 컴패니언 객체라고합니다. 당신은해야합니다 :
    1. 클래스와 객체에 같은 이름을 사용하십시오
    2. 그것들을 같은 소스 파일에 넣으십시오.
  • 프로그램을 만들려면에있는 object것이 아니라에서 주요 방법을 사용해야합니다 class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
  • Java에서 싱글 톤 객체를 사용할 때 사용할 수도 있습니다.

      
        
      


답변

객체의 키워드는 같이하는 새로운 싱글 타입 생성 클래스 단 하나의 명명 된 인스턴스가 있습니다. Java에 익숙하다면 Scala 에서 객체 를 선언하는 것은 익명 클래스의 새 인스턴스를 만드는 것과 비슷합니다.

스칼라는 자바의 정적 키워드 와 동일하지 않으며 , 스칼라에서 객체 는 종종 스칼라에서 정적 멤버가있는 클래스를 Java에서 사용할 수있는 곳에서 사용됩니다.