스칼라 클래스와 객체
클래스는 객체의 추상화이고 객체는 클래스의 구체적인 인스턴스입니다. 클래스는 추상적이고 메모리를 차지하지 않는 반면, 객체는 구체적이며 저장 공간을 차지합니다. 클래스는 특정 유형의 객체에 포함된 메서드와 변수를 정의하는 소프트웨어 템플릿인 객체 생성을 위한 청사진입니다.
new 키워드를 사용하여 클래스의 객체를 만들 수 있습니다. 예는 다음과 같습니다.
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点: " + x); println ("y 的坐标点: " + y); } }
스칼라의 클래스는 공개로 선언되지 않으며 하나의 클래스에 여러 클래스가 있을 수 있습니다. 스칼라 소스 파일.
위 예제의 클래스는 두 개의 변수 x 및 y와 하나의 메소드 move를 정의하며 이 메소드에는 반환 값이 없습니다.
Scala의 클래스 정의에는 위의 xc, yc와 같은 클래스 매개변수라는 매개변수가 있을 수 있습니다. 클래스 매개변수는 클래스 전체에서 액세스할 수 있습니다.
그런 다음 new를 사용하여 클래스를 인스턴스화하고 클래스의 메서드와 변수에 액세스할 수 있습니다.
import java.io._ class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点: " + x); println ("y 的坐标点: " + y); } } object Test { def main(args: Array[String]) { val pt = new Point(10, 20); // 移到一个新的位置 pt.move(10, 10); } }
위 코드를 실행하면 출력 결과는 다음과 같습니다.
$ scalac Test.scala $ scala Test x 的坐标点: 20 y 的坐标点: 30
스칼라 상속
기본 클래스를 상속하는 스칼라는 Java와 매우 유사하지만 몇 가지 사항에 주의해야 합니다.
1. 비추상 메서드 기호를 재정의합니다.
2. 기본 생성자만 기본 클래스 생성자에 매개변수를 쓸 수 있습니다.
3. 서브클래스에서 슈퍼클래스의 추상 메소드를 오버라이드하는 경우 override 키워드를 사용할 필요가 없습니다.
예를 살펴보겠습니다.
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点: " + x); println ("y 的坐标点: " + y); } } class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("x 的坐标点 : " + x); println ("y 的坐标点 : " + y); println ("z 的坐标点 : " + z); } }
Scala는 클래스를 상속하기 위해 확장 키워드를 사용합니다. 예제에서 Location 클래스는 Point 클래스를 상속합니다. Point를 상위 클래스(기본 클래스)라고 하고 Location을 하위 클래스라고 합니다.
override val xc는 상위 클래스의 필드를 재정의합니다.
상속은 상위 클래스의 모든 속성과 메서드를 상속합니다. 스칼라는 하나의 상위 클래스만 상속할 수 있습니다.
예제는 다음과 같습니다.
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点 : " + x); println ("y 的坐标点 : " + y); } } class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("x 的坐标点 : " + x); println ("y 的坐标点 : " + y); println ("z 的坐标点 : " + z); } } object Test { def main(args: Array[String]) { val loc = new Location(10, 20, 15); // 移到一个新的位置 loc.move(10, 10, 5); } }
위 코드를 실행하면 출력 결과는 다음과 같습니다.
$ scalac Test.scala $ scala Test x 的坐标点 : 20 y 的坐标点 : 30 z 的坐标点 : 20
Scala는 비추상 메서드를 다시 작성하며 재정의 수정자를 사용해야 합니다.
class Person { var name = "" override def toString = getClass.getName + "[name=" + name + "]" } class Employee extends Person { var salary = 0.0 override def toString = super.toString + "[salary=" + salary + "]" } object Test extends App { val fred = new Employee fred.name = "Fred" fred.salary = 50000 println(fred) }
위 코드를 실행하면 출력 결과는 다음과 같습니다.
$ scalac Test.scala $ scala Test Employee[name=Fred][salary=50000.0]
Scala 싱글톤 객체
Scala에는 정적이라는 것이 없지만, 또한 키워드 객체를 사용하는 싱글톤 패턴 구현 방법을 제공합니다.
스칼라에서 싱글턴 모드를 사용하는 경우 정의된 클래스 외에 동일한 이름의 객체도 정의해야 합니다. 클래스와 차이점은 객체 객체가 매개변수를 가질 수 없다는 점입니다.
싱글톤 객체가 클래스와 동일한 이름을 공유하는 경우 이 클래스의 동반 객체, 즉 동반 객체라고 합니다. 동일한 소스 파일에서 클래스와 해당 동반 개체를 정의해야 합니다. 이 클래스를 이 싱글톤 객체의 동반 클래스(companion class)라고 합니다. 클래스와 해당 동반 개체는 서로의 전용 멤버에 액세스할 수 있습니다.
싱글톤 객체 인스턴스
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy } } object Test { def main(args: Array[String]) { val point = new Point(10, 20) printPoint def printPoint{ println ("x 的坐标点 : " + point.x); println ("y 的坐标点 : " + point.y); } } }
위 코드를 실행하면 출력 결과는 다음과 같습니다.
$ scalac Test.scala $ scala Test x 的坐标点 : 10 y 的坐标点 : 20
컴패니언 객체 인스턴스
/* 文件名:Marker.scala * author:php中文网 * url:www.php.cn */ // 私有构造方法 class Marker private(val color:String) { println("创建" + this) override def toString(): String = "颜色标记:"+ color } // 伴生对象,与类共享名字,可以访问类的私有属性和方法 object Marker{ private val markers: Map[String, Marker] = Map( "red" -> new Marker("red"), "blue" -> new Marker("blue"), "green" -> new Marker("green") ) def apply(color:String) = { if(markers.contains(color)) markers(color) else null } def getMarker(color:String) = { if(markers.contains(color)) markers(color) else null } def main(args: Array[String]) { println(Marker("red")) // 单例函数调用,省略了.(点)符号 println(Marker getMarker "blue") } }
위 코드를 실행하면 출력이 됩니다. 결과는 다음과 같습니다:
$ scalac Marker.scala $ scala Marker 创建颜色标记:red 创建颜色标记:blue 创建颜色标记:green 颜色标记:red 颜色标记:blue