This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| language:scala [2020/09/02 18:17] – [Type variance] 예시 추가 ledyx | language:scala [2021/03/24 08:18] (current) – [Command Line] 프로젝트 생성/배포 내용 보강 ledyx | ||
|---|---|---|---|
| Line 13: | Line 13: | ||
| https:// | https:// | ||
| - | * SBT (Scala Build Tools) | + | === SBT (Scala Build Tools) |
| Scala의 Ant/ | Scala의 Ant/ | ||
| + | |||
| + | ==== Create templates ==== | ||
| + | |||
| + | https:// | ||
| <sxh shell> | <sxh shell> | ||
| - | # 생성 | + | sbt new scala/ |
| - | sbt [Project Name] | + | </ |
| + | |||
| + | ==== Fat Jar ==== | ||
| + | |||
| + | https:// | ||
| + | |||
| + | <sxh shell> | ||
| # Build (Fat Jar 생성) | # Build (Fat Jar 생성) | ||
| ## build.sbt에 | ## build.sbt에 | ||
| - | ## addSbtPlugin(" | + | ## addSbtPlugin(" |
| ## 추가 필요 | ## 추가 필요 | ||
| ### 생성된 jar 위치 : target/ | ### 생성된 jar 위치 : target/ | ||
| - | sbt assemblyty | + | sbt assembly |
| </ | </ | ||
| - | * Scala Binaries (선택 사항) | + | |
| + | === Scala Binaries (선택 사항) | ||
| * REPL(scala), | * REPL(scala), | ||
| Line 117: | Line 128: | ||
| 식별자 규칙 및 관례적 명명법 서술. | 식별자 규칙 및 관례적 명명법 서술. | ||
| - | * 연산자 정의(Operator Defination) Method와 암시적 변환([[language: | + | * 연산자 정의(Operator Defination) Method와 암시적 변환([[language: |
| Line 434: | Line 445: | ||
| ==== for-yield ==== | ==== for-yield ==== | ||
| - | < | + | < |
| <code scala> | <code scala> | ||
| Line 985: | Line 996: | ||
| ==== Companion object ==== | ==== Companion object ==== | ||
| - | 어떤 class **이름**이 같은 object. 그 피대상인 class는 " | + | 어떤 class **이름**이 같은 object. 그 피대상인 class는 " |
| 이 때, object의 field들이 " | 이 때, object의 field들이 " | ||
| Line 1280: | Line 1291: | ||
| Type parameter를 **<fc red>덜 제한적</ | Type parameter를 **<fc red>덜 제한적</ | ||
| 타입 가변성(Type variance)은 Type parameter가 Base type이나 Sub type을 충족하도록 적응하는 방법을 지정한다. | 타입 가변성(Type variance)은 Type parameter가 Base type이나 Sub type을 충족하도록 적응하는 방법을 지정한다. | ||
| - | |||
| |< | |< | ||
| ^ | ^ | ||
| - | | | ||
| | +T | ? extends T | Covariance (공변성) | | +T | ? extends T | Covariance (공변성) | ||
| | -T | | -T | ||
| + | | | ||
| * Effective Java에서 나오는 [[https:// | * Effective Java에서 나오는 [[https:// | ||
| Line 1309: | Line 1319: | ||
| val f3: C => C = (c: CSuper) => new C | val f3: C => C = (c: CSuper) => new C | ||
| val f4: C => C = (c: C) => new CSub | val f4: C => C = (c: C) => new CSub | ||
| - | | + | |
| - | } | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | === Invariance === | + | |
| - | + | ||
| - | 무공변성. | + | |
| - | + | ||
| - | Type parameter의 기본값. | + | |
| - | + | ||
| - | <sxh scala> | + | |
| - | class Item[A] | + | |
| - | + | ||
| - | class Person | + | |
| - | class Employee extends Person | + | |
| - | class HomeMinusEmployee extends Employee | + | |
| - | + | ||
| - | + | ||
| - | object Practice extends App { | + | |
| - | // Okay! | + | |
| - | val p: Person = new Employee() | + | |
| - | val i1: Item[Person] = new Item[Person]() | + | |
| // Error! | // Error! | ||
| - | val i2: Item[Person] | + | |
| + | | ||
| + | */ | ||
| + | | ||
| } | } | ||
| </ | </ | ||
| - | === Covariance === | ||
| - | 공변성. | + | = Abstract types = |
| - | Type parameter가 부모 Type으로 변할 수 있는 성질. (Sub parameterized-type → Base parameterized-type) Type parameter 앞에 **+**를 붙인다. | + | https:// |
| - | + | ||
| - | <sxh scala ; highlight: [1]> | + | |
| - | class Item[+A] | + | |
| - | + | ||
| - | class Person | + | |
| - | class Employee extends Person | + | |
| - | class HomeMinusEmployee extends Employee | + | |
| - | + | ||
| - | object Practice extends App { | + | |
| - | | + | |
| - | val p: Person = new Employee() | + | |
| - | val i1: Item[Person] = new Item[Person]() | + | |
| - | + | ||
| - | // Okay! | + | |
| - | val i2: Item[Person] = new Item[Employee]() | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | === Contravariance === | + | |
| - | + | ||
| - | 반공변성. | + | |
| - | + | ||
| - | + | ||
| - | = Abstract types = | + | |
| - | <sxh scala ; highlight: | + | <sxh scala ; highlight: |
| import java.io._ | import java.io._ | ||
| import scala.io.Source | import scala.io.Source | ||
| Line 1377: | Line 1341: | ||
| // 위 소스를 응용한 예제 | // 위 소스를 응용한 예제 | ||
| abstract class BulkReader { | abstract class BulkReader { | ||
| - | type In // 구체적인 타입을 지정하지 않음. | + | type In // 구체적인 타입을 지정하지 않음. |
| val source: In // 바로 위에서 지정한 Type인 " | val source: In // 바로 위에서 지정한 Type인 " | ||
| def read: String | def read: String | ||
| } | } | ||
| - | class StringBulkReader(val source: String) extends BulkReader { | + | class StringBulkReader |
| - | type In = String | + | (val source: String) |
| + | | ||
| + | type In = String | ||
| override def read: String = source | override def read: String = source | ||
| } | } | ||
| - | class FileBulkReader(val source: File) extends BulkReader { | + | class FileBulkReader |
| - | type In = File | + | (val source: File) // 추상 타입의 실질 타입 정의 |
| + | | ||
| + | type In = File // 추상 타입 구체화 | ||
| override def read: String = { | override def read: String = { | ||
| val source1 = Source.fromFile(source) | val source1 = Source.fromFile(source) | ||