본문 바로가기

Language/Python

RePythonOOP 1일차 절차지향 VS 객체 지향 그리고 클래스

Portrait of George Dyer in a Mirror - Bacon Francis

Insight

1. str, repr의 차이와 쓰임새

2. 절차 지향, 객체 지향의 차이와 쓰임새

All Code Info : https://github.com/DevRyu/DaliyCode/blob/master/OOPpython/Day01.py

 

 

 

1. 절차지향 VS 객체지향

 

절차 지향 => 함수적 프로그래밍

절차 지향적인 코딩 스타일

위에서 아래로 읽는다

 

student_1 =  "kim"
student_11 =  1
student_111 = [ {'hi':'how' }]

student_2 =  "kim"
student_22 =  1
student_222 = [ {'hi':'how' }]

student_3 =  "kim"
student_33 =  1
student_333 = [ {'hi':'how' }]

 

리스트 구조

관리하기 불편하고 위치 인덱스를 맵핑해서 사용해야 합니다.

tudent_list = ['kim', 'lee', 'park']
student_grade_list = [1, 2, 3]
student_details_list = [
    {'gender': 'a', 'score' : 100, 'score2' : 100 }
]

 

리스트 인덱스 삭제시 아래와 같이 해야 합니다.

 

del student_list[0]
del student_grade_list[1]

 

딕셔너리 구조에서도 마찬가지로 인덱스로 접근하는 불편함이 있습니다.

 

students_dicts = [ 
    {'name' : 'kim' , 'gender': 'male' , 'student_detail' : {
        'math': '100', 'english' : '89'}
    },
    {'name' : 'ja' , 'gender': 'male' , 'student_detail' : {
        'math': '100', 'english' : '89'}
    }
]

del students_dicts[1]

 

클래스 구조는 어떨가요 

구조 설계 후 재사용성 증가, 코드 반복 최소화, 메소드 활용이 가능합니다

 

class Student():

    # 속성(생성자)
    def __init__(self, name, number, grade, details):
        self._name = name
        self._number = number
        self._grade = grade
        self._details = details

    # 행위(메서드)
    def __str__(self):
        return 'str : {} : {}'.format(self._name, self._number)

 

 

파이썬의 모든 객체는 딕셔너리 형태로 가집니다.

그래서 딕셔너리 메서드를 쓰면 키 벨류 형태로 리턴합니다.

 

student1 = Student('a',1,1, {'details':'male'})
student2 = Student('b',2,2, {'details':'male'})
student3 = Student('c',3,3, {'details':'female'})

print(student1)
print(student2.__dict__)

 

위의 객체의 인스턴스들을 리스트에 담아서 호출 가능

 

stu_list = []

stu_list.append(student1)
stu_list.append(student2)
stu_list.append(student3)
#객체만 알려준다. 
print(stu_list)


클래스 내에 __str__ 매직 메서드와 repr메서드을 비교 해보겠습니다.

 

    def __repr__(self): 
        return 'repr : {} : {}'.format(self._name, self._number)

str이 없으면 repr을 호출해준다.

 

str과 repr의 차이는 str은 print문에 의한 출력과 동알한 문자열입니다.

 

str은 객체의 비공식적인 문자열 출력입니다.
사용자가 보기쉬운형태{보기쉽게 생략이 될 수도 있다.

예) s = Hello, World!

 

repr은 객체의 공식적인 문자열 출력이다

파이썬의 인터프린터가 해당 객체가 되어 인스턴스를 만들 수 있는 문자열

예) 소수점이 얼마나 찍히든 다 출력해준다.

 

 

그러므로 가지는 차이는

 

s = "Hello, World!"
print(str(s))  # Hello, World!
print(repr(s))  # 'Hello, World!'

 

입니다.

 

차이는 출력되는 형식이 str인 경우 '' 문자열기호가 없이 출력된 것이고

 

파이썬의 프로그래밍에서 원하는 출력 결과가 문자열이 없는 common한 결과를 얻기 위함이면 
str로 리턴해야합니다.  

 

 

 

 

클래스에서 선언을 안하고 그냥 문자열을 하나 선언해서 보면 어떨가요?

 

s  = 'Hello world'
print(s) # hello world

 

str형태로 출력이 됩니다.

 

위의 설명했듯 문자열이 출력 되야 한다면 repr로 사용하면 됩니다.