2017년 2월 16일 목요일

[Python] 생성자


파이썬 클래스에는 인스턴스가 생성과 동시에 자동으로 호출되는 메서드인 생성자가 존재합니다. 파이썬에서는 __init__(self)와 같은 이름의 메서드를 생성자라고 하며, 파이썬 클래스에서 __로 시작하는 함수는 모두 특별한 메서드를 의미합니다.
다음은 생성자인 __init__(self) 메서드를 가진 MyClass 클래스를 정의한 것입니다. 앞서 설명한 것처럼 생성자의 첫 번째 인자도 항상 self이어야 합니다.
>>> class MyClass:
        def __init__(self):
                print("객체가 생성되었습니다.")

다음 코드를보면 인스턴스를 생성하자마자 화면에 메시지가 출력되는 것을 확인할 수 있습니다. 이는 인스턴스가 생성되는 시점에 자동으로 생성자인 __init__(self) 메서드가 호출됐기 때문입니다.
>>> inst1 = MyClass()
객체가 생성되었습니다.
클래스 생성자를 이해했다면 BusinessCard 클래스를 수정해 인스턴스의 생성과 동시에 명함에 필요한 정보를 입력받도록 클래스를 새롭게 정의해 봅시다. 
>>> class BusinessCard:
        def __init__(self, name, email, addr):
                self.name = name
                self.email = email
                self.addr = addr
        def print_info(self):
                print("--------------------")
                print("Name: ", self.name)
                print("E-mail: ", self.email)
                print("Address: ", self.addr)
                print("--------------------")

새로 정의된 BusinessCard 클래스의 생성자는 인자가 4개임을 확인할 수 있습니다. 물론 첫 번째 인자인 self는 생성되는 인스턴스를 의미하고 자동으로 값이 전달되므로 인스턴스를 생성할 때 명시적으로 인자를 전달해야 하는 것은 3개입니다. 따라서 인스턴스를 생성할 때 3개의 인자를 전달해주지 않으면 오류가 발생합니다. 생성자 호출단계에서 오류가 발생하면 인스턴스도 정상적으로 생성되지 않게 됩니다.
>>> member1 = BusinessCard()
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    member1 = BusinessCard()
TypeError: __init__() missing 3 required positional arguments: 'name', 'email', and 'addr'
>>>
새로 정의된 BusinessCard 클래스는 생성자에서 3개의 인자(name, email, addr)를 받기 때문에 다음과 같이 인스턴스를 생성할 때 3개의 인자를 전달해야 정상적으로 인스턴스가 생성됩니다. member1이라는 인스턴스가 생성된 후에는 인스턴스 메서드를 호출해 인스턴스 변수 값을 화면에 출력할 수 있습니다. 
>>> member1 = BusinessCard("Kangsan Lee", "kangsan.lee", "USA")
>>> member1.print_info()
--------------------
Name:  Kangsan Lee
E-mail:  kangsan.lee
Address:  USA
--------------------
>>>

출처 : https://wikidocs.net/1740


2017년 2월 13일 월요일

[Python] module import 방법



1]
>>> import os
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os']

2]
>>> from os import listdir
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'listdir']
os 모듈 내의 listdir() 함수를 호출할 경우 오류가 발생합니다. listdir()과 같이 해당 함수를 직접 이용하는 방법만 가능합니다.
>>> os
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    os
NameError: name 'os' is not defined
>>> os.listdir()
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    os.listdir()
NameError: name 'os' is not defined
>>> listdir()
모듈 내의 함수를 호출할 때 모듈을 임포트하는 첫 번째 방식에서는 '모듈명.함수명' 형태로 사용했는데, 두 번째 방식은 함수 이름만으로도 바로 함수 호출이 가능하므로 프로그래밍할 코드의 수가 적어진다는 장점이 있습니다. 다만 두 번째 방식은 기존에 선언된 변수나 함수와 이름이 충돌할 가능성이 있습니다.

