본문 바로가기
PM으로 성장하기/개발 공부

[컴과] Python(파이썬): 개요, 구성요소, 객체와 클래스

by 고양이 고씨 2022. 11. 22.

Python 언어 소개

 

 

파이썬은 1991년 출시된 인터프리터형 프로그래밍 언어이다. 객체 지향 프로그래밍, 명령형 프로그래밍, 함수형 프로그래밍, 절차적 프로그래밍 패러다임을 지원하는 언어로, 최근 입문용 프로그래밍 언어로 인기가 매우 높다. 하지만 깊이 팔 수록 어려운 언어이며, 동적 언어에 익숙해져야한다거나 C와 관련된 프로그래밍 언어들과의 이질적인 문법으로 인해 입문용으로는 오히려 안좋을 수도 있다는 평이 있다.

Python의 문법은 간단하고 직관적인 느낌이 든다. 다만 독특한 점은 다른 언어의 경우 { }를 통해 블록을 만들지만, 파이썬은 들여쓰기를 통해 블록을 구성한다. 

 

그밖에 나무위키에서의 장점과 단점을 나열해보자면, C++나 Java로 만들려면 막막했던 코드들을 파이썬으로는 빠르게 만들 수 있다. 또한 웹사이트 서버 구현, 기계학습 알고리즘, 얼굴인식, GUI프로그래밍, 게임 등 여러 분야를 커버한다. 하지만 속도가 느리고, 표준화된 환경이 없어서 다른 사람에게 프로그램을 전달하기 위해서는 세팅한 환경을 통째로 전달해야한다는 단점이 있다고 한다.


구성 요소

1. 변수

컴퓨터 메모리에 저장된 값을 참조하는 이름이다.

 

2. 식별자

프로그램 내부에 있는 변수, 함수, 클래스 등의 이름이다.

 

3. 할당문

오른쪽 값을 왼쪽에 저장하는 = 를 사용하여 할당한다. 파이썬에서는 동시 할당문 기능을 제공하는데, 복수 개의 변수 값을 할당하는 데 사용한다. 아래 예시 처럼, 각각의 변수에 각각의 값을 할당할 수 있다. 덕분에 값을 교환해야하는 경우, 다른 언어보다 편리하다.

참고로 파이썬에서는 a = int 3 이라고 할 경우, 정수 3의 객체를 만들어서 a 라는 변수가 객체 아이디를 물고 있는 형태가 된다.

var1, var2 = exp1, exp2

 

4. 함수

파이썬에는 함수들이 여러가지 지원된다. 

함수 설명
print() 입력한 값을 출력한다
eval() 문자타입을 숫자로 바꿔준다
format() 특정 글자수 폭 안에서 왼쪽/오른쪽으로 정렬해준다
input() 사용자로부터 값을 입력받는다
range() 특정 구간의 값을 사용자가 설정한 단위만큼 증가시켜 시퀀스를 만든다

특정 모듈을 사용하고 싶은 경우 import 후 사용하면 된다. 아래 예시는 제곱근 함수 sqrt를 사용하기 위해 math를 import하였다. sqrt 앞에 math. 를 붙여 사용한다. (이 모듈은 이후 설명할 클래스이다)

import math
x = eval(input("숫자를 입력하세요."))
a = math.sqrt(x)
print(a)

또한 함수는 사용자가 정의하여 사용할 수 있다. 정의하는 양식은 아래와 같다. 만약 기본값을 정해주고 싶다면, 매개변수에서 a = b 형태로 값을 정해주면 된다. (기본인자라고 부른다)

def 함수명(매개변수):
	함수내용

정의한 함수를 사용할 때에는 아래 양식에 맞게 사용하면 된다. 기본인자로 제공되는 것과 사용자 지정 인자를 사용하고 싶다면, 키워드 인자를 이용하여 a= b 형태로 값을 정해준다.

함수명(실매개변수)

함수 내에서 정의되는 변수들은 사용할 수 있는 범위(scope)가 상이할 수 있다. 함수 외부에서 사용된 경우 전역변수로서, 모든 함수에서 접근 가능하다. 함수 내부에 정의되는 변수는 지역변수로, 내부에서만 사용 가능하며 전역변수와는 아예 다른 변수로 인식된다. 만약 함수 내부에서 정의한 변수를 전역변수로 사용하고 싶다면, global 키워드를 붙인다.

def plusX():
	global x
	x = x + 1
	print(x)

print(x)
plusX()

 

5. 연산자

사칙연산, 논리연산 등 다른 언어와 동일하게 연산자 기능이 제공된다. + 기호를 통해 문자열을 이어주는 연결연산자 기능도 있다.

 

6. 제어구조

제어구조는 크게 세 가지가 있다.

- 순차구조: 명령문을 순서대로 실행하는 구조

- 선택구조: 특정 영역에서 조건에 따라 실행여부를 결정하는 구조

