WeniVooks

검색

베이스캠프 파이썬

클래스를 왜 써야 하는가?

1. 클래스를 왜 써야 하는가?

클래스는 처음에는 다소 복잡하고 어렵게 느껴져서 잘 사용하지 않겠다고 생각할 수 있습니다. 하지만 실무에서는 사용 빈도가 매우 높고, 클래스 그 자체의 중요도도 매우 높기 때문에 반드시 익혀야 하는 개념입니다. 다만, 꼭 공부해야 할 개념이라고 하더라도 클래스를 처음 접하는 분들은 필요성에 대해 공감하기가 어려울 수 있습니다. 그래서 클래스를 사용해야 하는 몇 가지 이유에 대해 가장 체감이 되는 것부터 설명해보겠습니다.

1.1. 속도

때로는 기본적으로 제공하는 자료형으로는 해결할 수 없는, 많은 시간이 걸리는 문제를 만나게 됩니다. 이럴 때 클래스를 사용하여 자료의 구조를 다시 설계할 수 있습니다. 사용하는 메서드를 최소화하여 기본 자료구조보다 최적화된 메모리 구조를 가지고, 구조적으로도 빠른 속도를 내도록 구현할 수 있습니다.

이러한 이유로 코딩 테스트에서는 클래스를 구현하여 효율적으로 문제를 풀어야만 가산점을 주는 경우가 있습니다. 이는 정답의 정확도뿐만 아니라 코드의 효율성도 함께 평가하여, 효율적인 자료구조를 만들 수 있는지를 테스트하기 위함입니다.

아래는 기본 자료형인 리스트와 클래스로 구현한 트리 형태의 검색 예시입니다.

리스트에서 인덱스(index)로 값을 찾는 것은 빅오(O(n))입니다. 빅오는 코드에 얼마나 많은 시간이(알고리즘의 시간 복잡도) 걸리는지 나타내는 것으로, 최악의 경우 리스트의 모든 요소를 검색해야 한다는 것을 의미합니다. 예를 들어, 아래 리스트에서 15를 찾는다고 가정했을 때에는 최악의 경우가 발생하게 됩니다.

아래 트리 모양을 클래스로 구현하게 되면 요소의 갯수는 위와 동일하지만 최악의 경우에도 3번 이내에 요소를 모두 찾을 수 있습니다. 왼쪽은 작은 값이며, 오른쪽은 큰 값입니다.

1.2. 재사용성

클래스를 한 번 작성하면, 그 클래스를 기반으로 여러 객체를 만들 수 있습니다. 앞서 가볍게 예를 들었던 게임에서의 등장인물, 웹 서비스에서의 게시판 게시물, 크롤링(웹에서 정보를 가져오는 것)한 책 정보 등 반복적으로 만들어야 하는 여러 객체를 클래스를 사용하여 구조적으로 만들 수 있습니다. 이렇게 클래스를 활용하면 코드의 재사용성이 높아집니다.

1.3. 유지보수

클래스를 사용하면 코드를 구조화하여 작성할 수 있습니다. 코드를 구조화하면 코드를 이해하기 쉬워지고, 코드를 수정하기 쉬워집니다. 코드를 수정하기 쉬워지면 유지보수가 쉬워지고, 유지보수가 쉬워지면 코드의 품질이 높아집니다. 구조화를 강제화 할 수도 있다는 점에서 클래스는 코드의 품질을 높이는 데 큰 역할을 합니다. 딕셔너리는 이러한 구조를 강제화할 수 없습니다.

2. 클래스에 대안은 없는가?

클래스를 처음 접한다면 '리스트나 딕셔너리로 구현할 수 있을 것 같은데, 굳이 새로 만들어야 하는가?'라는 의문이 들 수 있습니다.

기본 자료형으로도 문제없이 사용할 수 있다면 굳이 클래스로 구현하지 않아도 됩니다. 딕셔너리나 클로저가 클래스의 대안이 될 수 있습니다. 아래는 딕셔너리를 사용하여 간단한 캐릭터 정보를 표현한 예시입니다.

hero = { 'name': 'Jun', 'hp': 100, 'mp': 100, 'power': 30, 'drop_rate': 0, 'attack': lambda: f'{hero["power"]}에 파워로 공격하였습니다.', } print(hero['hp']) print(hero['attack']())

이번에는 클로저로 구현한 것을 살펴보도록 하겠습니다. 클로저는 때에 따라서 클래스보다 더욱 어렵게 느껴질 수 있습니다.

def create_chracter(name, hp, mp, power): data = { 'name': name, 'hp': hp, 'mp': mp, 'power': power, } def get_data(key): return data[key] def attack(): return f'{get_data("power")}의 파워로 공격하였습니다.' return {'attack': attack} hero = create_chracter('Jun', 100, 100, 30) print(hero['attack']())

3. 어떻게 공부해야 할까?

실무에서 사용되는 사례를 찾아보고 이런 소스코드를 분석해보거나 직접 구현하여 활용해보시길 권해드립니다. ChatGPT나 Claude와 같은 거대언어모델을 활용하여 실무에서 사용하는 클래스 목록과 셈플 코드를 뽑아보고, 이를 손코딩 해보는 것도 좋은 방법입니다.

다음은 클래스를 사용하는 여러 사례입니다. 앞이 클래스이고, 뒤 이어 나오는 것이 클래스의 인스턴스입니다.

- class Character => Licat(주인공), Lion(빌런), Mob1(몬스터), Mob2(몬스터)
- class Post => 게시물1, 게시물2, 게시물3...
- class Dot => 점1, 점2, 점3...
- class User => 유저1, 유저2, 유저3...
- class Comment => 댓글1, 댓글2, 댓글3...
- class Product => 상품1, 상품2, 상품3...
- class Restaurant => 음식점1, 음식점2, 음식점3...
- class Class\_ => 강의1, 강의2, 강의3...
- class Teacher => 강사1, 강사2, 강사3...
- class Character => Licat(주인공), Lion(빌런), Mob1(몬스터), Mob2(몬스터)
- class Post => 게시물1, 게시물2, 게시물3...
- class Dot => 점1, 점2, 점3...
- class User => 유저1, 유저2, 유저3...
- class Comment => 댓글1, 댓글2, 댓글3...
- class Product => 상품1, 상품2, 상품3...
- class Restaurant => 음식점1, 음식점2, 음식점3...
- class Class\_ => 강의1, 강의2, 강의3...
- class Teacher => 강사1, 강사2, 강사3...

이렇게 어느정도 훈련이 되었다면 작성하고 있는 소스코드에서 의도적으로 클래스를 사용해보는 것이 좋습니다. 딕셔너리로 구현할 수 있는 것이나 리스트로 구현할 수 있는 것도 클래스로 구현해보시길 권해드립니다.

{"packages":["numpy","pandas","matplotlib","lxml"]}
10.1 클래스란10.3 클래스 변수와 인스턴스 변수