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(); } }
위의 코드를 실행해봅시다:

이제 abstract
와 non-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 入門을 간지 않게 가져가세요.