티스토리 뷰

구조적 프로그래밍 (절차적 프로그래밍)

  • 프로그램 작성 시 기능으로 세분화해서 각각의 기능을 모듈화(함수화)해서 구현
  • 장점 : 설계/ 프로그래밍이 쉽고 빠르다.
  • 단점: 프로그램 규모가 커지면 유지보수와 코드의 재사용이 어렵다.

 

객체지향 프로그래밍

  • Object Oriented Programming (OOP)
  • 개체들을 파악해서 그 개체들간의 관계를 프로그래밍 하는 방식
  • 현실세계의 해결해야 할 문제를 그대로 프로그램으로 묘사(표현)
  • 프로그램을 구성하는 주체들 (개체, 객체, Object)을 파악하고, 그 객체들간의 데이터 흐름에 초점을 맞추어서 프로그램을 작성
  • 객체 모델링: 각각의 객체를 프로그램적으로 묘사
  • 추상화(Abstraction)을 거쳐서 객체 모델링한다.
  • 개체들의 [속성 -> 변수, 행위 -> 함수]
    • 변수(property, member field, field)
    • 함수(method)

** 현실세계의 개체를 프로그래밍적 객체로 나타내기 위한 수단이 클래스

 

Class

  1. 객체 모델링의 수단
  2. ADT다

ADT

  • Abstract data type (추상적인 데이터 타입, ADT)
  • class는 data type의 관점에서 봤을 때, 기존 data type을 이용해서 새로운 data type을 만드는 것이다.
  • <-> Built-in data type

Instance

  • 클래스를 기반으로, 내용을 메모리에 저장시키기 위해 instance로 메모리 공간을 만든다.
  • 클래스는 하나, 클래스로부터 파생된 공간 (instance)들은 여러 개
  • instance 하나가 한 사람의 데이터를 뜻함

Class Variable

  • class 자체가 가진 변수

Instance Value

  • 각각의 instance가 개별적으로 가지는 변수
  • self.dept의 dept는 -> instance value

Instance Method


클래스 선언

class Student(object):
    scholarship_rate = 3.0   # class variable

    def __init__(self, name, dept, num, grade):  # initializer 생성자 constructor
        self.name = name
        self.dept = dept
        self.num = num
        self.grade = grade

    def __repr__(self):     # 원래는 호출 시 메모리 주소가 출력되지만
        return self.name    # 재정의 가능

    @classmethod            # Decorator
    def change_scholarship(cls, rate):
        cls.scholarship_rate = rate
        print("장학금 기준이 변경되었어요!")

    @ staticmethod
    def is_valid_scholarship(rate):
        if rate < 0:
            print("장학금 기준은 음수가 될 수 없습니다.")

    def is_scholarship(self):                        # instance method
        if self.grade > self.scholarship_rate:       # error(x): instance namespace에 없으면 -> class namespace 가서 찾음
                                                     # instance namespcae에 변수 추가 된 이후에는 instance variable과 비교
        # if self.grade > Student.scholarship_rate:
            return True
        else:
            return False

 

 

클래스 사용

student = Student("홍길동", "심리학과", "20203311", 4.0)
print(student)                      # <__main__.Student object at 0x00000165AF5D1E88> - 재정의 아닐 시
print(student.__repr__())         # <__main__.Student object at 0x00000165AF5D1E88> - 재정의 아닐 시
print(student.is_scholarship())   # True

student.scholarship_rate = 4.5      # class variable을 변경하는 것이 아니라/ instance namespace에 새로 추가
print(Student.scholarship_rate)     # 3.0
print(student.scholarship_rate)     # 4.5
print(student.is_scholarship())     # False


# class method는 클래스를 인자로 받아서 class variable을 생성, 변경, 참조하기 위해서
# student.change_scholarship(3.7)
Student.change_scholarship(change_rate)     # class method 사용
                                            # 장학금 기준이 변경되었어요!