extra]
아래 코드는 "os 모듈을 winos로 임포트하라"입니다. dir() 함수의 결괏값을 확인해보면 os 대신 winos 항목이 결괏값 리스트에 있는 것을 확인할 수 있습니다. 따라서 os 모듈 내에 있던 함수를 사용할 때도 os.getcwd()가 아니라 winos.getcwd()와 같이 사용해야 합니다.
>>> import os as winos
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'winos']
>>> winos.getcwd()
'C:\\Anaconda3\\Lib\\idlelib'
>>>

2017년 2월 9일 목요일

[Python] Module(time, os)


1]Time module
모듈은 직접 정의해도 되지만 일단은 기본적인 time 모듈을 사용해 보겠습니다. time 모듈에서 현재 시각을 구하는 함수는 time()입니다. 
>>> import time
>>> time.time()
1444532446.467043
>>> time.ctime()
'Sun Oct 11 12:00:50 2015'
>>> type(_)
<class 'str'>
사람들이 좀 더 쉽게 읽을 수 있는 시간을 구하려면 ctime() 함수를 사용하면 됩니다. 
여기서 type() 함수의 인자로 _를 사용했는데 파이썬 IDLE에서 _는 가장 최근의 반환값을 바인딩하고 있는 변수입니다. <class 'str'>, 즉 문자열 타입임을 알 수 있습니다.
time.ctime()의 반환값에서 연도(year)만 구하려면 어떻게 해야 할까요? 앞서 time.ctime()의 반환값이 문자열이었으므로 문자열에서 제공하는 메서드를 사용하면 되겠죠?
>>> cur_time = time.ctime()
>>> print(cur_time.split(' ')[-1])
2015

time 모듈의 sleep() 함수는 인자로 전달되는 값에 해당하는 초(sec) 동안 코드의 실행을 멈추는 역할을 합니다.코드를 실행하면 파이썬 IDLE에서 숫자가 1초 간격으로 출력되는 것을 확인할 수 있습니다.
>>> for i in range(10):
        print(i)
        time.sleep(1)

앞에서 설명한 것처럼 파이썬에서 모듈은 파이썬 파일을 의미합니다. 그러나 모듈의 실행 속도가 중요한 일부 모듈은 파이썬으로 작성되지 않고 C 언어로 작성됩니다. 이 경우에는 해당 모듈의 코드를 직접 볼 수는 없습니다. 다음 코드는 time 모듈과 random 모듈을 임포트한 후 해당 모듈의 위치를 확인하는 코드입니다. time 모듈은 내장 모듈이기 때문에 해당 모듈의 위치가 따로 출력되지는 않지만 random 모듈은 해당 모듈이 위치하는 경로가 출력되는 것을 볼 수 있습니다.
>>> import time
>>> time
<module 'time' (built-in)>
>>> import random
>>> random
<module 'random' from 'C:\\Anaconda3\\lib\\random.py'>

모듈 안에 어떤 함수나 변수가 있는지 어떻게 확인할 수 있을까요? 임포트된 모듈에 대해 모듈명을 사용해 dir() 내장 함수를 호출하면 해당 모듈의 구성 요소를 확인할 수 있습니다.
>>> import time >>> dir(time) ['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']


2]OS module
os 모듈은 Operating System의 약자로 운영체제에서 제공되는 여러 기능을 파이썬에서 수행할 수 있게 해줍니다.
먼저 현재 경로를 구하려면 os 모듈의 getcwd() 함수를 사용하면 됩니다. 아래 코드는 현재 파이썬 IDLE가 해당 경로에서 실행됐기 때문입니다.
>>> import os
>>> os.getcwd()
'C:\\Anaconda3\\Lib\\idlelib'
>>>

