본문 바로가기

코딩

파이썬 클래스 & 오브젝트 (한글 요약)

728x90
반응형

 

Python Classes and Objects || Python Tutorial || Learn Python Programming

Python Classes and Objects ❘❘ Python Tutorial ❘❘ Learn Python Programming

 

1. 클래스(Class)란 무엇일까요? - "객체를 만드는 설계도"

가장 쉽게 비유하자면, 클래스는 '설계도' 또는 '틀'입니다. 예를 들어 '붕어빵 틀'이 있다면, 우리는 그 틀을 사용해 수많은 '붕어빵'을 찍어낼 수 있죠.

  • 클래스 (Class): 붕어빵 틀 (설계도)
  • 객체 (Object) / 인스턴스 (Instance): 붕어빵 (설계도로 만든 실체)

파이썬에서는 이 '설계도'를 만들어, 데이터와 그 데이터를 처리하는 함수들을 하나로 묶어 관리합니다.

 

2. 가장 간단한 클래스와 객체 만들기

# 1. 가장 기본적인 클래스 정의
class User:
    pass

# 2. 객체 생성
user1 = User()

# 3. 데이터 추가
user1.first_name = "데이브"
user1.last_name = "보우먼"

# 4. 데이터 출력
print(user1.first_name) # 데이브
print(user1.last_name)  # 보우먼

# 또 다른 객체 생성
user2 = User()
user2.first_name = "프랭크"
user2.last_name = "풀"

print(user2.first_name) # 프랭크

 

user1user2는 똑같은 User 클래스로 만들었지만, 서로 다른 데이터를 가진 독립적인 객체입니다. 객체에 .을 사용해 추가한 first_name 같은 변수는 '필드(Field)' 또는 '속성(Attribute)'이라고 부릅니다.

 

3. __init__ 메서드: 객체의 탄생을 돕는 마법사

객체를 만들 때마다 일일이 데이터를 추가하는 것은 번거롭습니다. 이때 사용하는 것이 __init__ 메서드(생성자)입니다.

class User:
    def __init__(self, full_name, birthday):
        self.name = full_name
        self.birthday = birthday
        
        # 이름 분리
        name_pieces = full_name.split(" ")
        self.first_name = name_pieces[0]
        self.last_name = name_pieces[-1]

user1 = User("데이브 보우먼", "1964-01-07")

print(user1.name)         # 데이브 보우먼
print(user1.first_name)   # 데이브
print(user1.birthday)     # 1964-01-07

 

self는 객체 자기 자신을 가리키는 키워드이며, 클래스 내부에서 필드나 메서드에 접근할 때 반드시 사용해야 합니다.

 

4. 클래스에 기능 추가하기: 메서드(Method)

클래스 안에 정의된 함수는 메서드(Method)라고 부릅니다. 생일로 나이를 계산하는 기능을 추가해 볼까요?

from datetime import date

class User:
    def __init__(self, full_name, birthday):
        self.name = full_name
        self.birthday = birthday
        
        name_pieces = full_name.split(" ")
        self.first_name = name_pieces[0]
        self.last_name = name_pieces[-1]
    
    def age(self):
        """사용자의 만 나이를 계산합니다."""
        today = date(2001, 5, 12)
        birth_year, birth_month, birth_day = map(int, self.birthday.split('-'))
        dob = date(birth_year, birth_month, birth_day)
        age_in_days = (today - dob).days
        return age_in_days // 365

user1 = User("데이브 보우먼", "1964-01-07")
print(f"{user1.name}의 나이는 {user1.age()}세 입니다.")

 

self는 메서드 내부에서만 사용되며, 호출할 때는 쓰지 않습니다. 위 예시에서는 나이가 37로 출력됩니다.

 

5. 왜 딕셔너리 대신 클래스를 쓸까요?

딕셔너리 {'name': '데이브', 'birthday': '1964-01-07'}로 데이터를 저장할 수도 있지만, 클래스에는 다음과 같은 장점이 있습니다:

  1. 구조화: 데이터와 기능을 하나로 묶어 구조적으로 관리할 수 있습니다.
  2. 재사용성: 동일한 구조의 객체를 쉽게 계속 만들 수 있습니다.
  3. 안정성: __init__을 통해 생성 형식을 강제하여 실수를 줄입니다.

정리

  • 클래스(Class): 객체를 만들기 위한 설계도
  • 객체(Object): 클래스를 통해 만들어진 실체
  • 필드(Field): 객체가 가지는 데이터
  • 메서드(Method): 객체가 수행하는 기능 (함수)
  • __init__: 객체 초기화 메서드
  • self: 객체 자신을 참조

