** 본 요약은 한빛미디어 '하이버네이트 프로그래밍' 책을 기준으로 작성되어져 있다.

** 본 설명은 바로 따라하기 하기엔 어려움이 있다. 책을 보지 않은 사람에게는 간단히 어떤 기능을 제공하는지 이해하는데 목적을 둔다.

** 하이버네이트 3.2.5.ga 버전, Ant 빌드를 기본적으로 사용한다.


7장 설정 파일 대신 어노테이션 사용하기

이전 장에서는 XML 매핑 문서를 기준으로 책의 내용을 진행해왔습니다. 이번 장에서는 자바 어노테이션을 이용해 어떻게 매핑 문서를 대체하는지 설명합니다.


하이버 네이트의 철학 : 오래된 어떤 자바 객체라도 어떤 방법으로든 영속화 한다.


자바의 어노테이션(Annotation) 


자바에서 보통의 클래스나 필드, 혹은 메소드에 부가적인 정보를 추가하는 문법이다. JAVA 5 버전부터 정식으로 지원하게 되었으며, 이전에는 JavaDoc의 형태를 이용해 작성하여 사용하였었다. JavaDoc는 프로그래머가 소스 코드에서 개별 파일로 분리해 별도로 관리하지 않으면서도 클래스나 API등의 수준 높은 만드는데 사용하는 방법이다. JavaDoc를 기존 목적 이외의 기능에 사용하려고 하였으며, 이를 활용해 XDoclet 프로젝트를 만들었습니다. 물론 하이버네이트에서는 이 프로젝트를 이용해 하이버네이트 XDoclet 태그도 개발되었습니다.

 


하이버네이트 어노테이션


어노테이션을 사용한 방법은 객체와 매핑 명세 정보를 한 파일에서 관리할 수 있도록 해, 파일을 읽는 사람은 무슨 일을 처리하는 내용인지 좀 더 쉽게 이해 할 수 있습니다. 또한 프로그래머는 설정에 필요한 작업량을 줄일 수 있는 장점이 있습니다.


하지만 객체 모델을 다양한 데이터베이스에 맞춰 변경해야 한다면 어노테이션 사용법은 적합하지가 않습니다. 이럴 경우에는 여러 개의 분리된 매핑 파일 세트를 만들어 사용하는 것이 더 적합합니다. 


그러면 하이버네이트 어노테이션을 사용하기 위해 다음과 같은 작업이 필요합니다. 


1. Hibernate annotations 라이브러리 다운로드 (3.2.5.ga 버전 기준)

-> 3.5 버전부터는 Hibernate core로 통합됨

2. annotation을 이용한 자바 객체 생성하기 

3. hibernate.cfg.xml 파일내 맵핑 파일 대신 맵핑 클래스 추가하기

-> JPA 인터페이스에 의존하는 스타일로 완전히 전환하면 맵핑 클래스 추가 없이 하이버네이트에서 자동으로 클래스를 찾아 낼 수 있다.(하이버네이트 세션 대신 JPA EntityManager의 하이버네이트 구현을 사용해야 한다)

4. 스키마 생성시 <annotationconfiguration> 태그 사용하기

-> Hibernate tool을 이용해 스키마 생성시 자바 객체 클래스들은 미리 컴파일 되어 있어야만 한다.

5. 하이버네이트 이용을 위해 config 정보를 읽는 클래스를 Configuration 대신 AnnotatoinConfiguration 클래스로 변경하기


어노테이션을 이용한 자바 객체 작성 방법


다음 소스를 보면서 자바 객체 작성법을 import 부분, class 부분, 그리고 attribute(속성) 부분으로 나눠 설명 드리겠습니다. 


import 부분을 보시면, 어노테이션도 일종의 클래스로 분리 되기 때문에 사용하고자 하는 어노테이션을 import에 명시해야 사용할 수 있습니다. 기본적으로 JPA API를 지원하기 때문에 공통적으로 사용할 수 있는 어노테이션의 경우 javax.persistence 패키지에 선언된 어노테이션을 가져옵니다. 그리고 하이버네이트 특유의 어노테이션 지원을 위해 org.hibernate.annotations 패키지에서 필요한 패키지를 가져옵니다. 


