인터넷에서 일부 스칼라 튜토리얼을 살펴보고 예제의 시작 부분에 객체가 선언되어 있음을 알았습니다.
스칼라 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
.
object 및 class에 대한 Scala 설명서도 참조하십시오 .
object
정적 멤버의 호스트로서
가장 object
먼저 클래스의 인스턴스를 먼저 인스턴스화하지 않고도 사용할 수있는 메소드 및 값 / 변수를 보유해야합니다. 이 사용은 static
Java 멤버 와 밀접한 관련이 있습니다 .
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
하나 이상의trait
s를 확장하여 인터페이스를 구현할 수 있습니다 . -
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에서 사용할 수있는 곳에서 사용됩니다.