객체지향 프로그래밍

yozzum·2023년 10월 1일
0
  • 객체지향 프로그래밍

    • 여러 독립 객체들의 상호작용(소통) 관점을 가지는 것.
  • 객체

    • '속성'과 '행동'으로 이루어진 것.
    • 자동차의 바퀴, 핸들, 의자, 엑셀, 브레이크, 엔진 등은 속성이고, 주행, 정지, 좌/우회전은 행동이 된다.
    • 속성과 행동을 정의할 수 있다면 객체로 표현할 수 있다.
    • 파이썬에서 속성은 변수, 행동은 함수로 표현된다.
  1. 추상화(Abstraction)

    • 객체 사용자에게 필요 정보만 공개하는것.
    • 자동차 내부 동작 원리를 알지 못해도 운전할 수 있음.
    • 변수에 값을 할당하거나, 함수를 사용하거나, 클래스를 사용하는것도 추상화
    • lst.append("value") 에서 append 내부 동작은 알지 못해도 사용할 수 있음.
    • 필요시 내부 로직을 파악할 수 있도록 문서화를 잘 해야놔야함.
  2. 캡슐화(Encapsulation)

    • 객체 내부에 속성과 행위를 포함하는 것
    • 속성과 행위에 대한 정보 은닉의 개념이 포함되어있음.
class Student(object):
    def __init__(self, name, age, id, grade):
        self._name = name
        self._age = age
        self._id = id
        self.__grade = grade #__는 정보에 바로 접근할 수 없도록 막음.
    
    @property #property decorator : 숨겨진 변수를 반환하게 해줌
    def grade(self):
        return self.__grade
        
# 인스턴스 생성
Kim = Student('Kim', 24, 201701234, 4.0)

# 변수 호출
print(Kim._name) # kim
print(Kim._age) # 24
print(Kim._id) # 201701234
print(Kim.__grade) # AttributeError: 'Student' object has no attribute '__grade'

# grade를 활용해서 호출하기
grade1 = Kim.grade
print(grade1) # 4.0
  • grade 앞에 언더바(_) 두개를 붙혀서 은닉한다.
  • 데코레이터를 활용하면 접근할 수 있다.
  1. 상속(Inheritance)
    • 학생, 회사원 등의 객체는 모두 사람 객체를 기반으로 한다.
    • 사람 클래스에 속성과 행동을 정의하고, 이들을 학생, 회사원 객체에서 상속받도록 하여 오류와 불일치를 없앤다.
class Person(object):
    def __init__(self, name, age):
        self._name = name
        self._age = age
    
    def introduce(self):
        return f'My name is {self._name}, I am {self._age} years old.'

class Student(Person): # 상속할 때, object 대신에 부모클래스를 적어줘야한다.
    def __init__(self, name, age, id, grade): 
        super().__init__(name, age) #super()를 활용해서 부모클래스의 속성을 가져올 수 있음.
        self._id = id
        self.__grade = grade

# 인스턴스 생성
Kim = Student('kim',24, 201701234, 4.0)

# 부모클래스로부터 상속받은 함수 사용
print(Kim.introduce()) # My name is kim, I'm 24 years old.
  • 상속을 받을 때에는 class 선언 시 object 대신 상속받을 클래스명을 넣어야한다.
  1. 다형성(Polymorphism)
    • 모든 동물들이 Bark하지만 Bark소리가 다 다르다. 즉 행동은 동일하나, 그 결과가 다른 것을 다형성이라고 한다.
class Animal(object):
    def __init__(self, name):
        self._name = name
    
    def bark(self): # Abstract method
        raise NotImplementedError() # "아직 구현하지 않은 부분입니다"라는 에러입니다.
        
class Cat(Animal): # 상속 받음
    def bark(self):
        return "Meow!"

class Dog(Animal): # 상속 받음
    def bark(self):
        return "Woof!"

animals = [Cat('Mong'), Cat('Kong'), Dog('Choco')]

for animal in animals:
    print(animal.bark()) # Meow! Meow! Woof!
profile
yozzum

0개의 댓글