학습일지

20230310 KDT 학습일지

예진또이(애덤스미스 아님) 2023. 3. 10. 17:01
728x90

1. 객체지향 프로그래밍

  • 문제를 여러개의 객체 단위로 나눠 작업하는 방식

1-1. 객체(object)란?

  • 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말함

1-2. 클래스(class)란?

  • 객체를 생성하기 위한 일종의 설계도와 같음
  • 클래스는 프로퍼티(필드), 메소드(함수)로 구성되어 있음
    • 프로퍼티(property): 데이터가 저장되는 곳
    • 메소드(method): 객체의 동작에 해당하는 실행 블록

1-3.클래스와 객체

  • 건축 설계도가 클래스라면, 실체로 지어진 집은 객체
  • 객체는 클래스로 생성되어 구체화된 인스턴스
  • 실제로 클래스가 인스턴스화 되어 메모리에 상주하는 형태를 객체라고 부른다.
  • 파이썬의 모든 변수와 함수는 객체로 저장

2. 클래스 만들기

```
class 클래스명:
    프로퍼티명1 = 값1
    프로퍼티명2 = 값2
    ...

 

    def 메소드명1(self,변수1,변수2,.):
        메소드가 호출되면 실행할 문장
        ...
    def 메소드명2(self,변수1, 변수2...):
        메소드가 호출되면 실행할 문장

 

        ...     
  • 클래스를 통해 호출되는 변수를 프로퍼티(필드)라고 부름
  • 클래스를 통해 호출되는 함수를 메소드라고 부름
  • self 클래스의 각 호출한 객체를 가리킴
  • 클래스의 앞글자는 항상 대문자로 쓴다
class Dog:
    pass # 내용이 없는 블록을 만들 때 사용
 
def func1():
    pass
 
#클래스를 통해 객체를 생성
Rucy = Dog()
print(Rucy)
print(type(Rucy))
-
<__main__.Dog object at 0x7f3fd0265be0>
<class '__main__.Dog'>
 
 
li1 = list([1,2,3,4,5])
print(li1)
print(type(li1))
- [1, 2, 3, 4, 5]
   <class 'list'>
 
PPomi = Dog()
print(PPomi)
print(type(PPomi))
- <__main__.Dog object at 0x7f3fb96f6d90>
   <class '__main__.Dog'>
 
li2 = list([1,2,3,4,5])
print(li2)
print(type(li2))
print(id(li2))

- [1, 2, 3, 4, 5]

   <class 'list'>

   139911670626880

 

class Dog:
    name = '루시'
    age = 13
    family = '포메'

    def eat(self):
      print(self)
      print('사료를 잘먹습니다!')
 
Rucy = Dog()
print(Rucy.name)
print(Rucy.age)
print(Rucy.family)
Rucy.eat()
print(Rucy)
-
루시
13
포메
<__main__.Dog object at 0x7f3fd0265e50>
사료를 잘먹습니다!
<__main__.Dog object at 0x7f3fd0265e50>
PPomi =Dog()
print(PPomi.name)
print(PPomi.age)
print(PPomi.family)
PPomi.eat()
print(PPomi)

- 루시

   13

   포메

   사료를 잘먹습니다!

   <__main__.Dog object at 0x7f3fd02650a0>

3. 생성자(constructor)

  • 클래스를 객체화 시킬 대 가장 먼저 실행되는 메소드
  • _ init _(self)
  • 생성자에서는 해당 클래스가 다루는 데이터를 정의하고 초기화 함
class Dog:
  def _init_(self):
    print(self' init 호출!')
 
Rucy = Dog()
 
class Dog:
  def __init__(self):
      self.name = '이름없음'
      self.age = 0
 
Rucy = Dog()
print(Rucy)
print(Rucy.name)
print(Rucy.age)

-

<__main__.Dog object at 0x7fea0c5aa0d0>
이름없음
0

 

Rucy.name = '루시'
Rucy.age = 13
PPomi.name = '뽀미'
PPomi.age = '뽀미'
print(PPomi)
print(PPomi.name)
print(PPomi.age)
- <__main__.Dog object at 0x7f3fb96abe20>
   뽀미
   뽀미
 
class Dog:
  def __init__(self):
      self.name = '이름없음'
      self.age = 0
      #nickname = '닉네임 없음'# 메소드 안에서만 사용할 수 있는 지역변수
      self.nickname = '닉네임 없음'# 메소드 안에서만 사용할 수 있는 지역변수
     # print(f'{nickname}객체가 생성됨')

 # def go(self):
  #    print(f'{nickname}가 달립니다!')
  def go(self):
      print(f'{self.nickname}가 달립니다!')

 

Rucy = Dog()
Rucy. name = '루시'
Rucy.go()
- 닉네임 없음가 달립니다!
 
class Dog:
  def __init__(self,name,age,nickname=''):
    self.name = name
    self.age = age
    self.nickname = nickname
 
Rucy = Dog() #매개변수를 보내지 않아 에러가 발생!
Rucy = Dog('루시'13)
print(Rucy.name)
print(Rucy.age)
print(Rucy.nickname)
- 루시
   13
 
PPomi = Dog('뽀미',7)
print(PPomi.name)
print(PPomi.age)
print(PPomi.nickname)
- 뽀미
   7

4.메소드 정의하기

  • 해당 클래스의 객체에서만 호출가능한 함수
  • 해당 객체의 속성에 대한 연산을 행함
  • 객체이름. 메소드명() 형태로 호출됨

4-1 메소드 정의하기

class Counter:
    def __init__(self):
        self.num  = 0
    def increment(self):
        self.num+=1
    def decrement(self):
        self.num-= 1
    def current_value(self):
        return self.num
    def reset(self):
        self.num = 0
 
KBbank = Counter()
print(KBbank.num)
- 0
 
KBbank. increment()
print(KBbank.num)
- 1
 
KBbank .decrement()
print(KBbank.num)
- 0
 
print(KBbank.current_value())
- 0
KBbank.increment()
KBbank.increment()
KBbank.increment()
KBbank.increment()
KBbank.increment()
print(f'현재 대기인원 :{KBbank.current_value()}')

- 현재 대기인원 :5

 

HanaBank = Counter()
print(f'현재 대기인원 : {HanaBank.current_value()}')
- 현재 대기인원 : 0
 
HanaBank.reset()
print(f'현재 대기인원: {HanaBank.current_value()}')

- 현재 대기인원 : 0

4-2. 메소드 타입

  • intance method: 객체 형태로 호출되기 때문에 해댕 메소드를 호출한 객체에만 영향을 미침
  • class method:클래스 이름으로 호출하는 메소드(메소드 선언 위에 @staticmethod)
class Math:
  def add(selfxy):
      return x + y
  def multiply(self,x,y):
        return x*y
math = Math()
 
result1 = math.add(10,3)
print(result1)
- 13
 
result2= math.multiply(10,3)
print(result2)
 -30
 
class Math:
  @staticmethod
  def add(x,y):
      return x+y
  @staticmethod 
  def multiply(x,y):
      return x+y
 
result1 = Math.add(10,3)
print(result1)
-13
 
result2 =Math.multiply(10,3)
print(result2)
- 13
 
class Math:
  @staticmethod
  def add(x,y):
      return x+y
  @staticmethod 
  def multiply(x,y):
      return x*y
  def div(self,x,y):
      return x / y
 
math = Math()
result3 = m
-----ath.div(10,3)
print(result3)

1. 상속

  • 기존의 정의해둔 클래스의 기능을 그대로 물려받음
  • 기존 클래스에 기능 일부를 추가하거나, 변경하여 새로운 클래스를 정의함
  • 코드를 재사용할 수 있게 됨
  • 안정적이고 유지보수에 용이함
  • 상속을 받고자 하는 대상인 기존 클래스를 부모, parent, super, base 클래스라고 부름
  • 상속을 받는 새로운 클래스는 자식, child,sub클래스라고 부름
class Animal:
   def __init__(self,name,age):
      self.name = name
      self. age=  age

   def eat (self,food):
      print(f'{self.name}는 {food}를 먹습니다')

   def sleep (self,hour):
      print(f'{self.name}는 {hour}시간 동안 잠을 잡니다. ')

 

animal = Animal ('동물',10)
animal.eat('먹이')
animal.sleep(14)

-

동물는 먹이를 먹습니다
동물는 14시간 동안 잠을 잡니다. 
 
class Dog (Animal): # Animal 클래스를 상속
  pass
 
Rucy = Dog()#Animal 클래스의 생성자를 상속받았기 때문에
 
Rucy = Dog('루시',12)
 
Rucy.eat('사료')
- 루시는 사료를 먹습니다
 
Rucy.sleep(10)

-루시는 10시간 동안 잠을 잡니다.

2.메소드 오버라이딩

  • 부모 클래스의 method를 재정의
  • 자식 클래스의 인스턴스로 호출시 재정의된 메소드가 호출됨
class Animal:
   def __init__(self,name,age):
      self.name = name
      self. age=  age

   def eat (self,food):
      print(f'{self.name}는 {food}를 먹습니다')

   def sleep (self,hour):
      print(f'{self.name}는 {hour}시간 동안 잠을 잡니다. ')

 

class Dog(Animal):
  def run(self):
    print(f'{self.name}는 달립니다. ')

  def eat(self,food):# 메소드 오버라이딩
    print(f'{self.name}는 {food}를 아주 맛있게 먹습니다.')

  def superEat(self,food):
    super().eat(food)
Rucy = Dog('루시',12)
Rucy.eat('사료')
Rucy.run()
- 루시는 사료를 아주 맛있게 먹습니다.
  루시는 달립니다.

 

Rucy.eat('사료')
- 루시는 사료를 아주 맛있게 먹습니다.
 
animal = Animal('동물',10)
animal.eat('먹이'
animal.run()# 자식 클래스의 객체 메소드를 사용할 수 없음
- 동물는 먹이를 먹습니다
 
Rucy.superEat('사료')
- 루시는 사료를 먹습니다

3. 다중 상속

  • c#, java는 다중상속이 불가능
  • 파이썬은 c++과 같이 다중상속이 가능
  • 여러 클래스를 상속(개수에 제한이 없음)
class Animal:
   def __init__(self,name,age):
      self.name = name
      self. age=  age

   def eat (self,food):
      print(f'{self.name}는 {food}를 먹습니다')

   def sleep (self,hour):
      print(f'{self.name}는 {hour}시간 동안 잠을 잡니다. ')
 
class Human:
  def __init__(selfnameage):
    self. name= name
    self.age = age

  def study(self,hour):
    print(f'{self.name}는 {hour}시간 동안 공부를 합니다')
 
 
class KimApple(Animal,Human):
  pass
kim= KimApple('김사과'20)
 
kim.eat('밥')
- 김사과는 밥를 먹습니다
 
kim.study(2)
- 김사과는 2시간 동안 공부를 합니다
 
KimApple .mro()
- [__main__.KimApple, __main__.Animal, __main__.Human, object]

1. 스페셜 메소드(Special Method)

  • __로 시작해서 __로 끝나는 특수함수
  • 해당 메소드들을 재구현하면 객체에 여러가지 파이썬 내장 함수나 연산자에 원하는 기능을 부여할 수 있음
class Point:
  def __init__(selfxy):
      self.x = x
      self.y = y
  def print_point(self): #(3 , 4)
    print(f'({self.x},{self.y})')

  def __str__(self):#str()함수를 오버라이딩
    return(f'({self.x},{self.y})')

  def __add__ (self,pt): # + 연산자를 오버라이딩(객체 + 객체)
    new_x = self.x + pt.x
    new_y = self.y + pt.y
    return Point(new_x, new_y)
  
  def __sub__(selfpt): #- 연산자를 오버라이딩 (객체 -객체)
    
    new_x = self.x - pt.x
    new_y = self.y - pt.y
    return Point(new_x, new_y)

  def __len__(self): #len()
    return self.x + self.y

  def __getitem__(self,index): #인덱싱을 오버라이딩(객체[인덱스])
    if index == 0:
      return self.x
    elif index == 1:
      return self.y
    else:   
       return -1
 
p1= Point( 3 , 4 )
 
p1.print_point()

- (3,4)

 

print((p1)) #str() 생략
- (3,4)
 
print(str(p1))
- (3,4)
num1= 10
num2= 20
print(num1 + num2)
- 30
print(str(p1))

- (3,4)

 

p2 = Point(5,8)
 
print(p1,p2)
- (3,4) (5,8)
 
p3= p1-p2 
print(p3)
- (-2,-4)
 
print(len(p1))

- 7

 

print(p1[0],p1[1],p1[100])

- 3 4 -1

 

 

1. 모듈

  • 클래스 또는 함수를 모아 놓은 파일
  • 모든 파이썬 파일(.py)은 모듈
#모든 모듈의 전체 함수 가져오기
improt 모듈명

#사용
모듈명.함수명()
import util
 
util.total(1,100)
-5050
 
util.calc(10,3)-
(13, 7, 30, 3.3333333333333335)
# 특정 함수만 골라서 가져오기
from 모듈명 import 함수1, 함수2...

 

# 사용
함수명()
 
from util import calc
 
_, _, _, result = calc(10,3)
print(result)
- 3.3333333333333335
 
# 모든 모듈의 함수 가져오기
from 모듈명 import *

# 사용
함수명()
 
from util import *
 
total(1,100)
-5050
 
calc(10,3)
- (13, 7, 30, 3.3333333333333335)
 
#모듈에 별명 붙여 불러오기
import 모듈명 as 별명

# 사용
별명.함수명()
 
import util as ut
 
ut.total(1,100)
- 5050
 
ut.calc(10,3)
- (13, 7, 30, 3.3333333333333335)
 

2. 구글드라이브 활용

util = '/content/drive/MyDrive/Colab Notebooks'
import sys
sys.path.append(util)

3.클래스를 포함한 모듈

import util2 as ut2
- 3.141592
 
math = ut2.Math()
 
math.circle(5)
-78.5398
 
math.add(10,4)
-14
 

4. 패키지

  • 모듈의 상위개념
  • 모듈이 모여있는 디렉토리

4-1, 패키지 관리자

  • 외부 모듈을 설치 또는 삭제하기 위한 프로그램
  • pip 명령을 사용(파이썬을 설치하면 pip가 함께 설치됨)
  • 윈도우 명령 프롬프트 또는 터미널에서 사용
  • pip --version 으로 버전을 확인할 수 있음

머리가 엄청 아팠다 하지만 도움을 받아서 해냈지만 그래도 포기 안하고 열심히 했다는것에 행복함을 느꼈다.
주말에 더 열심히 해야겠다.
728x90
반응형