class 부분은 Entity 어노테이션으로 시작합니다. 이 것은 클래스가 영속화가 가능하다는 것을 표시합니다. Table 어노테이션은 필수 사항이 아닙니다. 하이버네이트에서는 table 어노테이션을 사용하지 않으면, 자동적으로 클래스 이름을 테이블명으로 지정해 사용합니다. 하지만, Table 어노테이션을 이용하 테이블명을 직접 지정할 수 있습니다. NamedQueries는 기존의 맵핑 문서를 작성하면서 보았던 사용자 지정 쿼리입니다. 이 부분은 하이버네이트에서 어노테이션을 사용할 때 나타나는 단점 중 하나로, 네임드 쿼리를 다른 파일로 분리해 둘 곳이 없기 때문에 발생하는 문제 입니다. 이 문제는 JPA EntityManager를 사용하면 네임트 쿼리를 xml파일로 내보내 해결할 수 있습니다. 


attribute 부분에서는 컬럼의 속성들을 Id, Column, Index, ManyToOne, JoinColumn 어노테이션을 이용해 기존 맵핑 문서에서 정의한 내용들을 손쉽게 작성하고 있는 것을 확인 할 수 있습니다. Column 어노테이션의 name 값을 설정해 Table 내의 컬럼명을 지정할 수 있습니다. 이 값을 지정하지 않으면, 하이버네이트에서는 자동으로 속성명을 컬럼명으로 사용하게 됩니다.



import java.util.HashSet;

import java.util.Set;


import javax.persistence.*;


import org.hibernate.annotations.Index;


@Entity

@Table(name="ARTIST")

@NamedQueries({

    @NamedQuery(name="com.oreilly.hh.artistByName", 

        query="from Artist as artist where upper(artist.name) = upper(:name)")

})

public class Artist {


    @Id

    @Column(name="ARTIST_ID")

    @GeneratedValue(strategy=GenerationType.AUTO)

    private Integer id;

    

    @Column(name="NAME",nullable=false,unique=true)

    @Index(name="ARTIST_NAME",columnNames={"NAME"})

    private String name;


    @ManyToMany

    @JoinTable(name="TRACK_ARTISTS", 

               joinColumns={@JoinColumn(name="TRACK_ID")},

               inverseJoinColumns={@JoinColumn(name="ARTIST_ID")})

    private Set<Track> tracks;


    @ManyToOne

    @JoinColumn(name="actualArtist")

    private Artist actualArtist;


    public Artist() {}


    public Artist(String name, Set<Track> tracks, Artist actualArtist) {

        this.name = name;

        this.tracks = tracks;

        this.actualArtist = actualArtist;

    }


    public Integer getId() {

        return id;

    }


    public void setId(Integer id) {

        this.id = id;

    }


    public String getName() {

        return name;

    }


    public void setName(String name) {

        this.name = name;

    }


    public Artist getActualArtist() {

        return actualArtist;

    }


    public void setActualArtist(Artist actualArtist) {

        this.actualArtist = actualArtist;

    }


    public Set<Track> getTracks() {

        return tracks;

    }


    public void setTracks(Set<Track> tracks) {

        this.tracks = tracks;

    }


    public String toString() {

        StringBuilder builder = new StringBuilder();


        builder.append(getClass().getName()).append("@");

        builder.append(Integer.toHexString(hashCode())).append(" [");

        builder.append("name").append("='").append(getName()).append("' ");

        builder.append("actualArtist").append("='").append(getActualArtist());

        builder.append("' ").append("]");

      

        return builder.toString();

    }

}


다른 객체의 경우도 위와 같은 방법을 이용해 어노테이션을 사용한 자바 객체로 변경할 수 있습니다. 그럼 6장에 나오는 복합 유저 타입 클래스는 어떻게 어노테이션을 지정해야 할까요? 그것은 @Embedded 어노테이션을 복합 유저 타입 클래스에 명시해 주면 됩니다. 



Posted by 빌리 :

7장 반복


* for문

  - 설명 : 실행 횟수가 정해진 반복문으로, 조건문을 지정해 얼마나 반복할지 지정할 수 있다.

  - 형식 

    for [변수] in [리스트] :

      [for-블록]

  

    + [리스트] : 탐색을 수행할 리스트 객체를 놓는다.

    + [변수] : 탐색을 수행할 리스트에서 하나씩 데이터 객체를 꺼내온다.

    + [블록] : 들여쓰리고 블록을 구분한다. 변수에 지정된 데이터 객체를 블록에서 사용한다.

    

  - 특징 

    1) [리스트]에 파일 객체를 놓으면, readline() 메소드를 호출하는 것과 같이 파일을 한줄씩 읽어와 [변수]에 한줄씩 할당한다.

    2) [리스트]에 문자열을 놓으면, 문자 하나씩 읽어와 [변수]에 문자를 할당한다.

      + 예제

        >> for c in 'test' : 

        ..   print c

        ..

        t

        e

        s

        t

        

