스칼라 트레이트

DataCamp이 最近 시작한 첫 번째 Scala 과정은 Scala 기본입니다. 자세히 보세요!

다음 튜orial을 읽어보실 수 있습니다.

소개

Trait는 오브젝트 オージェン어드 프로그래밍에서 주로 사용되는 개념으로, 특정 메소드 셋을 통해 클래스의 기능을 확장할 수 있습니다.

트레이트는 자바 프로그래밍 언어의 인터페이스와 정신적으로 유사합니다. 클래스와는 달리, 스칼라의 트레이트는 인스턴스화할 수 없으며 인자나 파라미터를 가지지 않습니다. 그러나 클래스와 객체를 통해 상속(확장)할 수 있습니다. 이렇게 했을 때, 트레이트는 클래스에 특정 동작을 실행하는 메서드/함수 집합을 제공하며, 그 클래스가 제공된 동작을 매개변수화하는 메서드 집합을 구현할 것을 기대합니다.

객체를 정의하는 데 사용되는 트레이트는 다른 클래스가 여러 상속을 필요로하지 않고 사용할 수 있는 메서드의 혼합체로 생성됩니다. 그러나 같은 이름의 메서드를 가진 두 트레이트가 있을 수 있으며 (이름 충돌), 이 경우 클래스가 사용해야 하는데, 모호성을 명시적으로 해결해야 합니다.

트레이트는 추상 메서드와 비추상 메서드, 필드를 구성원으로 가질 수 있습니다. 트레이트에서 메서드를 초기화하지 않으면, 추상메서드가 되며, 초기화되는 것들은 비추상 메서드라고 합니다. 추상 메서드에서는 트레이트를 구현하는 클래스가 초기화를 책임집니다.

이제 몇 가지 예제를 통해 스칼라 트레이트에 대해 빠르게 이해해보겠습니다!

스칼라 트레이트 문법

스칼라 트레이트의 문법은 간단합니다. trait 키워드로 시작되며 그 뒤에 트레이트의 이름이 오는 것입니다.

trait Trait_Name{ // 변수 // 메서드 }

위의 trait 정의에서 볼 수 있듯이, DataCamp라는 이름의 trait가 정의되었으며, 그 안에는 변수와 메서드가 정의되어 있지 않습니다.

이제 Scala trait의 간단한 예제로 넘어가 보겠습니다. 이를 통해 프로그래밍적으로 어떻게 작동하는지 더욱 명확하게 이해할 수 있을 것입니다.

소개에서 논의된 바와 같이, Scala Traits는 extends 키워드를 사용하여 클래스에 의해 상속됩니다.

class Scala_Tutorial extends DataCamp{ // 변수들 // 메서드들 }

Scala_Course라는 이름의 trait를 정의하고, 이 trait는 DataCamp 클래스에 의해 상속될 것입니다. trait 안에는 scala()라는 추상 메서드를 정의할 것이며, 이는 DataCamp 클래스에서 정의될 것입니다.

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def scala(){ println("DataCamp has recently launched there first Scala course") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.scala() } }

이제 위 코드를 실행해 보겠습니다.

위 예제에서 scala() 메서드는 추상 메서드였기 때문에, 이 trait를 상속한 클래스에서 선언되었습니다.

하지만, 만약 trait에 이미 구현된 메서드(비추상 메서드)가 있다면 어떻게 될까요? 이 경우, 이 trait를 확장하는 클래스는 이미 trait에 구현된 메서드를 구현할 필요가 없습니다.

작은 예제를 통해 이것을 이해해 봅시다.

trait BMW{ // 특성 변수 var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // 특성 메서드: 비어블 def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } class Car extends BMW{ // 클래스 변수 var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 // 클래스 메서드 def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // 주 메서드 def main(args: Array[String]) { // 클래스 객체 var obj = new Car(); println("Calling the Class Method") obj.Merc_Specs(); println("Calling the Trait Method") obj.Display(); } }

위의 코드를 실행해봅시다:

이제 abstractnon-abstract 메서드의 차이점을 이해했으면, 상속하거나 확장하는 클래스에서 abstract 메서드를 구현하지 않았을 때 발생할 수 있는 문제점을 살펴보겠습니다.

이 개념을 이해하기 위해 같은 예제를 사용하겠습니다.

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def print(){ println("Error: Class DataCamp needs to be Abstract") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.print() } }

위의 코드를 실행하면, 아래와 같은 에러가 발생합니다. 왜냐하면 scala() (어블랙트) 메서드를 상속 받은 클래스에서 정의하지 않았기 때문입니다.

위의 코드를 작동하게 만들기 위해서는 두 가지 가능한 해결책이 있습니다:

  • DataCamp 클래스에서 scala() 메서드를 정의하거나
  • DataCamp 클래스를 abstract로 정의합니다.

오늘의 자습서 마지막 주제는 한 클래스에서 여러 특성을 상속하는 방법입니다. 그럼 빨리 마무리하겠습니다.

trait A{ // 메서드 } trait B{ // 메서드 } class C extends A with B{ }
trait BMW{ var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 } trait Merc{ var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 } class Car extends BMW with Merc{ def BMW_Specs() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // 주 메서드 def main(args: Array[String]) { // 클래스 객체 var obj = new Car(); println("Calling the BMW Trait") obj.BMW_Specs(); println(); println("Calling the Merc Trait") obj.Merc_Specs(); } }

마지막으로, 위의 코드를 실행해 보자.

축하합니다!

이 튜토리얼을 완료하신 것을 축하드립니다.

이제 프로그래밍에서 Traits가 무엇인지 그리고 Scala에서 어떻게 사용하는지 알았습니다. 여러분에게 좋은 연습이 될 것은 추상 메서드가 상속 받은 클래스에 정의되지 않은 경우에 해결책을 찾는 것입니다. 같은 코드를 작성하고 컴파일 에러 없이 코드가 실행되는지 확인해 보세요. 한가지 팁이 있습니다, Scala의 추상 클래스를 봐보세요.

이 튜토리얼과 관련된 질문이 있다면下面的评论部分에서 무엇이든지 물어보세요.

마지막으로, DataCamp에서의 새로운 Scala 코스, Scala 入門을 간지 않게 가져가세요.

Source:
https://www.datacamp.com/tutorial/scala-traits