DINO NET

(23.02.02) 객체 지향 프로그래밍 기본 개념 1. 추상화(Abstraction) 본문

program()/파이썬

(23.02.02) 객체 지향 프로그래밍 기본 개념 1. 추상화(Abstraction)

2023. 2. 2. 17:17

추상화(Abastraction)

특정 코드를 사용할 때, 필수적인 정보만 드러내고 나머지 세부사항은 감추는 것.

변수, 함수, 클래스 또한 추상화의 개념이다.

 

example)

#원의 넓이를 계산하는 함수
def Circle(radius):
    PI = 3.1415926535
    area = 2 * PI * radius * radius
    print(round(area, 2))
    
Circle(2)
Circle(4)
Circle(7)

#[]를 이용해 빈 리스트 인스턴스 정의
ex_list = []
ex_list.append(5)
ex_list.append(3)
ex_list.append(8)
print(ex_list[0])
print(ex_list[1])
print(ex_list[2])
  • PI는 원주율을 대신해주며, 사용자는 PI의 정확한 값을 알지 못해도 원주율이라는 개념으로 사용한다.
  • 함수 Circle은 파라미터 radius만 채워주면 매커니즘을 알지 못해도 원의 넓이를 계산한 값을 얻을 수 있다.
  • list는 파이썬 개발자들이 만들어놓은 클래스 중 하나이다. 우리는 리스트가 어떻게 생성되는지 알지 못해도, 리스트를 생성하는 방법, append라는 메소드가 무슨 작용을 하는지만 알고 사용을 하고 있다. 

추상화 잘 적용하기

1. 클래스, 변수, 함수(메소드)명 직관적으로 짓기

: 이름만 보고도 쓰임새를 유추 할 수 있도록 의미가 담기게 짓는 것이 중요하다.

2. 문서화(docstring)하기

: 이름만으로 충분히 유추하기 힘드므로 docstring을 이용해 클래스, 변수, 함수를 설명할 수 있다.

"""
설명하고자 하는 내용을 적으면 된다.
"""

파이썬을 이용한 docstring은 크게 세가지 스타일로 나뉜다.

1. Google docstring

2. reStructuredText (파이썬 공식 문서화 기준)

3. NumPy/SciPy(통계, 과학 분야에서 쓰이는 Python 라이브러리)

 

아래 예제는 Google docstring을 이용해본 docstring이다. (정확하지는 않음)

 

example

class User:
    """ User 클래스
    
    SNS의 유저를 나타내는 클래스
    
    Attributes:
        count(int): SNS 유저 수
    """
    count = 0

    def __init__(self, name, email, pw):
        """__init__ 메소드
        
        User 인스턴스의 기본 정보를 저장
        
        Args:
            name(str): 유저의 이름
            email(str): 유저의 이메일
            pw(str): 유저의 비밀번호
            count(int): SNS의 유저 수. 인스턴스가 생성될 때마다 1씩 증가
        """

        self.name = name
        self.email = email
        self.pw = pw

        User.count += 1

    def say_hello(self):
        """say_hello 메소드
        
        유저의 이름을 포함한 인사 메세지를 출력한다.
        
        """
        print("안녕하세요! 저는 {}입니다!".format(self.name))

    def __str__(self):
        """__str__ 메소드
        
        유저 정보를 정의된 문자열 형태로 리턴한다.
        
        Returns:
            str: 유저의 기본정보 리턴
        """
        return "사용자: {}, 이메일: {}, 비밀번호: ******".format(self.name, self.email)

    @classmethod
    def number_of_users(cls):
        """number_of_users 메소드 
        
        총 유저 수를 출력하는 클래스 메소드
        
        """
        print("총 유저 수는: {}입니다".format(cls.count))

help(User)

* help()는 클래스, 함수 등의 docstring을 포함한 정보를 확인할 수 있는 함수이다. 

 

+) type hinting

정적 타입 언어: 변수의 타입을 미리 설정해야하는 언어. ex) java, C

# c 언어 예시

int a = 0;
float b = 3.5;
#a는 int 타입을 b는 float 타입을 갖는 변수이다. 타입 외의 값을 할당 할 수 없다. 

int add(int x, int y){
	return x + y;
}
#int는 함수의 rtype. 파라미터 또한 타입이 정해져있다.

동적 타입 언어: 변수에 할당되는 값에 따라 타입이 정해진다. 파이썬이 이에 해당한다.

a = 0 #int
b = 3.5 #float

def add(x, y):
	return x + y
#위 함수는 파라미터의 값도, return의 값도 그때 그때 달라진다.

동적 타입 언어는 코드의 길이를 줄여주지만, 해당 클래스나, 함수에 필요한 파라미터 혹은 그 안에서 쓰이는 변수들의 타입을 한 눈에 알아보기 힘들다. type hinting은 그 점을 보안하기 위한 기능이다. (ver 3.5 이후)

class User:

	count: int = 0
    #변수: 타입
    
    def __init__(self, name: str, email: str, pw: str) -> None:
    #메소드(함수) 옆 -> 표시는 return type __init__ method는 return 값이 없으므로 None type
    	self.name = name
        self.email = email
        self.pw = pw
        
        count += 1
        
    def __str__(self) -> str:
    #str 타입이 리턴되므로
    	return "{}님! 환영합니다!".format(self.name)

type hinting은 강제되는 값이 아닌 권고 값이므로 표시된 타입과 다른 타입을 할당하더라도 오류가 발생하지 않는다. 

대신 팝업으로 경고창이 뜨거나 전혀 다른 결과값을 얻을 가능성이 있다.

 

 

 

 

 

230202