* for문 활용 

1. 자바나 C에서 처럼 for문으로 인덱스 접근을 통해 루프 사용방법

  - 설명 : 인덱스 접근을 위해 숫자 리스트을 만들어 주는 range() 함수와 리스트 길이를 알아내는 len() 함수를 이용한다.

  - 사용법 : len() 함수로 리스트 길이를 가져온 이후, 그 0부터 길이만큼 숫자 리스트를 range() 함수로 만든다.

  - 형식 

    for index in range(len([리스트])) : 

      print [리스트][index]


2. enumerate()를 활용한 for문

  - 설명 : enumerate() 함수를 사용하면 리스트의 인덱스와 값을 쌍으로 하는 값을 사용할 수 있다.

  - 예제

    >> list = "s a m p l e".split()

    >> for map in enumerate(list) :

    ..   print map

    ..

    (0,'s')

    (1,'a')

    (2,'m')

    (3,'p')

    (4,'l')

    (5,'e')

    

  - 추가 형식 : 파이썬은 다중 값 할당을 지원한다.

    >> list = [1, 2, 3]

    >> for (index, value) in enumerate(list) :

    ..    list[index] = 2 * value

    ..    print list

    ..

    [2,2,3]

    [2,4,3]

    [2,4,6]

    

* enumerate 함수

  - 설명 : 리스트, 튜플, 무자열 같은 시퀀스 타입에 대해 인덱스, 값으로 구성된 리스트를 반환한다.

  -> (0, seq[0]), (1, seq[1]), (2, seq[2]), ...

  

* range 함수

  - 설명 : 숫자 리스트를 생성하는 내장 함수

  - 형식 : range([시작값], [종료값], [간격값])

    + [시작값] : 숫자 리스트를 시작하는 정수

    + [종료값] : 숫자 리스트를 종료하는 정수의 +1 값

    + [간격값] : 숫자 리스트의 간격을 지정할 수 있다.

      -> 시작값은 생략 가능하며, 생략하면 0부터 종료값 -1까지의 숫자 리스트가 생성된다.

      -> 간격값 또한 생략하며, 기본으로 숫자 간격이 1로 설정 된다.

      -> 간격값은 음스로 지정할 수 있으나, 이때 반드시 시작값이 종료값보다 커야한다.

      

  - 예제 

    >> range(0, 4)

    [0, 1, 2, 3]

    >> range(1)

    [0]

    >> range(0)

    []

    >> range(1, 5, 2)

    [1, 3]

    

* 다중 값 할당

  - 설명 : 파이썬은 여러 값을 쓰고 한꺼번에 할당 할 수 있다. 이 값은 리스트, 문자열, 또는 다른 시퀀스 타입에 있더라도 동작한다. 대신 할당할 변수 개수와 값의 개수가 일치해야만 한다.

  

  - 예제

    >> x, y, z = 1, 2  # 우측과 좌측의 개수가 달라 에러 발생

    >> x, y = 1, 2     # 우측 변수 개수 = 좌측 변수 개수

    >> a,b,c = 'STR'

    >> a,b,c = [2,3,4]

    

* while 문

  - 설명 : 조건형 루프라 부르며, 조건이 참일 동안 반복하는 특징이 있다.

  - 형식

    while [조건] : 

      [블록]

      

* 반복문 제어

  - 설명 : java에서 반복문 제어를 위해 break와 continue 지시어를 사용하는 것처럼, 파이썬에서도 동일한 지시어를 사용해 반복문을 제어할 수 있다.

    -> break : 즉시 루프의 블록을 벗어난다.

    -> continue : 다음 반복으로 건너 뛴다.

    

*** 반복문과 조건문을 사용할 때 주의사항

1. 이해하기 쉬운 구조로 코드를 작성할 수 있게 주의를 기울인다.

2. 중첩되는 양을 최대한 줄인다. 

Posted by 빌리 :
6장 선택

파이썬에서는 True와 False라는 불린(Boolean) 값(대문자로 시작하는 것을 주의)을 이용해 참과 거짓을 표현한다. 이러한 불린 값을 이용해 제어 흐름문의 사용 방법을 설명한다.


