본문 바로가기
Major/Computer Science

[파이썬 자료구조] 04. 파이썬 기초 문법

by LeeDaSom 2025. 4. 19.

1. 정적타이핑(static typing)과 동적 타이핑(dynamic typing)

 1) 정적타이핑: 변수의 타입이 프로그래밍 시에 결정

ex) 자바, C, C++

 2) 동적타이핑: 변수의 타입이 수행하면서 결정, 이후 다른 타입의 값이 들어오면 타입이 바뀜. 

ex) 파이썬

 

2. print()

1) 괄호 속에 프린트하고자 하는 내용을 콤마로 구분해서 나열하면 됨.

2) print()는 기본적으로 줄을 바꿈. (∵end라는 변수를 숨겨놓고 기본 값을 '\n'로 해두었기 때문.)

>>>age=21
>>>print('I am', age, 'years old.')
I am 21 years old.

>>>print("I like", end=" ")
>>>print("POTATOES")
I like POTATOES

 

3) sep: 원소 사이를 구분하는 변수

>>>print('Got', 'air', 'in', 'my', 'lungs', 'Im', 'so', 'lucky', sep='*')
Got*air*in*my*lungs*Im*so*lucky

 

3. 자료형

1) 타입 캐스팅(type casting): 타입을 지정하는 것

>>>x=4
>>>y=17.5
>>> a=(int)(x+Y)
>>>print('a is', a)
a is 21

 

2) 연산자

사칙연산(+,-,*,/), 나머지(%), 몫(//), 지수(**)

 

3) 문자열

'...'

"..."

''' ... '''

 

4. 반복과 분기

1) for문

sum = 0
for i in range(1, N+1):
	sum += A[i]

 

2) while 문

sum=0; i=3
while i <= N:
	sum += A[i]
    i += i

 

3) range()

>>>for i in range(10, 2, -2):
>>>print(i, end=' ')
10 8 6 4

 

5. 불변 타입과 가변 타입

1) 불변 타입(immutable)

 한 번 값이 할당되면 그 자리에서 절대로 값을 변경하지 않는다. 바뀐 값을 다른 자리에 저장하고 그 자리를 a가 레퍼런스하는 방식

ex) 숫자, 문자열, 튜플, 딕셔너리의 키

2) 가변 타입(mutalbe)

 레퍼런스하는 자리는 변함이 없고 그 자리에서 값 자체를 바꾸는 방식

ex) 리스트, 딕셔너리의 값

 

6. 리스트[], 튜플(), 딕셔너리, 집합{}

리스트

>>> a=[1, 3, 5, 7]
>>>print(a)
1 3 5 7
>>>for x in a
>>>print(x, end = '*')
1* 3* 5* 7*

튜플

>>>t=(1, 3, 5, 7)
>>>print(t)
1 3 5 7
>>>for x in t
>>>pirnt(x, end='*')
1* 3* 5* 7*

딕셔너리

>>>d={1:10, 3:20, 5:30, 10:40}
>>>d[3] = 222
>>>d[50] = 55
>>>for i in d:
>>> print(i, ':', d[i], end=',')
1 : 10, 3 : 222, 5 : 30, 10: 40, 50: 55,

집합

>>> a= {1, 3, 5, 7}
>>> a.add(3)
>>> a.add(10)
>>> print(a)
{1, 3, 5, 7, 10}

 

7. 복사호출, 참조호출, 할당호출

1) 인자(argument): 함수를 호출할 때 넘기는 것

2) 파라미터(parameter): 호출받은 함수에서 넘어온 인자를 받는 변수

3) 복사호출(Call-by-Value): 변수의 값을 넘긴다. (∴함수를 호출할 때 인자로 보낸 변수는 그 값을 복사해서 사용하므로 원래 호출했던 곳에서는 내용이 변하지 않는다.)

ex) 자바, C...

4) 참조호출(Call-by-Reference): 변수의 레퍼런스(식별자, 포인터 또는 주소)를 넘긴다. 

5) 함수의 파라미터가 불변 타입이면 값을 보갓하고, 가변 타입이면 레퍼런스를 복사하는 등 파이썬의 함수 호출 방식은 두 방법을 혼용하고 있다. 

 

8. 클래스

1) 객체를 만드는 주형 또는 틀

2) 생성자(Constructor)와 메서드(Method)로 구성됨

3) 메서드: 클래스 안에서 정의된 함수

4) 생성자: 해당 클래스의 객체가 하나 만들어질 때 자동으로 수행되어 객체를 초기화하는 역할, 메서드들 중 어느 위치에 있어도 상관없지만 '초기화' 역할을 하므로 관행적으로 맨 앞에 두는 메서드임. 

5) 클래스의 객체 전체에서 사용되는 변수는 주로 __init__()에서 정의, 해당 클래스란 뜻을 가진 self를 앞세움. 

