본문 바로가기
네이버 코칭스터디 9기

Python Object Oriented Programming - 네이버 코칭스터디 9기 2주차

by orangecode 2023. 1. 29.
728x90

 

객체 지향 프로그래밍 언어, Object Oriented Programming(OOP)

Object-Oriented Programming

- 객체 : 실생활에서 일종의 물건, 속성(Attribute)와 행동(Action)을 가짐

- OOP는 객체 개념을 프로그램으로 표현하고, 속성은 변수(Variable), 행동은 함수(method)로 표현됨

- 파이썬 : 객체 지향 프로그래밍 언어

 

 

객체 지향 프로그래밍 언어를 쉽게 설명하기 위해 인공지능 축그 프로그램을 작성한다고 가정하면 

 

- 객체 종류 : 팀, 선수, 심판, 공

- Attribute : 선수(선수이름, 포지션, 소속팀, 나이), 팀(팀 이름, 팀 연고지, 팀구장, 팀 선수, 팀 감독)

- Action : 선수(공을 차다, 슛을 하다, 공을 잡다), 심판(휘슬을 불다, 프리킥을 지시하다), 감독(지시하다)

 

 각자 기능을 중심으로 프로그램을 작성하여 연결하는 방식을 객체지향 프로그래밍 언어라고 말할 수 있습니다.

 

 

OOP : 클래스 & 인스턴스

- 클래스 (CLASS : 설계도=붕어빵틀)

- 인스턴스(instance : 실제 구현체=팥붕/슈붕/고구마붕 등)

 

# class 선언
class SocerPlayer(object):

    # Attribute 추가는 __init__, self와 함께 사용한다
    # __init__ : 객체 초기화 예약함수
    # self : 객체 초기화 정보 설정
    def __init__ (self, name : str, position : str, back_number : int):
        self.name = name
        self.position = position
        self.back_number = back_number

 

class 내부에서 함수(method)를 사용하기 위해서는 반드시 self를 추가해야 class 함수로 인정된다.

self : 생성된 인스턴스 자신을 말함. 

 

"__" : 맹글링

맹글링은 틀수한 예약함수나 변수, 함수명 변경으로 사용할 수 있다.

예시) __main__, __add__, __str__, __eq__

 

 

 

class SoccerPlayer(object):
    def __init__ (self, name : str, position : str, back_number : int):
        self.name = name
        self.position = position
        self.back_number = back_number
    
    def __str__(self):
        return "Hello, My name is %s. I play in %s in center " % \
                (self.name, self.position)
    
    def __add__(self, other):
        return self.name + other
    
    def change_back_number(self, new_number):
        print('선수의 등번호를 변경합니다 : From %d to %d' % \
              (self.back_number, new_number))
        self.back_number = new_number

실제로 soccerplay로 name = park, position = mf, number = 13을 주었을 때

Hello, My name is pack. I play in my in center라는 값을 반환해준다.

class 내부에서  추가했던 함수인 change_back_number라는 등번호 변경 함수를 cho.change_back_number()로 실행하면 선수 등번호가 13에서 7로 변경된다. 

 

 

* 깨알 상식 - 변수 & class 명 짓는 방법 (snake_case & CamelCase)

- snake_case : 띄어쓰기 부분에 언더바 "_"를 추가, 파이썬 함수, 변수명에 사용

 

- CamelCase : 띄어쓰기 부분에 대문자를 사용 "camel case"라면 "CamelCase"로 이용

 

 

note class python 구현해보기

- Note를 정리하는 프로그램

- 사용자는 note에 뭔가를 적을 수 있다.

- note에는 content(str)이 있고, 내용을 삭제(remove)할 수 있다

- 2개의 노트북을 합쳐 하나로 만들 수 있다.

- Note는 Notebook에 삽입이 된다.

- Notebook은 Note가 삽입 될 때, 페이지(attribute)를 생성하며, 최고 300페이지까지 저장이 가능하다.

 

class NoteBook(object):
    def __init__(self, title):
        self.title = title
        self.page_number = 1
        self.notes = {}
    def add_note(self, note, page = 0):
        if self.page_number < 300:
        
            if page == 0:
                self.notes[self.page_number] = note
                self.page_number += 1
        
            else:
                self.notes = {page : note}
                self.page_number += 1
                
        else:
             print("Page가 모두 채워졌습니다.")
             
    def remove_note(self, page_number):
        if page_number in self.notes.keys():
            return self.notes.pop(page_number)
            
        else:
            print("해당 페이지는 존재하지 않습니다")
            
    def get_number_of_pages(self):
        return len(self.notes.keys())

 

 

 

OOP의 특성 : 객체지향의 언어 특징

Inheritance(상속성) Polymorphism(다형성), Visibility(가시성)

 

Inheritance(상속성) 

부모클래스의 속성&Method를 물려받은 자식 클래스를 생성하는 것을 말한다.

# 부모 클래스
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 자식클래스
class Korean(Person):
    pass
    
first_korean = Korean("Sungchul", 35)
print(first_korean.name)

부모 클래스가 가지고 있던 name, age 기본 속성을 그대로 가져와서 "Sungchul", 35라는 값을 표현하는 걸 볼 수 있따.

 

자식 클래스에 super()를 사용하면 부모 클래스에서 사용하는 값을 그대로 가져와서 사용할 수도 있다.

 

 

Polymorphism(다형성)

- 같은 이름 메소드의 내부 로직을 다르게 작성하는 걸 말한다.

- Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모 클래스의 상속이 자주 발생한다.

- 개념적으로 같은 일을 하지만, 세부적인 구현이 다를 경우를 말함

- 파이썬에서는 크게 영향을 많이 받지는 않음

 

모두다 talk()함수를 부르지만 출력 결과가 다른걸 확인할 수 있다.

각각의 목적에 따라서 다르게 사용할 수 있는 걸 다형성이라고 한다.

 

 

 

Visibility(가시성)

- 객체의 정보를 볼 수 있는 레벨을 조절하느 ㄴ것

- 누구나 객체안의 모든 변수를 볼 이유는 없음

  1) 사용자의 임의 정보수정 방지

  2) 필요 없는 정보 접근 방지

  3) 제품 판매 : 소스의 보호(숨김)

 

 

 

* Encapsulation(캡슐화 or 정보은닉)

- class  설계 시, 클래스 간 간섭/정보공유를 최소화하는 것

- 심판 클래스가 축구선수 클래스의 가족 정보를 알 필요가 없다.

- 캡슐을 던지듯, 인터페이스만 알면 쉽게 사용이 가능하다.

 

 

 

 first-class object

- 일등 함수 또는 일급 객체

- 변수나 데이터 구조에 할당이 가능한 객체(parameter or return 값으로 사용가능하다는 것)

- 파이썬 함수는  일급함수

 

 

inner function

- 함수내에 또 다른 함수가 존재하는 것

def print_msg(msg):
  def printer():
      print(msg)
  return printer
print_msg("Hello, Python")

 

decorator

 

반응형

댓글