* 불린 연산자 : and, or, not
  - 우선 순위 : not > and, or
  - not : 단항 영산자로 사용하면 값을 반대로 바꿔준다. 
    + 샘플  
      not False = True
      not True = False
      
  - and : 양쪽의 식이 모두 참일 때 참이다. 
    + 샘플 
      True and True = True
      True and False = False
      False and True = False
      False and False = False
  
  - or : 양쪽의 식 중에 하나라도 참일 때 참이다.
    + 샘플 
      True and True = True
      True and False = True
      False and True = True
      False and False = False
  

* 관계 연산자
  - 설명 : 프로그램에서 불린 값을 만들기 위해서 관계 연산자를 이용한다. 관계 연산자를 이용한 비교를 통해 True,False 값을 만들고, 그것이 제어 흐름문(if, while)을 수행할지 말지를 판단하게 만든다.
  
  - 연산자 : > , < , >= , <= , == , !=
  
  - 우선순위 : 
    1) 산술 연산자(+, -, /, *)는 관계 연산자보다 우선순위가 높다.
    2) 불린 연산자(not, or, and)는 관계 연산자보다 우선순위가 낮다.
    => (+, -, /, *) > 관계 연산자 > (not, or, and)
    
  - 샘플 
    >> 1 > 2
    False
    >> 3 < 5
    True
    
  - 특징 : 여러 비교 수식을 연속해서 쓸 수 있다. 1 < x < 5와 같이 연속해서 사용 가능하다.
  
* 불린값
  - 참과 거짓을 표현하는 값으로 True와 False를 이용한다. 
  - 연산자 별 반환값
    1) 관계 연산자(<,>,<=,>=,==,!=) : True, False로 반환
    2) 불린 연산자(not) : True, False로 반환
    3) 불린 연산자(or, and) : 수식이 종료된 순간의 값을 반환
      + 샘플 
        >> not 1
        False
        >> 1 or 2
        1
        >> 2 and 0
        0
        >> '' and False
        ''
        >> 'test' or True
        'test'

    + 부가설명 : 특이한 점은 True/False를 반환하지 않고 연산이 끝난 값을 반환한다. 이러한 특징을 이용하면 특정 조건에서 값을 할당할 때 사용할 수 있지 않을까하는 생각이 든다.
    
  - 특징 : 숫자 
    1) 수에서 불린값을 사용하면 True는 모든 수로 취급을 하며, False는 0과 0.0으로 취급 한다. 거꾸로도 사용된다. 
      + 샘플 
        >> not 0
        True
        >> not 1
        False
    
    2) and와 or를 포함하는 수식은 왼쪽에서 오른쪽으로 평가한다. 또한 평가를 멈춰도 되면, 아직 평가하지 않은 피연산자가 있더라도 평가를 중단한다. 자바의 &&와 || 연산자와 똑같이 동작한다.
      + 샘플
        >> 0 and 3
        0
        >> 3 and 0
        0
        >> 3 and 5
        5
        >> 1 or 0
        1
        >> 0 or 2
        2
        >> True or 0
        True
 
  - 특징 : 문자열
    1) 문자열에서도 관계 연산자를 사용할 수 있다. 문자열의 문자는 정수로 표현하는데 이 값을 비교해 불린 값을 만든다. 
      + 샘플 
        >> 'A' < 'a'
        True
        >> 'a' > 'z'
        False
        >> 'abc' < 'abz'
        True
        
    2) 빈 문자열은 False, 다른 모든 문자열은 True로 취급된다.
    
  - 특징 : 산술 연산
    1) True는 1, False는 0으로 취급되어 산술 연산이 가능하다.
      + 샘플 
        >> 1 + True
        2
        >> 3 - False
        3


* if 문

  - 설명 : 기본적인 조건문으로 블록을 들여쓰기를 통해 구분한다. elif와 else 키워드를 이용해 중첩 if문을 작성할 수 있다.

  - 형식 :

    if [조건] :

      [if-블록]

    elif [조건] : 

      [elif-블록]

    else :

      [else-블록]

      

    + [조건] : name != ""이나 x<y와 같은 수식. 꼭 불린 값을 필요는 없어서, 결과 값이 자동으로 불린값의 True, False로 자동 변환된다.

    + [블록] : 들여쓰기로 블록을 구분한다. 블록을 적고, 종료되면 빈 한줄을 추가해 if 문이 종료되었음을 표시한다.