6) self가 붙은 변수는 해당 객체 전체에서 사용될 수 있다. 

class Sample:
	counter2 = 0
    def __init__(self):
    	self.counter = 0
    def numEven(self, n):
    	for k in range(n):
        	if k % 2 == 0:
            	self.counter += 1
                Sample.counter2 += 1
s1 = Sample()
s2 = Sample()
s1.numEven(15)
s2.numEven(15)
print(s1.counter, s2.counter2) 
#수행 결과: 8 16

 

=> counter2는 모든 객체를 통틀어 하나만 존재하고 self.counter는 각 객체마다 하나씩 존재하기 때문!

즉, self.counter는 각 객체의 지역 변수고, self가 명시되지 않은 counter2는 모든 객체를 통틀어 하나밖에 없는 전역 변수

 

7) 메서드 정의 사이에 속하지 않는 파이썬 문장이 나와도 수행

8) 선언할 때 메서드를 바깥에 공개할 필요가 없으면 접근 지정자를 비공개로 처리하는 것이 좋음. '__'를 붙인다!

 

9. 순회 가능 클래스

1) 순회 가능(Iterable) 객체: 대상 객체의 원소를 하나하나 순차적으로 훑는 것

2) 모든 순회 가능 클래스는 내부에 순회자를 갖고 있다. 

3) 순회자는 두 메서드 __iter__()와 __next__로 구성된다. 

4) 순회자의 구조

class M:
	def __init__(self):
    ...
    
    def append(self, i, newItem):
    ...
    
    def ___iter__(self): #순회자 객체 생성
    	return Miterator(self)
class Miterator: #순회자
	def __init__(self, alist):
		self.iterPosition = alist.getNode(0)
    def __next__(self):
    	if self.iterPosition == None:
        	raise StopIteration

클래스 M의 객체를 순회 가능한 객체로 만들기 위해 클래스 Miteraotr를 따로 정의

순회자를 가동시키기 위해 클래스 M 내부에서 메서드 __iter__()를 수행

그 결과로 클래스 Miterator 객체가 하나 만들어짐.

객체에서 원소가 필요할 때마다 순환자의 메서드 __next__()를 호출

 

10. 프로그램 수행

class Heap:
	def __init__(...):
    ...
    def isEmpty(...):
    ...
    def inser(...):
    ...

 

1) 클래스도 .py 파일에 작성

2) 클래스 Heap과 클래스 Heap에서 정의된 메서드들이 해석된다.

3) 메서드에 속하지 않는 문장은 수행된다. 

class Test:
	def __init__(...):
    ...
    def isEmpty(...):
    ...
    ①print('클래스 내부 테스트')
    def insert(...):
    	②print('메서드 내부 테스트')
 ③print('클래스 외부 테스트')

① 클래스 test의 어떤 메서드에 속하지 않고 클래스 Test에만 속하므로 Test를 해석하는 과정에서 수행

② 메서드 내부에서 사용되므로 해석하는 과정에서 수행X

③ 들여쓰기가 없으므로 Test에 속하지 않고 클래스 Test와 동등한 레벨, 수행

 

만약 ①의 위치에서 변수가 선언된다면??

=>객체마다 해당 변수가 만들어지지 않고 모든 Test 객체를 통틀어 하나만 생성됨!!

반면, 클래스 Test의 메서드 안에서 선언된 변수는 객체가 생성될 때마다 해당 객체에 연동되어 생성

 

📒exercise

class Heap:
	def __init__():
    ...
class Test:
	def __init__(...):
		self.counter = 
        ...
    counter=0
    def  count(self):
    	self.counter += 1
        Heap.counter += 1
        print("(self.counter, Heap.counter) = (", self.counter, ",", Heap.counter,")")
    def isEmpty(...):
    ...
h1 = Test()
h2 = Test()
h1.count()
h2.count()
h2.count()

<실행결과>

(self.counter, Heap.counter) = (1, 1)

(self.counter, Heap.counter) = (1, 2)

(self.counter, Heap.counter) = (2, 3)

 

③의 위치에서 문제를 발생시키지 않고 Test.py를 수행시킬 떄만 수행되도록 하려면 main()을 사용!!

4) 파이썬에는 __name__이라는 내장 변수가 있다. 파일이 직접 수행되면, '__main__'이라는 문자열을 갖게 되고, 다른 파일에서 이 파일을 사용하는 경우 사용자 파일 이름을 갖게 된다. 

5) if __name__=="__main__":

이 파일에서 프로그램의 수행이 시작 되었으면

 

11. 패키지와 모듈

1) 모듈(Module): .py로 끝나는 파일 각각

2) 패키지(Package): 모듈(들)과 서브패키지(들)로 구성된 폴더

3) 한 모듈에서 다른 모듈에 접근하고자 할 때는 import를 통해 가져와야 한다.