- 루프구조: 특정 영역의 조건에 따라 반복하는 구조

 

1) 선택구조

- 단일 if 문

if 조건:
	명령문

- 이중 if 문

if 조건:
	True에 대한 명령문
else:
	False에 대한 명령문

- 다중 if 문: 조건이 여러 개 일 때 사용한다

if 조건1:
	조건1의 True에 대한 명령문
elif 조건2:
	조건2의 True에 대한 명령문
 ...
elif 조건n:
	조건n의 True에 대한 명령문
else:
	False에 대한 명령문

- 중첩 if 문: if 문 안에 if 문이 있는 경우이다

if 조건1: 
	if 조건2: 
		조건2의 True에 대한 명령문
	else:
		조건2의 False에 대한 명령문
else
	if 조건3: 
		조건3의 True에 대한 명령문
	else:
		조건3의 False에 대한 명령문

 

2) 루프구조

- while: 조건 제어 반복으로 특정 조건이 만족될 때까지 반복한다(무한루프 가능)

while 조건: 
	명령문

- 루프 구조 제어: 사용자에게 입력을 받아 루프의 지속 여부를 제어할 수 있다.

continueLoop = 'Y'
while continueLoop == 'Y': #Y를 입력할 때 까지 반복
 ....
 continueLoop = input("계속하시겠습니까(Y/N)?")
data = eval(input("정수를 입력하세요(0을 입력할 경우 종료됩니다)"))

sum = 0
while data != 0:
	sum += data
	data = eval(input("정수를 입력하세요(0을 입력할 경우 종료됩니다)"))

print("합계는", sum, "입니다.")

- for: 계수 제어 반복으로 주로 반복 횟수가 정해진 경우에 사용한다

for 조건 in 시퀀스:
	명령문

 

- 중첩 루프: 루프 안에 루프를 구성할 경우

for 조건1 in 시퀀스1:
	for 조건2 in 시퀀스2:
		명령문

- break 키워드: 반복을 중단하고 루프를 빠져나온다. 아래 예시에서 10이 되는 순간 루프를 빠져나온다.

number = 0

while 1:
    print(number)
    if number == 10:
        break
    number += 1

- continue 키워드: 아래 명령을 수행하지 않고 다시 루프로 돌아가서 수행한다. 아래 예시에서 짝수는 print를 하지 못한다.

for number in range(1,10):
    if number % 2 == 0:
      continue
    print(number, "은 홀수이다")

객체와 클래스

1. 객체와 클래스 만들기

객체 지향 프로그래밍이란 객체와 객체의 상호작용으로 프로그램을 구성하는 기법을 말한다. 객체라는 것은 실세계의 사물을 추상화하여, 상태(데이터필드)와 행동(연산, 메소드)을 표현한 것이다. 클래스는 이러한 객체를 만들기 위한 도면이다. 클래스는 아래와 같은 형태로 만든다.

class 클래스명:

클래스에서는 초기자(initializer)을 만들어야 하는데, 초기자란 객체가 생성될 때 처음으로 갖고 있는 값을 말한다. 파이썬에서는 __init__ 으로 표현해주고 있다. 이때 자주 사용되는 매개변수가 self 이다. self는 객체 자신을 참조하는 매개변수이다. 활용하기 위한 변수라기 보다, 클래스를 정의할 때 사용되는 용도로 활용된다. self를 통해 데이터필드의 전역변수와 지역변수를 구분할 수 있다.

class Circle:
	def __init__(self, radius = 1):
		self.radius = radius

 

클래스가 정의되었다면, 클래스를 사용하여 객체를 만든다. 그 전에 정의된 클래스를 import 하기 위한 명령문을 작성한다. 이후 생성자 "클래스이름(인자)"를 통해 객체를 생성하고, 동시에 객체를 초기화하기 위해 __init_ 메소드를 호출한다. 또한 객체참조변수를 사용하는데, 객체참조변수란 객체마다 부여되는 고유한 id를 저장하는 변수이다. 따라서 객체참조변수를 알아야 객체에 접근할 수 있다.

from 클래스정의파일 import 클래스명
객체참조변수 = 클래스이름(인자)

생성된 객체를 사용하기 위해서는 객체 멤버 접근 연산자(.)을 사용하여, 객체참조변수와 함께 작성해준다.

객체참조변수 = 클래스이름(인자)

객체참조변수.데이터필드
객체참조변수.메소드(인자)

 

2. 데이터 은닉

객체 지향 프로그래밍의 장점은 데이터 은닉이 가능하다는 것이다. 데이터 은닉이란, 클라이언트가 데이터 필드에 직접적으로 접근하는 것을 차단하는 것이다. 보통 private 데이터로 필드를 정의하면 되는데, 파이썬에서는 데이터필드 앞에 __를 붙여서 표기한다. private로 설정하면, 클래스 내부에서만 접근이 가능하다.

class CirclePrivate:
	def __init__(self, radius = 1):
		self.__radius = radius
	def getPerimeter(self):
		retrun 2*self.__radius * math.pi

다만, 이렇게 되면 클라이언트가 데이터필드를 읽거나 수정할 수 있는 방법이 없기 때문에 getter과 setter 메소드를 추가로 정의해야 한다. 그리고 클라이언트가 잘못된 변경을 하지 않도록, 조건을 달아준다.

....
	def getRadius(self):   # getter(접근자): 반지름값을 반환
		return self.__raidus
	def setRadius(self, radius): #setter(변경자): 반지름값을 설정
		if radius >= 0:  # 조건을 갖추어 안좋은 값이 들어가지 않도록 설정함
			self.__raidus = radius

 

3. 클래스 상속

상속이란 일반 클래스들 사이의 공통적인 부분을 '수퍼 클래스'로 따로 재정의하여, 하위 클래스인 '서브 클래스'가 이를 이어받아 사용하고 특색있는 부분을 덧붙이는 것을 말한다. 코드의 재활용이 가능하다. 서브 클래스에서 수퍼 클래스를 상속받으려면 아래와 같이 import 해주고, 서브클래스 인자로 수퍼클래스를 넣어주어야 한다. 또한 수퍼클래스에서 정의된 내용을 사용한다면 super(). 를 붙여주면 된다.

from 수퍼클래스가정의된파일 import 수퍼클래스

class 서브클래스(수퍼클래스):
	def __init__(self, ...)
    	super().__iniit__()  # 수퍼클래스의 초기자 선언

상속 관계에 있는 경우, 서브 클래스는 수퍼 클래스의 메소드를 그대로 이어 받아야하는데 이것이 목적과 맞지 않을 수 있다. 따라서 서브 클래스는 같은 메소드명을 사용하지만, 재정의함으로써 독자적인 메소드를 구현할 수 있는데 이를 오버라이딩이라고 한다.

아래 오버라이딩 예시에서 참고로 __str__은 Class의 내장 모듈 중 하나이다. 앞서 본 __init__은 초기화 메서드였다면, __str__은 서로 다른 타입의 데이터끼리 상호작용할 때 문자열로 변환시켜주는 메소드이다.

# 수퍼클래스
...
	def __str__(self):
		 return "색상:" + self.__color + " 채우기:" + str(self.__filled)
...
#서브클래스
...
	def __str__(self):
		 return super().__str__() + " 반지름:" + str(self.__radius)
...

또한 실제로 활용하면서 메소드명이 같을 때에는, 인자로 받는 값의 객체가 무엇인지 판별하는 동적 바인딩이 이루어지면서 각 객체에 정의된 메소드로 연결해준다.

from CircleFile import Circle
from RectangleFile import Rectangle

def display(x):
 print(x.__str__())  # 동적바인딩(x에 맞는 클래스에 따라 바인딩)

def main():
 c = Circle(4)
 r = Rectangle(1, 3)
 displayObject(c)
 displayObject(r)
 
main()

만약 위 문제를 조금더 명확하게 하고 싶다면 isinstance() 함수를 활용하면 된다. isinstance() 함수는 객체가 주어진 클래스의 인스턴스인지를 반환해주는데 값은 True 혹은 False로 나온다.

 


후기

데브경수님의 인스타툰 @waterglasstoon

컴퓨터과학을 전공하기 전에 인터넷 강의로 파이썬을 배워본 적이 있다. print로 hello world를 할 때만 해도 재밌었지만, 갑자기 계산기를 만드는 실습을 하면서 포기했다. 생각해보면 그 때는 객체지향의 개념을 잘 모르고 있었던 터라 더 어려웠던 것 같다. 아무래도 파이썬은 객체지향에 대한 개념을 알지 못하면, 접근하기가 쉽지 않은 것 같다. (물론 다른 언어도...) 이번에 파이썬으로 GUI 프로그래밍도 같이 진행했다. html과 css로만 구현 가능하다고 생각했는데, GUI가 구현되는 것이 꽤나 신기했다. 파이썬은 웹서버, 게임, 머신러닝, 사무자동화 등 다양한 분야에도 쓰인다고 하는데 정말 무궁무진한 언어인 것 같다. 향후 내가 어떤 식으로 배운 것을 활용할지는 모르겠지만, 기초적인 것이라도 배워두길 잘 했다는 생각이 든다.

 

도움 받은 글

1. 방송통신대학교 프라임칼리지 파이썬 프로그래밍
2. 파이썬, 나무위키, https://namu.wiki/w/Python
3. Why Python is Slow: Looking Under the Hood, http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/
4. [Python] for문 VS While문 / for문 무한loop, https://herjh0405.tistory.com/55
5. 파이썬 continue & break 문 기본 문법 독학 #11, https://stricky.tistory.com/372
6. 파이썬(python)-__str__과__repr__의 차이, https://tibetsandfox.tistory.com/39

 

728x90

댓글