클래스

기본 형태

class 클래스이름[(상속 클래스명)]:
<클래스 변수 1>
<클래스 변수 2>
...
def 클래스함수1(self[, 인수1, 인수2,,,]):
<수행할 문장 1>
<수행할 문장 2>
...
def 클래스함수2(self[, 인수1, 인수2,,,]):
<수행할 문장1>
<수행할 문장2>
...
...

self라는 것이 매우 특이합니다. self.name = name 이런식으로 쓸 수가 있는데 name이 클래스 변수로 선언이 되어있지 않아도 사용할 수 있습니다. self.name을 할 때 만드는 것 같은데 변수들의 scope이 어떻게 되는 것인지는..흠.. 모르겠군요.

클래스의 인스턴스들만 클래스에 있는 메소드를 사용하도록 하려면 저기 있는 self라는 녀석을 사용해야 합니다.

class Keesun:
      
    def setData(self, name, age):
        self.aName = name
        self.aAge = age

    def eat(self, something):
        print “%s, %s를 먹는다.” %(self.aName, something)

>>> me = Keesun()
>>> me.setData(“기선”, 26)
>>> me.aAge
26
>>> me.eat(“과자”)
기선, 과자를 먹는다.

함수

>>> def sum(*args):
…     sum = 0
…     for i in args:
…             sum = sum + i
…     return sum

위와 같은 형태로 sum이라는 함수를 만들었습니다. def 함수명(인수): 이렇게 선언하고 그 아래에 정의를 해주면 되는 듯 합니다. *args 는 가변인수를 뜻합니다. 인자를 초기화 할 수 도 있습니다.

>>> def call(name, age=20):
…     print name
…     print age

age를 20으로 초기화 해놨기 때문에 name만 전해 줘도 됩니다. 물론 age도 주면 그에 맞게 값이 변합니다.

>>> call(“기선”)
기선
20
>>> call(“기선”, 26)
기선
26
>>> name = ‘기선’
>>> call(name)
기선
20
>>> myName = ‘기선’
>>> call(myName)
기선
20
>>> name = “기선”
>>> call(name)
기선
20

return을 만나면 함수에서 나가는 것은 java와 같은데 약간 특이합니다. 여러 개의 값을 return하고 싶을때 return 값1, 값2, 값3 이렇게 적어 주면 터플로 리턴해줍니다.

>>> def call():
…     return 1, 2, 3

>>> a = call()
>>> a
(1, 2, 3)

for문

range()라는 함수와 자주 쓰이는것 같습니다. java에서 for(int i = 0 ; i < 10 ; i++) 이것을 Python에서는 for i in range(10): 이렇게 씁니다. range(5,10) 이렇게도 쓸 수가 있는데 5 이상 10 미만을 뜻합니다. 즉 [5, 6, 7, 8, 9] 이런 배열을 만들어 주는듯 합니다.

>>> a = [‘spring’, ‘hibernate’, ‘python’]
>>> for i in range(len(a)):
…     print a[i]

>>> a = [‘spring’, ‘hibernate’, ‘python’]
>>> for i in a:
…     print “저는 %s를 공부하고 있습니다.” % i

저는 spring를 공부하고 있습니다.
저는 hibernate를 공부하고 있습니다.
저는 python를 공부하고 있습니다.

if문

들여쓰기에 주의해야 합니다. 들여쓰기로 블럭을 인식하기 때문에 들여쓰기가 안맞으면 에러가 나는군요.

특이한건 else if를 줄여서 elif 로 사용합니다.

그리고 &&, ||, ! 대신에 and, or, not 이라는 키워드를 사용합니다.

배열, 터플, 문자열 안에 특정 요소가 들어있는지 확인하기 위해 in과 not in을 사용할 수 있습니다.

continue와 똑같이 동작하는 pass라는 키워드가 있습니다.

>>> a = [1, 2, 3, 4, 5]
>>> if a:
…     print “true”

true
>>> if 1 in a:
…     print “true”

true
>>> if 2 in a and 3 in a:
…     print “ture”

ture

리스트 복사

>>> a = 3
>>> b = 3
>>> a = 1
>>> a
1
>>> b
3

3이라는 객체를 a, b 두 개의 변수가 가리키고 있다가 a가 다른 객체 1을 가리키게 됩니다. 그러나 배열은 이런 방법과는 다르게 동작합니다.

1. 일단 배열은 []를 사용할 때 마다 매번 객체를 생성합니다.

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False

2. 다음과 같은 방법으로 같은 배열을 가리키도록 할 수 있습니다.

>>> b = a
>>> a is b
True

하지만 이 때 만약에 a변수를 통해서 배열의 값을 바꾸게 되면 b도 역시 같은 배열 객체를 참조하기 때문에 값이 바뀐 배열을 참조하게 됩니다.

>>> a[0] = 100
>>> b
[100, 2, 3]

단순히 1번과 같은 효과를 가지면서 배열에 있는 모든 값들을 동일하게 가지는 다른 배열을 만드는 방법은 두 가지가 있습니다.

1. [:] 이것을 사용하는 방법과

>>> c = a[:]
>>> a is c
False
>>> c
[100, 2, 3]

2. copy 모듈을 사용하는 방법이 있습니다.

>>> from copy import copy
>>> d = copy(A)
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
NameError: name ‘A’ is not defined
>>> d = copy(a)
>>> d
[100, 2, 3]
>>> d is a
False

모듈이라는 것이 나왔는데…. 뭔지 모르겠군요. from copy import copy… copy로 부터 copy를 불러 들인것인가.. 흠.. from 패키지 import 클래스 인가.. 아니면 from 클래스 import 메소드 인가..;;