본문 바로가기
Python/OOP

객체지향 프로그래밍

by youngflowey 2019. 11. 27.

OOP(Object Oriented Programming)

 

함수기반의 프로그래밍을 하면 좋아요!
1970년부터 시작해서 지금까지 이 방식으로 프로그래밍을 하고 있어요
장점 : 프로그래밍이 쉬워요! => 빨리 만들수 있어요!
       => 비용이 적게 들어요!
단점 : 처음에는 단점이 별로 없어보였어요!

 

1990년 들어오면서 세상이 변하기 시작했어요! => 인터넷
정보량이 많아지기 시작 => 세상이 급변하기 시작
프로그램의 유지보수 요구가 많아지기 시작
절차적 프로그램으로 프로그램을 작성해서 이런 문제가 발생
어떤 방식으로 프로그램을 만들면 유지보수측면에서 이점이 있을까?
객체지향 paradigm이 시작
객제지향이 어떤 프로그래밍 방식인지를 인지
함수를 가지고 만드는것 : 절차적 프로그래밍 => 객체지향은 이방식이 아님
현실세계에 잘 부합하는 (변화에 잘 적응하는) 프로그램을 만들기 위해 해결해야 하는 문제를(현식세계의 문제)
프로그램을 똑같이 모델링하면 되는거 아냐?
세분화 하는게 아니라 프로그램쪽으로 설명한것
객체 지향 : 내가 구현하려고 하는 문제를 프로그램으로 투영한것
구성요소를 하나의 객체로 인식하고 프로그램쪽으로 표현

은행프로그램을 만들려고 해요
은행프로그램을 구성하는 구성요소를 파악
텔러, 고객, 은행계좌, 지점, 테이블,...
분석하는 사람마다 달라요!
구성요소간의 행위들을 정의하는 프로그래밍 방식
은행계좌(객체)를 예로 프로그램으로 표현(객체 모델링)

 

객체들은 크게 2가지로 파악할 수 있어요!
상태와 행위로 파악 (추상화)
상태는 값으로 표현되는것, 행위는 동작으로 표현되는것
상태 : 잔액, 예금주, 계좌번호, ...
행위 : 출금, 입금, 조회 (값이 아니라 뭔가가 일어나는것, 동작)
상태와 행위 추출 => abstraction(추상화)
추상화를 통해서 상태와 행위로 나뉘어 진다

class => 객체 모델링의 수단, 추상 데이터 타입
클래스의 이름은 대문자로 시작(관용적)

 

class Student:  # class는 student를 묘사하고 끝
                # 실제 데이터 실제 사람을 만들어야해
                # 틀에 데이터를 넣은게 아니라 list만드는것 처럼 메모리 공간 만들어서 이름넣고 학번넣고,,
                # 어떤 기준? : class에 묘사된 정보
                # 그 공간을 어떤 형식으로 만들건가? => class
                # class : data type

상태(값) : 이름, 학과, 학년, 학번, 성별, 나이,...키, 몸무게
몸무게 넣어! 몸무게 빼야지! > 누가 설계하느냐에따라 완전히 달라짐
상태는 변수로 표현 => properties(속성)
                               properties (상태를 묘사) 

 # properties (상태를 묘사) 

s_nation = ""# class variable (변수영역)
#     s_name = ""  # 학생 이름을 나타내는 property
#                  # class variable (모든 객체가 공유하는 변수)
#                  # but, 이름은 공유하지 않아 

#     s_num = ""   # 학번을 나타내는 property
#                  # class variable

 

# 생성자(constructor)

def __init__(self,n): # .n : 이생성자는 인자를 한개 받아들이는 생성자
                            # 전역변수, 지역변수
                            # 여기서 s_name은 지역변수로 def나가면 없어져버림
                            # 이 class의 객체를 만들기 위함
                            # s_name -> Student.s_name(앞의 class이름 명시해서)
#         Student.s_name = n
        self.s_name = n        # instance variable(객체가 독립적으로 )
                           # 자기가 가지고 있는 s_name
        self.s_num = ""

# 행위(동작)

 

# 함수
    # method (행위를 묘사)

def display(self):
	print("학생이름 : {}".format(s_name))

# 객체 생성

t = Student("홍길동")   

=> 이 코드에 의해서 만들어진 메모리에 있는 저장공간(instance)
    => 객체
       => class내부에 정의된 생성자라고 불리는 함수가 호출되요!
t = 객체
student는 변수두개를 정해서 넣을 수 있는 타입

 

print(t.s_name)

class : 기존에 없던 데이터타입 만들어줌
         새롭게 저장구조를 만들어줌

 

class Student:  
# 객체 만들어질때 생성자 자동 호출
    # properties (상태를 묘사) 
    s_nation = ""         # class variable (변수영역)

    
#     # 생성자(constructor)
    def __init__(self,n): 
        self.s_name = n        # instance variable(객체가 독립적으로 )
        self.s_num = ""
        self.s_major = []

    # method (행위를 묘사)
    def display(self):
        print("학생이름 : {}".format(self.s_name))


t = Student("홍길동")      # 객체 생성
t.display()
print(t.s_name)
Student.s_nation = "한국"
print(t.s_nation)

k = Student("김연아")       # 객체
k.display()
print(k.s_name)
print(k.s_nation)

class Student:  
# 객체 만들어질때 생성자 자동 호출
    # properties (상태를 묘사) 
    s_nation = ""         # class variable (변수영역)

    
#     # 생성자(constructor)
    def __init__(self,n,num):
        self.s_name = n        # instance variable(객체가 독립적으로 )
        self.s_num = num
        self.s_major = []

    # method (행위를 묘사)
    def display(self):
        print("학생이름 : {}".format(self.s_name))


students = list()
students.append(Student("No",100))
students.append(Student("Yun",200))
                                  

print(students[1].s_num)
print(students)
students[0].display()

 

댓글