인터넷에서 일부 스칼라 튜토리얼을 살펴보고 예제의 시작 부분에 객체가 선언되어 있음을 알았습니다.
스칼라 class와 의 차이점은 무엇입니까 object?
답변
tl; dr
class CJava 또는 C ++에서와 같이 클래스를 정의합니다.object O익명 클래스의 인스턴스로 싱글 톤 객체O를 만듭니다 . 일부 클래스의 인스턴스와 연관되지 않은 정적 멤버를 보유하는 데 사용할 수 있습니다.object O extends T객체O를 인스턴스로 만든다trait T; 그런 다음O어디든지 통과 할 수 있습니다T.- 가있는 경우
class C, 다음object C은 IS 동반자 객체 클래스는C; 컴패니언 개체는 자동으로의 인스턴스 가 아닙니다C.
object 및 class에 대한 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 {
...
}
이 선언은 첫째을 모두 확장 익명 (액세스) 클래스 선언 B과 C및 명명 된이 클래스의 단일 인스턴스를 인스턴스화합니다 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에서 클래스를 정의하는 것과 같습니다. 그러나 스칼라에서 객체는 다른 수퍼 클래스를 확장하고 인터페이스를 구현하며 마치 클래스의 인스턴스 인 것처럼 전달 될 수 있습니다. (따라서 클래스의 정적 메소드와 비슷하지만 더 좋습니다).
답변
공식적인 차이점-
- 객체에 생성자 매개 변수를 제공 할 수 없습니다
- 객체 가 유형이 아니므로 new 연산자로 인스턴스를 만들 수 없습니다. 그러나 필드, 메소드, 수퍼 클래스를 확장하고 특성을 혼합 할 수 있습니다.
사용법의 차이 :
- 스칼라에는 정적 메소드 또는 필드가 없습니다. 대신을 사용해야합니다
object. 관련 클래스 유무에 관계없이 사용할 수 있습니다. 첫 번째 경우에는 컴패니언 객체라고합니다. 당신은해야합니다 :- 클래스와 객체에 같은 이름을 사용하십시오
- 그것들을 같은 소스 파일에 넣으십시오.
-
프로그램을 만들려면에있는
object것이 아니라에서 주요 방법을 사용해야합니다class.object Hello { def main(args: Array[String]) { println("Hello, World!") } } -
Java에서 싱글 톤 객체를 사용할 때 사용할 수도 있습니다.
답변
객체의 키워드는 같이하는 새로운 싱글 타입 생성 클래스 단 하나의 명명 된 인스턴스가 있습니다. Java에 익숙하다면 Scala 에서 객체 를 선언하는 것은 익명 클래스의 새 인스턴스를 만드는 것과 비슷합니다.
스칼라는 자바의 정적 키워드 와 동일하지 않으며 , 스칼라에서 객체 는 종종 스칼라에서 정적 멤버가있는 클래스를 Java에서 사용할 수있는 곳에서 사용됩니다.