클래스는 파이썬을 한 단계 더 깊이 있게 사용하기 위한 필수 관문입니다. 오늘 배운 내용을 바탕으로 직접 클래스를 만들어 연습해 보세요. 코드를 조직하는 새로운 즐거움을 발견하게 될 겁니다!

 


 

스크립트 한글 번역

(00:02) 클래스는 어떤 제대로 된 프로그래밍 언어에서든 기본적인 도구입니다. 클래스를 관련된 데이터와 그 데이터로 흥미로운 작업을 수행하는 함수들을 가진 객체를 만들기 위한 '틀'이라고 생각하시면 됩니다. 파이썬은 클래스를 만들고 사용하기 쉽게 만듭니다. 사실, 대부분의 다른 프로그래밍 언어들은 파이썬의 우아함과 단순함을 꽤 부러워하죠.

 

(00:25) 오늘, 저희는 파이썬에서 클래스를 사용하는 방법을 보여드릴 것이며, 품격 있는(classy) 방식으로 진행할 겁니다. 우리가 '프렌드페이스(friendface)'라는 새로운 소셜 네트워크를 만들고 있고, 우리의 목표가 사용자에 대한 가능한 한 많은 개인 정보를 수집하는 것이라고 가정해 봅시다... 어떤 이유에서든요. 우리는 각 사용자에 대한 많은 데이터를 가질 것이고, 그 데이터를 사용해 많은 함수를 작성할 겁니다.

 

(00:50) 이 작업을 체계적으로 정리하기 위해, 'user'라는 클래스를 만드는 것부터 시작하겠습니다. 파이썬에서는 먼저 class 키워드를 작성하고 클래스 이름을 붙여 클래스를 정의합니다. 클래스 이름의 모든 단어는 대문자로 시작하는 것이 좋습니다. 마지막으로 콜론을 입력하고 엔터를 누릅니다. 첫 번째 예제로, 가능한 가장 간단한 클래스를 만들어 보겠습니다. 정말 아무것도 하지 않을 겁니다.

 

(01:10) pass를 입력하고 엔터를 누르세요. pass는 아무것도 하지 않는 한 줄을 입력하는 방법입니다. 클래스를 정의할 때는 적어도 한 줄이 필요하기 때문에 이것이 필요합니다. 이제 클래스를 정의했으니, 이를 사용해 여러 다른 사용자를 만들 수 있습니다. 사용자를 만들려면, 클래스 이름을 입력하고 괄호를 붙입니다. 이것은 마치 메서드를 호출하는 것처럼 보이고... 어떤 면에서는 실제로 그렇습니다.

 

(01:33) 우리는 user1을 user 클래스의 '인스턴스(instance)'라고 부릅니다. user1을 '객체(object)'라고 부를 수도 있습니다. 이 객체에 데이터를 붙이려면, 먼저 객체 이름, 점(.), 변수 이름을 입력한 다음 값을 할당합니다. user1에게 이름(first name)과 성(last name)을 줘봅시다.

 

(01:53) first_name과 last_name은 객체에 붙어있기 때문에, 우리는 이것들을 '필드(field)'라고 부릅니다. 이것들은 user1에 특정한 데이터를 저장합니다. 데이터가 user1 객체에 있는지 확인하기 위해, 출력해 봅시다. 데이터를 할당했던 것과 같은 방식으로 접근합니다. 객체 이름, 점, 그리고 필드 이름을 입력하세요. 성도 출력해 봅시다. 훌륭합니다. 참고로, 필드 이름은 대문자로 시작하지 않아야 하며, 필드 이름에 두 단어 이상을 사용한다면 단어들을 언더스코어(_)로 구분하세요.

 

(02:22) 이것은 파이썬의 관례이므로, 동료들로부터 불편한 시선을 피하고 싶다면 이 관례를 따르는 것을 추천합니다. 여기서 '데이브 보우먼'이라는 이름은 user1 객체에 붙어있습니다. 이를 명확히 하기 위해, first_name과 last_name이라는 독립적인 변수도 만들어 보겠습니다. 이 값들은 사용자 객체에 붙어있지 않습니다.

 

(02:46) 이 값들을 출력하면 '아서 클라크'라는 이름이 나오지만, user1에 붙어있는 값들을 출력하면 '데이브 보우먼'이 나옵니다. 같은 변수 이름을 사용하더라도 값들은 분리되어 유지됩니다. 클래스를 사용하면 만들 수 있는 객체의 수에는 제한이 없습니다. 창의적으로 user2라고 불리는 두 번째 사용자를 만들어 봅시다. 이 사용자에게는 '프랭크 풀'이라는 이름을 주겠습니다.

 