Posted by 빌리 :

5장 리스트


* 리스트 생성

  - 형식 : [리스트명] = [[값], [값], [값], ...]
    + 리스트명 : 일반 변수명과 똑같이 사용한다.
    + 값 : 값은 여러가지 타입이 혼합되어 사용될 수 있으며, 각각의 값들은 콤마(,)로 구분되어 진다. 
    -> tip : 문자열 리스트를 만들기 위해 다음과 같이 split메소드를 이용해 배열을 만든다.
      (code) strlist = 'str1 str2 str3 str4 str5'.split()      

* 리스트 값 접근
  - 형식 : [리스트명][[index]]
    + index : 리스트에 접근하려는 번호를 쓰면 된다. 다른 언어와 같이 리스트가 가진 범위를 벚어나는 인덱스를 넣으면 오류가 발생한다. 시작은 0부터이다.
    
* 리스트 값을 거꾸로 접근하기
  - 설명 : 일반 리스트 값 접근 방식에서 인덱스에 음수를 넣어 접근한다. 시작은 -1부터이다.
  
* 리스트 관련 내장 함수
  - len(L) : 리스트에 들어있는 항목 수
  - max(L) : 리스트에 들어있는 항목의 최대값
  - min(L) : 리스트에 들어있는 항목의 최소값
  - sum(L) : 리스트에 들어있는 항목의 합
    -> sum의 경우 모든 항목이 숫자로 이루어져야 동작한다.

* 리스트 관련 메소드
  - L.append(v) : v값을 L리스트에 추가한다.
  - L.insert(i, v) : v값을 L리스트의 i인덱스에 추가한다.
  - L.remove(v) : L리스트에서 처음나오는 v값을 제거한다.
  - L.reverse() : L리스트의 순서를 반대로 바꾼다.
  - L.sort() : L리스트의 순서를 정렬한다.
  - L.pop() : L리스트의 마지막 항목을 제가한 후 반환한다.
  
  => pop를 제외하고, 모든 메소드는 None라는 특별한 값을 반환한다. None는 파이썬에서 '아무것도 없음'을 의미한다.
  
* 리스트 연산
  - [리스트명] + [리스트명] 과 같이 더하기(+) 연산자를 이용해 리스트를 연결할 수 있다.
    (code) ['a','b'] + ['c'] => ['a', 'b', 'c']
  - [리스트명] * [숫자] 과 같이 곱하기(+) 연산자를 이용해 리스트를 반복할 수 있다.
    (code) ['a','b'] * 2 =>  ['a','b', 'a','b']    

* 리스트의 부분 집합 가져오기(Slice)
  - 설명 : 리스트에서 특정 인덱스의 값만 취하고 싶을때 사용한다.
  - 형식 : [리스트명][[시작index]:[종료index]]
    + 시작index : 리스트를 가져올 최초 index 값이다. 값을 생략할 수 있으며, 생략하면 0이 기본값으로 설정된다.
    + 종료index : 리스트를 가져올 마지막 index 값이다. 값을 생략할 수 있으며, 생략하면 마지막 index 값이 기본값으로 설정된다.
  -- 샘플 
 list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
         list[:2]  => ['a', 'b']
         list[1:2] => ['b']
         list[4:]  => ['e', 'f', 'g']
         
  ** TIP : 문자열도 리스트에서 부분 집합을 가져오는 방법으로 부분 문자열을 가져올 수 있다. 파이썬에서 문자열은 문자의 리스트와 같이 취급 된다.
 

* 별칭(alias)
파이썬에서는 두 변수가 동일한 값을 가리킬 때 별칭을 가진다고 한다. 예를 들면 하나의 리스트를 생성해 두개의 변수의 할당하면, 리스트에 접근점이 두개가 된다는 것과 같다. 이 내용은 함수로 객체를 넘겼을 때 call by reference를 설명하기 위해 나온 것 같다.

* 중첩 리스트
리스트에는 어떤 타입의 데이터도 담을 수 있다. 즉, 리스트 안에 리스트를 담을 수 있다는 것이다. 
  - 샘플 
      duplist = [['Canada', 76], ['United States', 75], ['Mexico', 71]]      

