답변:
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(...)
맞춤 패턴 일치 추출기 를 만들 수 있습니다Commerce
클래스를 인식하지 못하지만 JVM과 Java 언어는 인식합니다 . (그래서 object Foo{ def main(args:Seq[String]) }
프로그램을 실행할 수 있고 기대할 수 있습니다 .)
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
}
}
def f(x: X) = ???
private 메소드를 호출 할 수 있습니다 . x
X
많은 사람들이 설명했듯이 object
싱글 톤 인스턴스를 정의합니다. 내가 여기에 대답에서 제외 한 것은 object
몇 가지 목적 을 제공 한다는 것입니다 .
정적 메소드 또는 편의 메소드로 간주되는 것을 포함 하는 class
/ 의 동반자 오브젝트 trait
가 될 수 있습니다.
관련 / 자회사 유형 및 정의 등을 포함하는 모듈처럼 작동 할 수 있습니다.
class
하나 이상의 trait
s를 확장하여 인터페이스를 구현할 수 있습니다 .
sealed trait
데이터가없는 경우를 나타낼 수 있습니다 . 이와 관련하여 종종 case class
매개 변수가없는 a보다 더 올바른 것으로 간주됩니다 . 구현 sealed trait
자만 있는 특수한 경우 case object
는 스칼라 버전의 열거 형입니다.
implicit
논리 기반 논리의 증거로 작용할 수 있습니다 .
싱글 톤 타입을 소개합니다.
매우 강력하고 일반적인 구성입니다. 스칼라 초보자에게 매우 혼란 스러울 수있는 것은 동일한 구성이 크게 다른 용도를 가질 수 있다는 것입니다. 그리고 object
한 번에 이러한 여러 가지 용도를 모두 제공 할 수 있으므로 훨씬 더 혼란 스러울 수 있습니다.
공식적인 차이점-
사용법의 차이 :
object
. 관련 클래스 유무에 관계없이 사용할 수 있습니다. 첫 번째 경우에는 컴패니언 객체라고합니다. 당신은해야합니다 :
프로그램을 만들려면에있는 object
것이 아니라에서 주요 방법을 사용해야합니다 class
.
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Java에서 싱글 톤 객체를 사용할 때 사용할 수도 있습니다.
객체의 키워드는 같이하는 새로운 싱글 타입 생성 클래스 단 하나의 명명 된 인스턴스가 있습니다. Java에 익숙하다면 Scala 에서 객체 를 선언하는 것은 익명 클래스의 새 인스턴스를 만드는 것과 비슷합니다.
스칼라는 자바의 정적 키워드 와 동일하지 않으며 , 스칼라에서 객체 는 종종 스칼라에서 정적 멤버가있는 클래스를 Java에서 사용할 수있는 곳에서 사용됩니다.
스칼라에는 static
개념 이 없습니다 . 스칼라는 프로그램 실행을위한 진입 점을 제공하는 단일 객체를 만듭니다. 싱글 톤 객체를 만들지 않으면 코드가 성공적으로 컴파일되지만 출력이 생성되지 않습니다. Singleton Object 내에 선언 된 메소드는 전 세계적으로 액세스 할 수 있습니다. 싱글 톤 객체는 클래스와 특성을 확장 할 수 있습니다.
스칼라 싱글 톤 객체 예
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
산출:
Hello, This is Singleton Object
스칼라에서는 싱글 톤 객체와 이름이 같은 클래스가 있으면 컴패니언 클래스라고하며 싱글 톤 객체를 컴패니언 객체라고합니다.
컴패니언 클래스와 해당 컴패니언 오브젝트는 모두 동일한 소스 파일에 정의되어야합니다.
스칼라 컴패니언 객체 예
class ComapanionClass{
def hello(){
println("Hello, this is Companion Class.")
}
}
object CompanoinObject{
def main(args:Array[String]){
new ComapanionClass().hello()
println("And this is Companion Object.")
}
}
산출:
Hello, this is Companion Class.
And this is Companion Object.
스칼라에서 클래스는 다음을 포함 할 수 있습니다.
1. 데이터 멤버
2. 회원 방법
3. 생성자 블록
4. 중첩 클래스
5. 슈퍼 클래스 정보 등
클래스의 모든 인스턴스 변수를 초기화해야합니다. 기본 범위는 없습니다. 액세스 범위를 지정하지 않으면 공개 범위입니다. 기본 메소드가 정의 된 오브젝트가 있어야합니다. 프로그램의 시작점을 제공합니다. 여기에서 클래스 예제를 만들었습니다.
스칼라 샘플 클래스 예제
class Student{
var id:Int = 0; // All fields must be initialized
var name:String = null;
}
object MainObject{
def main(args:Array[String]){
var s = new Student() // Creating an object
println(s.id+" "+s.name);
}
}
죄송합니다. 너무 늦었지만 도움이 되길 바랍니다.
스칼라 클래스는 Java 클래스와 동일하지만 스칼라는 Java의 기본 메소드와 같이 클래스의 엔트리 메소드를 제공하지 않습니다. 객체 키워드와 관련된 주요 방법. object 키워드는 암시 적으로 정의 된 클래스의 단일 객체를 만드는 것으로 생각할 수 있습니다.
자세한 내용 은 스칼라 프로그래밍 에서이 기사 클래스와 객체 키워드를 확인하십시오.
수업은 다른 언어의 다른 수업과 같습니다. 구문 차이가있는 다른 언어와 마찬가지로 클래스를 정의합니다.
class Person(val name: String)
val me = new Person("My name")
그러나 객체는 단일 객체 만있는 클래스입니다. companion 객체를 사용하여 클래스의 정적 멤버를 만드는 데 사용할 수 있으므로 흥미 롭습니다 . 이 컴패니언 객체는 클래스 정의의 비공개 멤버에 액세스 할 수 있으며 정의한 클래스와 이름이 같습니다.
class Person(var name: String) {
import Person._
def hi(): String = sayHello(name)
}
object Person {
private def sayHello(name: String): String = "Hello " + name
}
val me = new Person("My name")
me.hi()
또한 주목할만한 점은 객체 클래스가 느리게 생성되어 또 다른 중요한 점이라는 것입니다. 따라서 코드에서 필요하지 않으면 인스턴스화되지 않습니다.
JDBC에 대한 연결 작성을 정의하는 경우 단일 오브젝트를 사용하여 Java에서와 같이 복제를 피하기 위해 오브젝트 내부에서 작성할 수 있습니다.