(03:07) 이전과 정확히 같은 필드 이름을 사용하지만, 이번에는 값들이 user2에 붙어있습니다. 파이썬이 이 세 이름을 분리해서 관리한다는 것을 보기 위해 세 이름을 모두 출력해 보겠습니다. 이처럼 클래스는 객체를 만드는 데 사용되며, 각 객체는 동일한 변수 이름에 대해 다른 값을 가질 수 있습니다.

 

(03:26) 객체에 추가적인 필드를 붙일 수 있으며, 그것들이 꼭 문자열일 필요는 없습니다. user1이 37세라는 나이(정수)를 가지고 있다고 가정해 봅시다. 그리고 user2에게는 그가 가장 좋아하는 책에 대한 값을 할당해 봅시다. 이제 우리는 user1과 user2가 서로 다른 필드를 가진 상황에 처했습니다. user1은 나이를 가지고 있지만, user2는 그렇지 않습니다.

 

(03:48) user2는 가장 좋아하는 책을 가지고 있지만, user1은 그렇지 않습니다. user1의 나이를 출력해 보면 값이 거기에 있는 것을 볼 수 있습니다. 그리고 나이의 타입을 보면, 정말로 정수(integer)입니다. 이제 우리가 할당하지 않은 user2의 나이를 출력하려고 하면 어떻게 되는지 보세요. AttributeError가 발생합니다. 그러니 주의를 기울여 주세요.

 

(04:08) 특정 객체가 특정 필드를 가지고 있는지 확실하지 않다면, 에러를 겪을 수 있습니다. 무슨 생각 하시는지 압니다. 그냥 딕셔너리에 데이터를 저장할 수도 있었는데, 왜 굳이 클래스를 만드는 수고를 했을까? 이제 딕셔너리를 뛰어넘는 클래스의 추가적인 기능들을 보게 될 겁니다.

 

(04:28) 객체 초기화를 사용하는 메서드 추가, 도움말 텍스트 포함 등을 통해 우리의 간단한 클래스를 데이터 강국으로 만들 수 있습니다. 우리가 추가할 첫 번째 기능은 init 메서드입니다. 클래스 안의 함수는 '메서드(method)'라고 불립니다. init은 '초기화(initialization)'의 줄임말이며, 일부 언어에서는 초기화 메서드를 '생성자(constructor)'라고 부릅니다.

 

(04:50) 이 메서드의 이름은 init이며, 앞뒤로 이중 언더스코어(__)가 붙습니다. 이 메서드는 클래스의 새 인스턴스를 만들 때마다 호출됩니다. 이 메서드의 첫 번째 인자는 self라는 단어인데, 이것은 생성되고 있는 새 객체에 대한 참조입니다. self 뒤에 추가적인 인자들을 더할 수 있습니다. full_name과 birthday 인자를 추가하겠습니다.

 

(05:09) 우리가 가장 먼저 할 일은 이 값들을 객체의 필드에 저장하는 것입니다. self, 점(.), 필드 이름을 입력하고 값을 할당함으로써 이 작업을 수행합니다. 전체 이름은 name이라는 필드로 저장하고, birthday 값은 birthday라는 필드에 저장할 겁니다. 여기서 주의하세요.

 

(05:29) 이 birthday는 사용자 객체를 만들 때 제공되는 값이고, 저 birthday는 그 값을 저장하는 필드입니다. 이 예제를 간단하게 유지하기 위해, 생일은 '연-월-일' 형식이라고 가정하겠습니다. 이제 사용자를 만들고 init 메서드를 사용해 보겠습니다. 이전처럼, 클래스 이름과 괄호를 입력합니다.

 

(05:49) 이번에는 두 개의 값을 제공해야 합니다. 왜냐하면 init 메서드가 두 개의 값을 기대하고 있기 때문입니다. 첫째는 이름, 그다음은 생일입니다. 이 값들이 객체에 저장되었는지 출력해서 테스트할 수 있습니다. 데이터가 모두 거기에 있네요. 우리 클래스에 또 다른 기능을 추가해 봅시다. init 메서드에서, 이름을 분리해서 이름과 성을 추출해 봅시다.

 

(06:11) 전체 이름에 대해 split 메서드를 호출하고, 공백을 전달할 겁니다. 이것은 공백을 만날 때마다 이름을 잘라 조각으로 만들 것입니다. 이 조각들은 배열에 저장됩니다. 이름은 배열의 첫 번째 문자열이 될 것이고, 성은 배열의 마지막 문자열이 될 것인데, 이는 인덱스 -1을 사용해 접근할 수 있습니다.

 

(06:32) 이름을 self에 붙였지만, 성은 그렇게 하지 않은 것을 주목하세요. 그 결과로 무슨 일이 일어나는지 보게 될 겁니다. 이전과 같이 사용자를 만들고, 전체 이름, 이름, 성, 그리고 생일을 출력해 봅시다. 실행. 성을 출력하려고 할 때 AttributeError가 발생합니다. 이것은 우리가 self를 사용해 성을 객체에 붙이지 않았기 때문입니다.

 