특정 경로에 존재하는 파일과 디렉터리 목록을 구하는 함수인 listdir() 함수를 사용해보겠습니다. 다음 코드를 보면 현재 경로인 C:\Anaconda3\Lib\idlelib에 존재하는 파일과 디렉터리 목록이 리스트로 구성된 후 반환되는 것을 확인할 수 있습니다.
>>> os.listdir()
['aboutDialog.py', 'AutoComplete.py', 'AutoCompleteWindow.py', 'AutoExpand.py' .......]
 listdir() 함수의 인자로 특정 경로를 지정하는 경우 해당 경로에 있는 파일,디렉터리 목록이 반환됩니다.
>>> os.listdir('c:/Anaconda3')
['conda-meta', 'DLLs', 'Doc', 'envs', 'Examples', 'include', ....]

listdir() 함수의 반환값에 대해 len() 함수를 사용한 예입니다. 해당 경로에는 28개의 파일 또는 디렉터리가 존재하는 것을 확인할 수 있습니다. 참고로 type() 함수를 이용해 listdir()함수의 반환값 타입은 리스트임을 확인할 수 있습니다.
>>> files = os.listdir('c:/Anaconda3')
>>> len(files)
28
>>> type(files)
<classlist’>

이번에는 'c:/Anaconda3'이라는 경로에 있는 파일 중 확장자가 'exe'로 끝나는 파일만 출력하는 코드를 작성해 보겠습니다. 문자열의 endswith() 메서드를 조합하면 됩니다. 
>>> for x in os.listdir('c:/Anaconda3'):
        if x.endswith('exe'):
                print(x)
python.exe
pythonw.exe
Uninstall-Anaconda.exe
출처 : https://wikidocs.net/3086

2017년 2월 8일 수요일

[Java]외워야 할 Math class 함수들


Math.PI 원주율
Math.sqrt(number) 제곱근
Math.toDegree(num) 라디안(컴퓨터) -> 디그리(사람) 단위로 변환
Math.toRadians(num)

Math.sin(num) 싸인
Math.cos(num) 코싸인
Math.tan(num) 탄젠트     num은 라디안 단위 값이여야 한다.

Math.log(num) 로그
Math.pow(num, 5) num의 5승

Random ran = new Random();
ran.nextInt(1000); ram.nextBoolean(); 난수 생성

StringTokenizer st = new StringTokenizer("문자열", "토큰");
public String nextToken()           //다음 토큰 반환
public boolean hasMoreTokens() //반환할 토크 확인

[Englsih]Day10

fossil fuel : 화석연료
diurnal : 주행성인, 하루동안인
novice : 초보자

One of the main causes of global warming is CO2 or carbon dioxide.
지구 온난화의 주된 원인 중 하나는 이산화 탄소이다. or는 equal의 의미로 해석한다.

I'll have a think about it.Sorry, I don't think I've got the time.It's not my cup of tea. 그것은 내가 좋아하지 않어.
Great! Sign me up please. 등록시켜주세요.
Country          People
-an
Australia         Austrailan
Malaysia         Malaysian
-ese
Japan             Japanese
Vietnam          Vietnamese
-i
Bangladesh      Bangladeshi
Kuwait            Kuwaiti
others
France            French
New Zealand   New Zealander
Philippines      Filipino

2017년 2월 7일 화요일

[Hadoop] WordCount Mapper 구현

MapReduce 프로그램은 3부분으로 구성된다.
  1. Driver
  2. Mapper
  3. Reducer
첫번째로 Mapper를 살펴보자.


package hadoop_test;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends
Mapper<LongWritable, Text, Text, IntWritable>{

private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException{
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreTokens()){
word.set(itr.nextToken());
context.write(word, one);
}
}
}
알고리즘
1. 입력파라미터의 값인 문장을 공백 단위로 구분해 글자 수를 계산
2. 구분된 글자는 즉시 출력 파라미터에 추가. 글자 수를 1로 설정. ex) hi bob = 2


1]
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable>

위 클래스는 Mapper 를 상속한다. 그대로 사용할 수 있지만 대부분 오버라이딩 한다.
Mapper.java는 Hadoop/src/mapred/org/apache/hadoop/mapreduce 에 정의되어 있다.

