Skip to content

Instantly share code, notes, and snippets.

@mrbkdad
Created July 19, 2018 01:47
Show Gist options
  • Save mrbkdad/2ac5906655a6e9384a368c60352f669f to your computer and use it in GitHub Desktop.
Save mrbkdad/2ac5906655a6e9384a368c60352f669f to your computer and use it in GitHub Desktop.
learning scala chapter 7
Display the source blob
Display the rendered blob
Raw
{
"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