### static method
Student.is_valid_scholarship(change_rate )  # static method 사용
                                            # 장학금 기준 학점은 음수가 될 수 없습니다.

 

정보은닉/ getter/ setter

# private로 처리된 속성이 있으면 외부에서 직접적인 access 불가 => method로 처리
# private 속성 값 알아내는 method => getter
# private 속성 값을 설정해주는 method => setter

class Student(object):
    scholarship_rate = 3.0  # class variable

    def __init__(self, name, dept, num, grade):  # initializer
        self.name = name  # instance variable
        self.__dept = dept  # private variable
        self.num = num
        self.grade = grade

    ## getter method
    def get_dept(self):
        return self.__dept

    ## setter method
    def set_dept(self, dept):
        self.__dept = dept

    # private method
    def __print_date(self):
        return self.name


student = Student("홍길동", "심리학과", "20203311", 4.0)
# print(student.__dept)       # private 처리 - error
# 'Student' object has no attribute '__dept'

# student.__dept = "컴퓨터"    # error
print(student.get_dept())  # 심리학과
student.set_dept("컴퓨터")
print(student.get_dept())  # 컴퓨터

 

Super Class

class Unit(object):     # 모든 class는 object를 상속받는다.
    def __init__(self, damage, life):
        self.utype = self.__class__.__name__    # 클래스 이름 참조
        self.damage = damage
        self.life = life

    def show_status(self):
        print("직업: {}".format(self.utype))
        print("공격력: {}".format(self.damage))
        print("생명력: {}".format(self.life))

 

Sub Class

class Marine(Unit):
    def __init__(self, damage, life, range_upgrade):  # 오버라이딩 - 상속 시 재정의
        super(Marine, self).__init__(damage, life)  # Marine class의 상위 class를 찾아, 두 인자를 넘겨 init 호출
        self.range_upgrade = range_upgrade

    # overriding
    def show_status(self):
        super(Marine, self).show_status()
        print("사거리 업그레이드 유무: {}".format(self.range_upgrade))

    # overriding
    def attack(self):
        print("마린이 총으로 공격합니다. 땅땅!!")

    def stimpack(self):
        if int(self.life) < 20:
            print("체력이 낮아서 스팀팩 수행이 불가능합니다.")
        else:
            # int(self.life) -= 10
            # int(self.damage) += 1.5
            print("마린이 스팀팩을 사용했어요!!")

 


Magic Function

  • __init__, __repr__

Initializer

  • instance가 만들어지는 순간 자동으로 호출 -> 초기화 역할
  • constructor(생성자)와 비슷

 

dir() 내장 함수

  • python 함수도 객체
  • print(dir(my_func))
  • **dir()**: 객체가 인자로 들어오면 해당 객체의 모든 속성과 메소드를 알려주는 python 내장 함수

 

Namespace

  • instance namespace
  • class namespace
  • superclass namespace
  • instance namespace < class namespace < superclass namespace
  • instance namespace에서 찾지 못한 속성/메소드는 error를 발생시키는 것이 아니라, class namespace로 가서 찾는다.

 

instance method

  • self인자를 가지고 있는 method
  • 하나의 인스턴스에 한정된 데이터를 생성, 변경, 참조하기 위해서 사용된다.

 

class method

  • 클래스를 인자로 받아서 class variable을 생성, 변경, 참조하기 위해서
  • @classmethod

 

static method

  • @staticmethod

 

access modifier(접근제어자)

  • 외부에서 직접적으로 access하는 것을 막는 방법
  • Java => public vs private
  • Python => __변수명 -> private

 

Inheritance (상속)

  • 재사용성을 위한 대표적인 객체지향 기법
  • Parent Class = Upper /SuperClass
  • Child Class =** Sub**Class
  • IS-A관계
    • Sub class** is a** Supler class
    • 역성립 x
  • 1:N 일대다
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함