또한 제네릭 파라미터를 사용한다. 제네릭을 모른다?https://wikidocs.net/268
Mapper 코드는 입력 파일을 <Key, Value> 쌍으로 읽고 키 값 쌍을 내 보낸다.
순서대로 Mapper<입력 키 타입, 입력 값 타입, 출력 키 타입, 출력 값 타입>이다.
위 코를 해석하면 Mapper<Long, String, String Integer>이다.

어째서 LongWritable -> Long,  IntWritable-> Integer 이냐면, 맵리듀스는 네크워크 통신을 위한 최적화된 객체로 WritableComparable 인터페이스를 제공한다. 이를 통해 데이터 타입을 Wrapping을 하기 때문에 자료형의 클래스가 다르다. WritableComparable를 직접 구현하여 쓸 수 도 있다.



2] private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

word는 키 , one은 값으로 사용한다. 예를 들어 "hi my hi "를 wordcount 하면 hi:2 my:1로 출력해야 한다. 글자 수는 1이여야 하므로 one을 final static으로 지정했다.  



3]  public void map(LongWritable key, Text value, Context context)

Mapper class스에도 정의되어 있는 method다. 각 인자는 <입력 키 타입, 입력 값 타입, Context 객체>이다. 이때 첫번째와 두번째 인자는 매퍼 클래스를 상속 받을 때와 동일한 타입이여야 한다. 즉 1]과 같이 데이터 타입을 Long, String으로 해야한다.

세번째 인자는 맵리듀스와 통신하면서 출력데이터, 모니터링에 필요한 상태값 등을 갱신하는 역할을 한다. Mapper.java 클래스에 Context클래스가 정의되어 있으며 생성자를 보면 InputFormat라는 추상클래스가 제공하는 RecordReader를 볼 수 있다. 이 때문에 입력 스플릿이 키와 값의 레코드로 맵 메서드의 파라미터로 전달 될 수 있는 것이다.


4]  StringTokenizer
StringTokenizer를 통해 공백 단위로 구분된 String값을 순회한다.
클래스에 대한 정보는 https://docs.oracle.com/javase/7/docs/api/




[Java]기본 Class들(Wrapper, BigInteger, BigDecimal)


1)Wrapper class 
기본 자료형의 인스터스화를 지원
-Boolean
-Character
-Byte
-Short
-Integer
-Long
-Float
-Double
모든 기본 자료형에 해당하는 Wrapper클래스가 정의되어 있다. 또한 String의 참조 값을 인자로 받는 생성자들이 있어서 Integer num = new Integer("1230"); 이 가능하다.

1-2)unboxing
또한 wrapper클래스의 인스턴스에 저장된 값은 변경이 불가능하다. 새로운 인스턴스의 생성 및 참조만이 가능할 뿐이다.
이를 위한 기능 인스턴스->기본자료형으로 바꾸는 작업을 unboxing이라 한다.
Ex)
Double d  = new Double(3.14);
d2 = new Double(d.doubleValue()+1.2); //인스턴스에 저장되 있는 값을 얻어 새로 참조.

그러나 현재는 auto boxing/unboxing 기능을 지원한다.
Double d  = new Double(3.14);
d2 = d+1.2;    //인스턴스 d를 unboxing하여 1.2와 더한 후, 다시 boxing 하여 d2에 저장.



2)와 3)둘다 java.math패키지를 import해야 한다.

2)BigInteger class
Long형보다 더 큰 수를 표현할 때 사용.
BigInteger b = new BigInteger("111111111111111111111111111");
BigInteger b2 = b.add("12312222222222222");
//문자형으로 받는다. long형보다 큰 수를 변수에 못 담으니 생성자도 존재할 수 없다.

3)BigDecimal class
오차없는 실수 표현을 위한 클래스
BigDecimal c = new BigDecimal("1.66");
c= c.add(new BigDecimal("0.33"));