[AI 기초다지기 ] 객체지향 프로그래밍(Object Oriented Programming)

이희진·2023년 1월 10일
0

Object Oriented Programming, OOP

클래스와 객체

객체: 실생활에서의 일종의 물건! 속성과 행동을 가진다. ex) 의자라는 객체는 색상, 움직임 등의 특성을 가진다.

  • OOP는 객체 개념을 프로그램으로 표현하는 것이다. 속성을 변수로, 행동을 함수로 표현한다.
  • 파이썬 또한 객체 지향 프로그래밍 언어! 흔히 쓰던 int, float, str이 모두 객체였다!

클래스는 설계도! 객체(인스턴스)는 구현한 것이다! 붕어빵 틀과 붕어빵으로 생각하면 쉽다. ㅎㅋ

Object in python

  • 축구 선수 정보를 객체(class)로 구현하기

여기서 잠깐! 변수명과 함수명을 짓는 방식
1. snakecase: 변수에 사용! 띄어쓰기 부분에 사용, 소문자를 사용함.
2. CamelCase: 클래스명에 사용! 띄어쓰기 부분에 대문자를 사용함.

! __init__ 함수는 행동이 아닌 속성을 정의하는 객체 초기화 예약 함수
'__' 두개는 특수한 예약 함수나 변수, 그리고 함수명 변경(맹글링)으로 사용한다.

먼저 객체(object) 이름 선언과 함께 초기값을 입력한다.
method(action) 추가는 기존 함수와 방시깅 같으나, self를 추가해야지 클래스의 함수로 인정된다.

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. My back number is %d" % ₩ (self.name, self.back_number)
    
    def __add__(self, other):
    	return self.name, other.name
        
        
sonny = SoccerPlayer("son", "FW", 7)
park = SoccerPlayer("park", "WF", 13)

print(park)
# 원래라면 주소가 나오지만, __str__ 함수로 인해 내용이 출력된다.
# Hello, My name is park. My back number is 13.
print(sonny + park)
# sonpark

OOP 특성들

객체 지향 언어는 실제 세상을 모델링하기에 필요한 특성들을 가진다!
1. Inheritance(상속)

  • 부모 클래스로부터 속성과 메소드를 물려받은 자식 클래스가 생성된다.
  • super() 라는 메소드는 부모 클래스를 받아오는 것이다.
    (예시)
class Person(obeject):
	def __init__(self, name, age, gender):
    	self.name = name
        self.age = age
        self.gender = gender
    def about_me(self)>:
    	print("저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살 입니다.")
        
class Employee(Person):
	def __init__(self, name, age, gender, salary, hire_date):
    	super().__init(name, age, gender)
        self.salary = salary
        self.hire_date = hire_date
    def about_me(self):
    	super().about_me()
        print("제 급여는 ", self.salary, "원 입니다.")

myPerson = Person("John", 34, "Male")
myPerson.about_me()
# 저의 이름은 John 이구요, 제 나이는 34살 입니다.
myEmployee = Employee("Daeho", 34, "Male", 300000, "2022/03/01")
myEmployee.abount_me()
# 저의 이름은 Daeho 이구요, 제 나이는 34살 입니다.
# 제 급여는 300000원 입니다.

2. Polymorphism(다형성)

  • 같은 이름 메소드의 내부 로직을 다르게 작성한다.
  • dynamic typing 특성으로 인해 같은 이름이지만 다른 역할을 하게 만들 수 있다.

**3. Visibility(가시성)

  • 객체의 정보를 볼 수 있는 레벨을 조절하는 것
  • 누구나 객체 안의 모든 변수를 볼 필요가 없다.
  • encapsulation = 캡슐화 또는 정보 은닉
  • 클래스를 설계할 때, 클래스 간 간섭/정보 공유를 최소화한다.
  • __ 로 private 변수로 선언 가능.

decorator function

@function_name 을 쓰게 되면, 아래의 함수가 해당 함수의 인자로 들어가는 것이다.
<예시>

def star(func):
	def inner(*args, **kwargs):
    	print("*" * 30)
        func(*args, **kwargs)
        print("*" * 30)
    return inner
    
@star
def printer(msg):
	print(msg)

printer("Hello")

<결과>


Hello


0개의 댓글