오늘은 클래스에 대해 자세히 배웠다.
처음 설명을 들었을 때는 모든 내용이 새롭고 개념도 복잡하게 느껴져 잘 따라갈 수 있을지 걱정됐지만, 막상 실습을 통해 직접 사용해보니 정리했던 개념과 코드가 잘 맞아떨어져 의외로 쉽게 적응했다.
OOP : 객체를 기반으로 프로그램을 설계하는 프로그래밍 패러다임
객체 (Object) or 인스턴스 : 데이터와 기능을 하나로 묶은 독립적인 실행 단위
OOP 이전에는 절차적 프로그래밍이 널리 사용되었음
프로그램을 순차적인 절차와 함수로 구성하는 방식으로 코드가 복잡해지고 유지보수가 어려움
__init_ 으로 사용하며, 인스턴스가 생성될 때 호출class ClassName:
def __init__(self, name):
# 인스턴스 변수
# self : 인스턴스 자기 자신을 가리킴
self.name = name
# (인스턴스) 메서드
def method_name(self):
print(self.name)
# 인스턴스의 생성
my_instance = ClassName("내 인스턴스")
my_instance.method_name()
# 내 인스턴스
another_instance = ClassName("다른 인스턴스")
another_instance.method_name()
# 다른 인스턴스
class Dog:
# 클래스 변수
kind = "강아지"
def __init__(self, species, name, age):
self.species = species
self.name = name
self.age = age
dog1 = Dog("포메라니안", "리치", 12)
dog2 = Dog("비숑", "구름", 10)
print("인1", dog1.kind)
print("인2", dog2.kind)
print("클래스", Dog.kind)
# 인1 강아지
# 인2 강아지
# 클래스 강아지
class Book:
book_count = 0
def __init__(self, title, author):
Book.book_count += 1
self.title = title
self.author = author
@classmethod # 데코레이터
def get_count(cls):
print(f"현재 {cls.book_count}권의 책을 가지고 계십니다.")
book1 = Book("제목1", "작가1")
book2 = Book("제목2", "작가2")
Book.get_count()
# 현재 2권의 책을 가지고 계십니다.
class OperationTool:
@staticmethod # 데코레이터
def add(a, b):
return a + b
OperationTool.add(10,20)
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
# getter
def get_age(self):
return self.__age
# setter
def add_age(self):
self.__age += 1
p1 = Person("taehyun", 27)
p1.name = "태현"
p1.name
# '태현'
# 외부에서 private 요소에 접근 시도
p1.__age # 접근시 에러 발생
# 실제로는 내부적으로 네임 맹글링이 이루어져 접근할 수 있지만 권장 X
p1._Person__age # 네임 맹글링, 사용 권장 X
# private 요소를 접근하고 싶으면 getter, setter 를 사용해서 접근
p1.get_age()
p1.add_age()
p1.get_age()
실습이나 문제를 풀다 보면 점점 작성하는 코드의 양이 많아지고 있다.
그 과정에서 코드 하나하나의 의도와 동작 원리를 이해하며 작성하는 내 모습을 보며, 작은 성취감을 느꼈다.
그러면서도 더 열심히 공부해서 복잡한 알고리즘도 수월하게 해결할 수 있을 정도의 실력을 갖추고 싶다는 생각이 들어, 앞으로도 꾸준히 학습하고 문제를 많이 풀어봐야겠다고 다짐했다.