Created
July 19, 2018 01:47
-
-
Save mrbkdad/2ac5906655a6e9384a368c60352f669f to your computer and use it in GitHub Desktop.
learning scala chapter 7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 7. 패키지와 임포트\n", | |
"- 패키지도 중첩 가능\n", | |
"- 패키지 패스는 절대가 아니다.\n", | |
"- 패키지 구문에서 x.y.z 체인은 중간 패키지인 x와 x.y를 감춘다.\n", | |
"- 파일 시작에 나오는 중괄호 없는 패키지문은 전체 파일로 확장된다.\n", | |
"- 패키지 오브젝트는 함수와 변수를 가질 수 있다.\n", | |
"- 임포트문은 패키지, 클래스와 오브젝트를 임포트 할 수 있다.\n", | |
"- 임포트문은 아무 데나 올 수 있다.\n", | |
"- 임포트문은 멤버 이름을 바꾸거나 숨길 수 있다.\n", | |
"- java.lang.scala.Predef 는 항상 임포트 된다." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 패키지\n", | |
"- 네임스페이스 역할\n", | |
"- 패키지에 아이템을 추가하려면 패키지문 안에 넣으면 됨.\n", | |
"- 하나의 패키지를 여러 파일에 정의 할 수 있음\n", | |
"- 소스 파일 디렉토리와 패키지 사이에 강요된 관계는 없음\n", | |
" * Employee.scala 파일을 com/horstman/impatient 디렉토리에 넣지 않아도 됨\n", | |
"- 하나의 파일에 여러개의 패키지를 넣을 수도 있음\n", | |
"\n", | |
"<pre>\n", | |
"Employee.scala\n", | |
"package com{\n", | |
" package horstman{\n", | |
" package impatient{\n", | |
" class Employee(val id:Int, val name:String)\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"</pre>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 스코프 규칙\n", | |
"- 바깥 스코프에 있는 이름에 접근 할 수 있음\n", | |
"<pre>\n", | |
"package com{\n", | |
" package horstman{\n", | |
" object Utils{\n", | |
" def percentOf(value:Double, rate:Double) = value * rate / 100\n", | |
" }\n", | |
" }\n", | |
" package impatient{\n", | |
" class Employee{\n", | |
" ...\n", | |
" def giveRaise(rate:scala.Double){\n", | |
" salary += Util.percentOf(salary,rate)\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"</pre>\n", | |
"- scala 는 생략 가능\n", | |
" * 아이템 추가시 scala 패키지의 어떤것 관 이름 충돌 주의\n", | |
" * 아래의 샘플처럼 같은 파일이나 다른 파일의 같은 패키지 않에 collection 패키지가 존재하면 subordinates 에서 오류가 발생\n", | |
" * scala의 collection을 사용할 목적이였으나 패키지 않의 collection을 찾게됨\n", | |
" * scala는 패키지 이름이 상대적이다. 자바와 같이 루트에서 시작하는 절대적 개념이 아니기 때문에 약간의 주의를 요한다.\n", | |
" * 절대 패키지 이름을 사용하는 방법은 `_root_.scala.~~~` 처럼 `_root_` 로 시작하는 방법이 있다.\n", | |
" * 가능한 scala로 시작하는 완전한 패스를 사용하자\n", | |
"\n", | |
"<pre>\n", | |
"package com{\n", | |
" package horstman {\n", | |
" class Manager {\n", | |
" val subordinates = new collection.mutable.ArrayBuffer[Employee]\n", | |
" ...\n", | |
" }\n", | |
" package collection {\n", | |
" ...\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"</pre>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 체인 패키지\n", | |
"- 패키지 구문은 체인 혹은 패스 세그먼트를 포함 할 수 있다.\n", | |
"<pre>\n", | |
"package com.hostmann.impatient {\n", | |
" package people{\n", | |
" class Person\n", | |
" ...\n", | |
" }\n", | |
"}\n", | |
"</pre>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 파일 시작 표기법\n", | |
"- 충첩 표기법 대신 패키지 구문을 파일 맨 앞에 중괄호 없이 사용 가능\n", | |
"\n", | |
"<pre>\n", | |
"package com.horstman.impatient\n", | |
"package people\n", | |
"class Person\n", | |
"\n", | |
"package com.horstman.impatient{\n", | |
" package people{\n", | |
" class Person\n", | |
" }\n", | |
"}\n", | |
"</pre>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 패키지 오브젝트\n", | |
"- 패키지는 함수나 변수 정의는 포함할 수 없다. : JVM의 한계\n", | |
"- 이런 한계를 위해 패키지 오브젝트를 사용한다.\n", | |
" - 모든 패키지는 하나의 패키지 오브젝트를 가질 수 있다.\n", | |
" - 자식 패키지와 동일한 이름으로 부모 패키지에 정의 한다.\n", | |
" - 패키지 오브젝트는 내부적으로 정적 메소드와 필드를 가진 JVM 클래스로 컴파일됨\n", | |
" - ~.package 클래스로 정의됨\n", | |
" - 가능하면 소스 파일을 ~/package.scala 사용, 팀내부에서 패키지 오브젝트로 인식하여 사용 할 수 있음\n", | |
"\n", | |
"<pre>\n", | |
"package com.horstman.impatient\n", | |
" package object people{\n", | |
" val defaultName = \"Test Object\"\n", | |
" }\n", | |
"\n", | |
" package people{\n", | |
" class Person{\n", | |
" val name = defaultName<br/>\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"</pre>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 패키지 가시성\n", | |
"- 자신의 패키니 내에서 가시성을 가지려면 private[package_name] 한정자 사용\n", | |
"- 바깥 패키지로 확장하려면 private[parent_name] 한정자 사용\n", | |
"\n", | |
"<pre>\n", | |
"package com.horstman.impatient.people\n", | |
" class Person{\n", | |
" prevate[people] def description = \"A person with name\" + name\n", | |
" \n", | |
" private[impatiemt] def description2 = \"A person with family name\" + family_name\n", | |
" ...\n", | |
" }\n", | |
"\n", | |
"</pre>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 임포트\n", | |
"- 긴 이름 대신 짧게 사용 할 수 있게 해줌\n", | |
"- _ 와일드 카드로 사용\n", | |
"- * 인식자로 사용 가능 package com.horstman.*.people : 가능하면 사용하지 않는 것이 좋음\n", | |
"- 임포트문은 스칼라에서 처음뿐아니라 어디든 올수 있음(필요한 곳에서 임포트 사용 권장)\n", | |
"- 임포트문의 스코프는 바깥 블록 끝까지 확장됨" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import java.awt.Color._\n", | |
"val c1 = RED\n", | |
"val c2 = decode(\"#ff0000\") //Color.decode" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class Manager{\n", | |
" import scala.collection.mutable._\n", | |
" val subordinates = new ArrayBuffer[String]\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 멤버 이름 변경 및 숨기기\n", | |
"- 선택자 사용 가능 : import java.awt.{Color, Font}\n", | |
"- 선택자 문법은 이름을 변경 할 수 있음 : import java.util.{HashMap => JavaHashMap}\n", | |
"- 멤버 이름을 숨김 처리도 가능 : import java.util.{HashMap => _, _}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import java.util.{HashMap => _}\n", | |
"import scala.collection.mutable._" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"val hm = new HashMap[String,String]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"class scala.collection.mutable.HashMap" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"hm.getClass" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 암묵적 임포트\n", | |
"- 모든 스칼라 프로그램은 암묵적으로 다음과 같이 시작한다.\n", | |
" - import java.lang._\n", | |
" - import scala._\n", | |
" - import Predef._\n", | |
"- java.lang은 기본으로 임포트되며 scala 패키지가 임포트 된다.\n", | |
"- 이때 scala 패키지의 컴포넌트들이 자바 컴포넌트을 덥어 쓴다\n", | |
" - scala.StringBuilder은 java.lang.StringBuilder을 덮어 쓴다.\n", | |
"- 그리고 Predef 오브젝트가 임포트 된다." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"// 아래와 같이 사용이 가능한 이유이다\n", | |
"import collection.mutable.HashMap" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Apache Toree - Scala", | |
"language": "scala", | |
"name": "apache_toree_scala" | |
}, | |
"language_info": { | |
"file_extension": ".scala", | |
"name": "scala", | |
"version": "2.11.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment