KDT_4기 파이썬 기초 0927(1)
2024.09.27 수업 내용 복습일기 첫번째
오늘은 객체지향 프로그래밍 특성과 클래스에 대해 알아보자
1. 객체지향 프로그래밍
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어를 설계하고 구현하는 데 사용되는 중요한 프로그래밍 패러다임 중 하나입니다. 이 패러다임은 프로그램을 "객체"라고 불리는 독립적인 개체로 나누고, 이러한 객체들 간의 상호작용을 통해 프로그램을 구성하는 개발 방법론입니다.
절차지향 프로그래밍
절차지향프로그래밍은 프로그램을 작성할 때 일련의 절차 또는 단계에 따라 코드를 구성하는 방식입니다. 이러한 단계나 절차들은 주로 함수나 서브루틴으로 나누어져 있으며, 각각의 함수는 특정한 작업을 수행합니다. 주로 '입력 - 처리 - 출력'의 순차적인 절차를 따르며, 코드를 위에서부터 아래로 실행하면서 데이터를 처리하는 방식으로 동작합니다. C 언어와 같은 프로그래밍 언어는 주로 절차지향적인 스타일을 따릅니다.
함수형 프로그래밍
함수형프로그래밍은 함수(function)를 가장 중요하게 생각하는 프로그램을 작성하는 패러다임입니다. 함수는 다른 함수에 전달되거나 반환될 수 있으며, 함수들 간의 조합을 통해 복잡한 작업을 수행합니다. 상태를 변경하지 않고 데이터를 처리하고, 부작용(side effect)을 최소화하려는 노력이 있습니다. 함수형 언어로는 Haskell, Lisp, Clojure 등이 있으며, 몇몇 다른 언어들도 함수형 프로그래밍을 지원합니다. 함수형 프로그래밍은 병렬처리와 상태 관리에 용이하며, 함수들을 조합하여 간결하고 안정적인 코드를 작성하는데 도움이 됩니다.
2. 클래스
클래스는 객체를 만들기 위한 템플릿 또는 설계도입니다. 클래스는 객체의 공통 속성과 동작을 정의하며, 객체를 생성하는데 사용됩니다. 예를 들어, "자동차" 클래스는 모든 자동차 객체가 가져야 하는 속성(변수(색상, 속도)과 메서드(함수(주행, 멈춤)를 정의할 수 있습니다.
클래스에 의해 만들어진 함수를 메서드라고 부름
class 클래스이름:
# 클래스 속성(멤버 변수) 정의
속성1 = 초기값1
속성2 = 초기값2
# 생성자 메서드 (생략 가능)
def __init__(self, 매개변수1, 매개변수2, ...):
# 인스턴스 속성 초기화
self.속성1 = 매개변수1
self.속성2 = 매개변수2
# 메서드(멤버 함수) 정의
def 메서드1(self, 매개변수1, 매개변수2, ...):
# 메서드 동작 정의
pass
def 메서드2(self, 매개변수1, 매개변수2, ...):
# 메서드 동작 정의
pass
- 객체(Object)
: 객체는 현실 세계에서의 실제 개체나 추상적인 개념을 모델링한 것입니다. 예를 들어, 자동차, 사람, 은행 계좌 등이 객체가 될 수 있습니다. 객체는 데이터(속성, 상태)와 메서드(동작, 함수)로 구성됩니다. ( 클래스에서 만들어진 실제 존재하는 데이터 프로그램 내에서 사용된 것)
- 인스턴스(Instance)
: 클래스를 기반으로 실제로 생성된 객체를 인스턴스라고 합니다. 클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 데이터와 메서드를 가집니다.(객체가 어떤 클래스에서 나왔는지에 초점을 맞출 때에 쓰는 용어)
- 속성(Attributes) 또는 멤버 변수(Fields)
: 객체는 데이터를 저장하기 위한 속성을 가집니다. 이러한 속성은 객체의 상태나 특성을 나타내며 변수로 표현됩니다. 예를 들어, 자동차 객체의 속성은 색상, 속도, 모델 등이 될 수 있습니다.(클래스 안에 있는 변수)
- 메서드(Methods) 또는 멤버 함수(Functions)
: 객체는 데이터를 조작하거나 특정 작업을 수행하기 위한 메서드를 포함합니다. 이러한 메서드는 함수와 비슷하게 동작하지만, 객체의 상태에 접근하고 조작할 수 있습니다. 자동차 객체의 메서드로는 주행, 정지, 경적 울리기 등이 있을 수 있습니다.
3. 객체 생성
class Dog:
pass
def func1():
pass
Dog()
Rucy = Dog()
print(Rucy)
print(type(Rucy))
PPomi = Dog()
print(PPomi)#메모리가 다 다른곳에 만들어짐
print(type(PPomi))#클래스 Dog로 만들어진 객체
class Dog:
#클래스 변수
name = ''
age = 0
family = ''
Rucy = Dog()
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
Rucy.name = '루시'
Rucy.age = 14
Rucy.family = '포메'
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
PPomi = Dog()
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)#객체 형태는 똑같지만 각각 저장하는 메모리가 다름을 확인
PPomi.name = '뽀미'
PPomi.age = 7
PPomi.family = '폼피츠'
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
class Dog:
name = ''
age = 0
family = ''
#클래스 내부 함수 첫번째 파라미터는 self (관례적으로) 누가 이걸 호출했는지 알려주기 위해
#클래스 메서드는 공용 메서드로 올라가게됨
def eat(self):
print('사료를 먹는다')
Rucy = Dog()
Rucy.eat()
PPomi = Dog()
PPomi.eat()
4.생성자
파이썬에서 생성자(Constructor)는 클래스의 인스턴스(객체)가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 생성자는 객체의 초기화를 담당하며, 객체가 생성될 때 필요한 속성을 초기화하고 설정하는 역할을 합니다. 파이썬에서 생성자 메서드는 __ init__라고 이름이 정해져 있습니다.
class 클래스이름:
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
self.속성2 다른 곳에서 받아온 메모리주소를 다른 메모리 객체에 전달
class Dog:
def __init__(self):
print(self,'init 호출')
#<__main__.Dog object at 0x7ed5c7a17eb0>가 self로 주소가 찍힌것
Rucy = Dog()
PPomi = Dog()
class Dog:
def __init__(self):
self.name = ''
self.age = 0
self.family = '포메'#루시 뽀미 = 폼피츠
Rucy = Dog()
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
PPomi = Dog()
print(PPomi)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
class Dog:
def __init__(self,name,age,family = '족보없음'):
self.name = name
self.age = age
self.family = family
Rucy = Dog() #TypeError: Dog.__init__() missing 2 required positional arguments: 'name' and 'age'
Rucy = Dog('루시',14,'포메')
print(Rucy)
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
PPomi = Dog('뽀미',5,'폼피츠')
print(PPomi)
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
5. 메서드
메서드(Method)는 객체지향 프로그래밍(OOP)에서 사용되는 함수와 비슷한 개념이지만, 클래스 내부에 정의되어 특정 객체에 연결된 함수입니다. 메서드는 해당 클래스의 모든 객체에서 공유되며, 객체의 동작을 정의하거나 특정 작업을 수행하는 데 사용됩니다.
class Counter:
def __init__(self):
#인스턴스 변수
self.num = 0
def increment(self):
self.num += 1
def current_value(self):
return self.num
def decrement(self):
self.num -= 1
def reset(self):
self.num = 0
KBBank = Counter()
print(KBBank.num)
print(KBBank.current_value())
KBBank.increment()
KBBank.increment()
KBBank.increment()
print(KBBank.current_value())
KBBank.decrement()
KBBank.reset()
print(KBBank.current_value())
HanaBank = Counter()
print(HanaBank.current_value())
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
HanaBank.increment()
print(HanaBank.current_value())
print(KBBank.current_value())
문제
- math라는 클래스를 생성하여 클래스에 사칙연산을 할 수 있는 메서드를 만들고 이를 사용하는 예제 프로그램을 작성해 보자
- 단 사칙 연산 메서드는 각각 별도로 생성(plus,minus,mul,div)
class Math:
def plus(self,a,b):
return a + b
def minus(minus,a,b):
return a - b
def mul(mul,a,b):
return a * b
def div(div,a,b):
return a / b
math = Math()
result = math.plus(10,3)
print(result)
result = math.minus(10,3)
print(result)
result = math.mul(10,3)
print(result)
result = math.div(10,3)
print(result)
6. 클래스 변수와 인스턴스 변수
class Dog:
family = '포메'#클래스 변수
def __init__(self,name,age):
#인스턴스 변수
self.name = name
self.age = age
def print_info(self):
print(f'종:{Dog.family}') #클래스 변수
print(f'이름:{self.name}') #인스턴스 변수
print(f'나이:{self.age}') #인스턴스 변수
Rucy = Dog('루시',14)
PPomi = Dog('뽀미',7)
Rucy.print_info()
PPomi.print_info()
PPomi.family = '폼피츠'
PPomi.print_info()
print(PPomi.family)
print(Rucy.family)
7. 메서드 타입
인스턴스 메서드(Instance Method): 객체의 상태를 조작하거나 객체에 특정 작업을 수행하는 메서드입니다. 대부분의 클래스 내의 메서드는 인스턴스 메서드입니다. __ init__ 메서드도 인스턴스 메서드입니다.
클래스 메서드(Class Method): 클래스 레벨에서 동작하며, 모든 인스턴스가 공유하는 메서드입니다. 클래스 메서드는 @classmethod 데코레이터를 사용하여 정의하며, 첫 번째 매개변수로 cls를 사용합니다.
정적 메서드(Static Method): 특정 클래스나 인스턴스와 관련이 없는 메서드로, 클래스 내부에 정의되어 있지만 클래스나 인스턴스와 독립적으로 호출될 수 있습니다. 정적 메서드는 @staticmethod 데코레이터를 사용하여 정의합니다.
# 인스턴스 메서드 예제
class Math:
def add(self,a,b):
return a + b
def sub(minus,a,b):
return a - b
def mul(mul,a,b):
return a * b
def div(div,a,b):
return a / b
# 클래스 메서드 예제
#cls 클래스 Math를 즉 클래스 자체 이름으로 접근 가능
class Math:
title = '클래스 메서드'
@classmethod
def add(cls,a,b):
return a + b
@classmethod
def sub(cls,a,b):
return a - b
@classmethod
def methodTest(cls,name):
return cls.title + name
print(Math.add(10,3))
print(Math.sub(10,3))
print(Math.methodTest('김사과'))
#정적 메서드 예제
class Math:
def __init__(self,a,b):
self.a = a
self.b = b
def add(self):
return self.a + self.b
@staticmethod
def sub(a,b):
return a - b
math = Math( 10, 3)
print(math.add())
print(math.sub(10,3)) # 접근은 가능하지만 사용하지 않음
print(Math.sub(10,3))
random 모듈
무작위로 값을 호출할 때에 쓰인다
import random
random.random() # 0 <= x < 1 실수
int(random.random() * 10)
random.random() * 45 # 0~ 44.99999
int((random.random() * 45) + 1)
과제1
- 가위,바위,보 게임
- 가위, 바위, 보 중 하나를 입력하세요 : 가위바위보 입력하세요
- 출력
- 컴퓨터 : 바위
- 유저 : 가위
- 컴퓨터 승
- 단, 사용자가 이길 때 까지 게임을 반복
#과제1 가위, 바위, 보 게임
class RCP:
def start(self):
print('가위, 바위, 보 게임을 시작합니다.')
class RCP:
def start(self):
print('가위, 바위, 보 게임을 시작합니다.')
user_win = True
while user_win :
user = input('가위,바위,보 중 하나를 입력하세요. : ')
print(f'user : {user}')
computer = random.choice(['가위','바위','보'])
print(f'computer : {computer}')
if user in ['가위','바위','보']:
if computer == '가위' and user == '보':
print('컴퓨터가 이겼습니다 게임을 재시작 합니다')
continue
elif computer == '보' and user == '바위':
print('컴퓨터가 이겼습니다 게임을 재시작 합니다')
continue
elif computer == '바위' and user == '가위':
print('컴퓨터가 이겼습니다 게임을 재시작 합니다')
continue
elif computer == '보' and user == '보':
print('비겼습니다 게임을 재시작 합니다')
continue
elif computer == '바위' and user == '바위':
print('비겼습니다 게임을 재시작 합니다')
continue
elif computer == '가위' and user == '가위':
print('비겼습니다 게임을 재시작 합니다')
continue
else:
print('유저가 이겼습니다')
user_win = True
break
else:
print('잘못된 입력입니다')
continue
game = RCP()
game.start()
과제2
로또 예측 프로그램을 작성해보자
- 1부터 45까지 임의의 수 6개 출력
- 적은 수가 앞으로 오도록 오름차순 출력
- 단, 중복된 숫자가 없어야함
#과제2 로또 예측 프로그램
class Life_is_gamble:
def Gamble_start(self):
print('로또 번호 예측 프로그램 시작')
print('작두 타는중....')
numlist= set([])
num = 0
while len(numlist) < 6:
num = int((random.random() * 45) + 1)
numlist.add(num)
#print(numlist)
numlist1 = sorted(numlist)
print(numlist1)
gamble = Life_is_gamble()
gamble.Gamble_start()
'인공지능 > 파이썬 기초' 카테고리의 다른 글
파이썬의 상속 (0) | 2024.10.01 |
---|---|
클로저와 데코레이터 (0) | 2024.10.01 |
콜백함수와 람다함수 (0) | 2024.09.30 |
변수의 범위 (2) | 2024.09.30 |
사용자 정의 함수 (feat.None) (0) | 2024.09.30 |