* 다른 시퀀스 타입
  - 설명 : 순서가 있는 데이터(sequence)에는 리스트말고도 다른 것이 존재 한다. 순서가 있는 데이터(sequence)라는 말은 인덱스로 참조 가능하며 리스트처럼 슬라이싱해 새로운 문자열을 생성할 수 있다는 것이다. 
  - 시퀀스 타입 : 
    1) 문자열 : 문자의 불변 시퀀스
    2) 튜플 : 리스트의 불편 시퀀스 형식, 괄호를 이용해 생성하며, 리스트 처럼 사용가능하다. 한번 생성한 튜플은 변경할 수 없다.
      - 샘플 
        >> bases = ('A', 'C', 'G')
        >> for t in bases : 
        ..  print t
        A
        C
        G
        >> bases[0] = bases[1]
        에러 발생
      - 튜플을 사용하는 이유 : 특정 연산을 안전하게 만들어 주기 때문이라는데, 파이썬에 자바에는 final과 같은 연산자가 없어서 그런 것 같다.
      
* 파일을 리스트로
  - 설명 : 파일을 open 함수를 이용하면, 파일 객체를 사용할 수 있다. 이 객체를 for 루프에서 사용하면 파이썬은 자동으로 readline을 호출해 준다.
  
  - 샘플 :
    + data.txt
    Mer
    Venu
    Ea
    
    + code
    >> data = opne('data.txt', 'r')
    >> for line in data :
    ..   print len(line)
    4
    5
    3
  
  - 주의점 : readline은 개행 문자를 포함하고 있어 의도하지 않은 결과를 만들 수 있기 때문에 문자열의 strip() 메소드를 이용해 개행 문자를 제거해 줘야 한다.
  
* 커맨드라인 인자
  - 설명 : 파이썬에서는 자바 main함수를 호출할때 arg 변수에 인자를 얻을 수 있는 것처럼 인자를 받는 방법을 제공한다. 이는 sys이라는 모듈의 argv라는 리스트 변수에 저장된다. 첫번째 인자에는 프로그램명이 들어가고, 그 이후에 인자가 저장된다.
  
    sys.argv : 커맨드라인 인자가 저장되는 리스트 변수
    sys.argv[0] : 실행 프로그램명
    sys.argv[1]~[n] : 커맨드라인 인자


Posted by 빌리 :

4장 모듈

모듈은 한 파일에 모아둔 함수 모음이다. 


* 모듈 생성하기

  - 설명 : .py를 확장자로 가진 파일에 def로 함수를 선언하여 저장한다. 이때 [모듈명].py 파일이 저장되며, 이는 [모듈명] 모듈이 생성된 것이다.


  

* 모듈 가져오기 

  - 형식 : import [모듈명]

    + 모듈명 : 보통 파이선 파일 이름이 모듈명이 된다. (test.py -> test)

 

 

* 모듈 도움말 보기

  - 설명 : 모듈을 Import 한 이후 help 명령어를 이용한다.

  - 형식 : help([모듈명])

    

    

* 모듈 사용하기

  - 설명 : 모듈에 선언되어 있는 함수들을 사용하는 방법은 모듈명에 점(.)을 붙여 함수를 호출한다.

  - 형식 : [모듈명].[함수명]([매개변수])

    + 함수명 : 모듈에 def로 지정한 이름을 함수명으로 사용한다.

    + 매개변수 : 함수에 매개변수가 지정되어 있으면 매개변수를 같이 사용한다.

    

    

* 모듈에 있는 특정 함수만 가져오기

  - 설명 : 모듈에 사용하고자 하는 함수만 Import할 수 있으며, 사용할때는 모듈명을 이용하지 않고 함수명을 가지고 바로 실행할 수 있다.

  - 형식 : from [모듈명] import [함수명], [함수명], ...

    + 함수명들 : 여러 개의 함수를 Import할 수 있으며 콤마(,)로 구분한다.


    