(06:53) 무슨 일이 일어났냐면, 우리는 last_name이라는 변수에 값을 할당했는데, 이 변수는 메서드가 끝날 때까지만 존재합니다. 이건 금방 고칠 수 있습니다. 돌아가서 last_name을 self에 붙입시다. 이제 코드를 실행하면 모든 것이 예상대로 작동합니다. 이 클래스를 약간의 도움말 텍스트를 추가하여 더욱 개선할 수 있습니다.

 

(07:14) 이를 위해서는, 우리가 '독스트링(docstring)'이라고 부르는 특별한 문자열을 입력합니다. 이것은 첫 줄 바로 다음에 입력하는 삼중 따옴표 안의 문자열입니다. 이제 이 클래스에 대해 help 함수를 호출하면 어떻게 되는지 보세요. 파이썬은 user 클래스에 대한 유용한 개요를 표시합니다. 독스트링을 요약으로 보여주고, init 메서드에서 기대되는 인자들도 보여줍니다.

 

(07:36) 비록 자신만을 위해 코드를 작성하더라도, 독스트링을 작성하는 것은 좋은 습관입니다. 몇 년 후에 자신이 작성한 클래스를 사용해야 할 수도 있습니다. 몇 초의 타이핑은 나중에 몇 시간의 정신 건강과 맞바꿀 가치가 있습니다. 또한 help 호출이 두 가지 추가 항목인 dict와 weekref를 표시하는 것을 주목하세요. 이것들은 다음 클래스 비디오에서 논의할 겁니다.

 

(07:57) user 클래스에 사용자의 나이를 년 단위로 반환하는 또 다른 메서드를 추가해 봅시다. init 메서드처럼, 첫 번째 인자는 self입니다. 그리고 우리의 책임감 있는 본성을 보여주기 위해, 간단한 독스트링을 추가하세요. 우리는 사용자의 생일을 사용해 나이를 계산할 것이므로, 이 메서드는 추가적인 매개변수가 필요하지 않습니다.

 

(08:16) 날짜를 다룰 것이기 때문에 datetime 모듈을 가져와야 합니다. 먼저 오늘 날짜를 가져옵시다. 이 코드를 테스트하는 모든 사람이 같은 답을 얻도록 오늘은 2001년 5월 12일이라고 가정하겠습니다. 다음으로, 생일 문자열을 date 객체로 변환합시다.

 

(08:36) 이것을 한 줄로 하는 방법이 있지만, 명확성을 위해 더 직접적인 방법을 사용하겠습니다. 이 예제에서, 우리는 생일이 '연-월-일' 형식의 문자열이라고 가정했습니다. 이 문자열에서, 우리는 년, 월, 일을 정수로 추출할 수 있습니다. 이 세 정수로, 사용자의 생일에 대한 date 객체를 만들 수 있습니다.

 

(08:56) 오늘과 생일 사이의 차이를 계산하면, timedelta 객체를 얻습니다. timedelta 객체에는 days라는 필드가 있습니다. 윤년을 무시하고, 이제 365로 나누어 나이를 년 단위로 계산할 수 있습니다. 마지막으로, 나이를 정수로 반환합니다. 이 메서드를 테스트하기 위해, 사용자를 다시 한번 만듭니다. 그런 다음 age 메서드를 호출하고, 결과를 출력합니다. 30살이네요.

 

(09:19) age 메서드를 호출할 때 self를 입력하지 않은 것을 주목하세요. self 키워드는 메서드를 작성할 때만 사용됩니다. 참고로, help 함수를 다시 한번 호출하면, 이제 요약에 age 메서드에 대한 설명이 포함된 것을 볼 수 있습니다. 클래스: 강력한 장치입니다. 클래스는 데이터(우리가 '필드'라고 부르는 것)와 관련된 함수(우리가 '메서드'라고 부르는 것)를 그룹화하여 많은 객체(우리가 '인스턴스'라고 부르는 것)를 만들기 위한 일종의 공장으로 만들어 줍니다.

 

(09:48) 소크라티카(Socratica)는 고품질 비디오의 인스턴스를 만드는 클래스와 다소 비슷합니다. 누가 우리 비디오를 보는지는 유튜브 알고리즘이라는 신비한 블랙박스에 의해 결정됩니다. 유튜브 알고리즘에게 우리 비디오가 볼 가치가 있다고 알리는 가장 좋은 방법은 참여하는 것입니다.

 

(10:07) 프렌드페이스에 있는 누군가에게 우리 비디오가 존재하고, 그 자체로 뛰어나다(in a class by itself)고 말해주세요.

728x90
반응형