* 모듈 도움말 작성

  - 설명 : help 메소드를 이용해 모듈 정보를 확인할 수 있는데 이때 문서화 주석을 작성해 도움말을 제공할 수 있다.

  - 방법 : ''' 문자를 이용해 주석을 작성하면 파이썬이 알아서 help로 출력할 수 있게 해준다.

  - 샘플 : 

      ### module/temp_dic.py  

      ''' 온도 처리 함수 '''

      def to_cel(t) : 

        ''' 화씨를 섭씨로 변환한다. '''

        return round((t-32.0)*5.0/9.0)

        

      def above_freezing(t) : 

        ''' 온도가 섭씨 기준으로 어는 점보다 높으면 True를, 아니면 False를 반환한다.'''

        return t>0

   

  

* 모듈 Import시 동작 원리 

  - 모듈을 Import시 컴파일러는 해당 모듈을 실행시킨다. 그래서 모듈내 함수가 아닌 일반 코드가 Import시 실행되어 진다. 이 말은 모듈 Import시 초기화 작업을 할 수 있으며, 다른 작업도 할 수 있다. 그리고 한번 메모리에 올라온 모듈은 다시 부르지 않는다.

  

  - 모듈이 실행되는 곳이 주프로그램인지 아니면 sub 프로그램인지 '__name__' 변수를 통해 확인할 수 있다.

    + 주 프로그램 : __name__ = __main__

    + sub프로그램 : __name__ = [모듈명]

  => 위 특징을 이용해 라이브러리를 사용하려는 모듈을 실행 시켰을때 도움말을 보여줄 수도 있다.

  

  

* 모듈 사용시 유의사항

  1. 모듈은 파이썬 라이브러리 폴더, 또는 파이썬 실행 위치에 존재해야 불러올 수 있다. 

  2. 내장 함수를 다음 명령어를 이용해 확인할 수 있다. 

    - 형식 : help(__builtins__)

    

  

**** 파이선 단점

  - 모듈에 상수를 정의 할 수 있는데, 다른 언어처럼 final이나 const와 같은 지정자를 이용해 변경 안되도록 할 수 없다. 즉, 상수를 만들수는 있지만, 값이 사용자에 의해 변경될 수 있다.

  

  

* 객체와 메소드

  - 파이썬에서는 모든 것들이 객체이다. 심지어 0이라는 숫자도 객체이다. 그래서 "string"의 문자열이 있으면 문자열 객체가 가진 함수를 호출 할 수 있다.

  

  

* 테스트

  - Junit처럼 파이썬을 위한 테스트 코드를 작성할 수 있는데, Nose라는 라이브러리를 사용할 수 있다.

Posted by 빌리 :

3장 문자열


* 문자열 표현

  작은따옴표(')나 큰따옴표(")로 감싼 문자를 문자열로 표시


* 문자열 합치기

  - 문자열을 나란히 놓아도 되고, 연결 연산자(+)를 이용해 연결할 수도 있다.

  ex) 'str' "str2" -> strstr2

      'str'+"str2" -> strstr2

      

  - 문자열 연결시 같은 타입끼리 해야 하며 타입이 다를경우 str()메소드를 

  이용해 문자열로 타입을 변경해 줘야 한다.

  

* '*' 연산 : 문자열을 * 한 만큼 반복할 수 있다.

  ex) 'str' * 2 -> strstr

      3 * 'str' -> strstrstr

  - 정수가 0보다 작거타 같으면 빈문자열을 출력

  

* 특수문자 표현 

  - 역슬래시와 특수 문자를 연결해 특수 문자를 표현한다. 

    \n, \\, \', \", \t 등을 지원한다.

  - 문자열에 오직 작은따옴표 또는 큰따옴표만 있다면, 반대 따옴표로 감싸면

  표현하고 싶은 따옴표를 표현할 수 있다.

  ex) '"test"' -> "test"

      "'test'" -> 'test'


* 한줄의 문자열을 여러 줄로 입력하고 싶을때 작은 따옴표 또는 큰 따옴표 3개 연속으로 감싼다.


* print 함수

  - 문자열 출력 함수이며, 특수 문자를 표시해준다.

  - print함수는 자동으로 각 값 사이에 공백을 자동으로 집어 넣는다.

  ex) x = 111

      print 'sample is', x, 'value' -> sample is 111 value.

      

  - print함수는 자동으로 개행문자(\n)를 추가해 표현한다.

  - print함수는 자동 추가되는 개행문자(\n)를 없애려면 문자열 끝에 ','를 추가한다.

  - %d, %s와 같이 문자열 내 포멧을 지정할 수 있다.

    ex) print "원의 넓이는 %f 제곱센티미터입니다." % area

      -> 원의 넓이는 78.55 제곱센티미터입니다.


* 사용자 입력 : raw_input() 함수

  - 사용자 입력값을 문자열로 반환

  - 매개변수로 문자열을 넘겨주면 입력 관련 메세지를 출력한다.

Posted by 빌리 :