[ 파이썬 언어 공부 ] 중복 가능한 랜덤 그룹 구성 - 클래스 활용 - Whitmem
[ 파이썬 언어 공부 ] 중복 가능한 랜덤 그룹 구성 - 클래스 활용
Python Programming
2023-07-04 06:46 게시 65afc3a06f59d9b7e40e

1
0
162
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
개요
이 게시물은 파이썬 언어에서 클래스의 활용 방법 및 이해를 돕기 위해 작성한 것 입니다. 랜덤으로 사용자를 뽑기 위한 클래스를 선언하고 어떻게 사용하는지에 대해 개인의 생각을 첨가하여 구성하였습니다.
사전 구성
어떤 집합에 대해 원소끼리 짝을 지어 그룹을 형성하기 위해서는 임의 개수만큼 데이터를 뽑은 뒤 기존 집합에서 제거하면 됩니다. 더 이상 뽑을 수 없을 때 까지 이 작업을 반복하면 랜덤 그룹을 구성할 수 있게 됩니다.
예를 들어, 6개의 원소를 가지고 있는 집합이 존재한다고 가정하겠습니다.
리스트
이 리스트가 가지고 있는 원소의 개수는 6개 입니다. 즉 이 리스트는 [0] 인덱스부터 [5] 인덱스까지 접근할 수 있는 상황이며, 2개를 뽑고자 하는 경우 이 범위 인덱스에서 순차적으로 2개 꺼내면 됩니다.
A를 꺼냈다.
예를 들어 A를 랜덤으로 꺼내면, 기존 집합에는 원소 5개 BCDEF [0]~[4] 번 인덱스만 남습니다. 여기서 다시 하나 뽑아줍니다.
D도 꺼냈다.
꺼내진 데이터는 새로운 그룹으로 구성하여 result에 append 해 주고, 기존 리스트에서는 뽑은 데이터를 필히 제거해야 합니다. 이러한 과정을 반복하는 방법을 통해 그룹에서 데이터를 모두 뽑을 수 있습니다. 이를 소스코드로 나타내면 다음과 같습니다.
groups=[] while len(clone): smallGroup=[] for i in range(userCount): if(len(clone)==0): break selectedIndex = random.randrange(0,len(clone)) item = clone.pop(selectedIndex) smallGroup.append(item) groups.append(smallGroup)
뽑는 횟수 userCount만큼 원소를 랜덤으로 꺼내면서 그와 동시에 기존 집합clone에서 뽑은 원소는 제거합니다. 2개의 데이터가 뽑아지면 groups에 등록하고, 개수가 부족할 때 까지 무한 반복합니다.
클래스화
랜덤으로 사용자를 뽑는 기능을 만들었고, 여러분들이 패키지로 만들어서 다른 개발자에게 배포한다고 가정 해 봅시다. 사용하는 입장에서는 이 소스코드를 그대로 다시 작성하기엔 좋지 않아보입니다.
그럴 땐 클래스로 묶어서 기능을 구현할 수 있습니다. 클래스는 어떤 하나의 주제에 대한 기능을 모아둔 설계도이라고 볼 수 있으며, 여기서는 랜덤 그룹 뽑기를 처리 해주는 클래스를 정의해야 합니다.
랜덤 뽑기를 하기 위해서는 랜덤 뽑기 대상이 될 사용자를 추가하거나 제거할 수 있으며, 이 사용자들을 바탕으로 랜덤 그룹 뽑기를 진행할 수 있습니다. 이러한 코드들을 정의하면 아래와 같습니다.
import random class RandomGroup(): __slots__ = ['__users'] #생성자 : 주요 구성 요소를 초기화 합니다. def __init__(self): self.__users=[] #사용자 추가 : 랜덤 뽑기 사용자를 추가 합니다. def addUser(self,userName): self.__users.append(userName) #사용자 추가 : 랜덤 뽑기 사용자를 리스트로 받아 추가합니다. def addUserByArgs(self,*userName): for x in userName: self.__users.append(x) #사용자 제거 : 대상 사용자를 제거합니다. def delUser(self,userName): self.__users.remove(userName) #사용자 가져오기 : 사용자 리스트를 반환합니다. def getUsers(self): return self.__users def getRandomUser(self): return self.__users[random.randrange(0,len(self.__users))] #랜덤 뽑기를 빌드 합니다. #userCount는 몇 명씩 묶을 것인지에 대한 파라메터입니다. def build(self, userCount): clone = self.getUsers().copy() groups=[] while len(clone): smallGroup=[] for i in range(userCount): if(len(clone)==0): break selectedIndex = random.randrange(0,len(clone)) item = clone.pop(selectedIndex) smallGroup.append(item) groups.append(smallGroup) return groups
클래스 정의 및 사용자 추가 제거
위 사진 소스코드를 보면, 기본적인 클래스의 정의사용자 추가, 제거를 정의하고 있습니다. 어떤 다른 개발자가 이 클래스를 인스턴스화 했을 때, 이 클래스에 그룹을 형성할 사용자들을 추가할 수 있는 메서드, 그리고 다시 제거 할 수 있는 메서드 수단을 만들어 둔 것 입니다.
이 클래스를 인스턴스화 하면 먼저 __init__이 자동으로 호출될 것이고, 인스턴스화 된 객체 안에 __users라는 리스트를 내부 공간에 만듭니다. 이 리스트는 처음에는 무조건 비어있습니다. 그렇기 때문에 이 클래스를 인스턴스화 해 사용하는 입장에서 사용자를 추가해야 합니다.
사용자 추가
랜덤뽑기 인스턴스에 사용자를 추가 요청함으로써 내부의 데이터에 간접적으로 접근할 수 있게 되고, 추가 과정은 내부 클래스에서 알아서 처리되므로 이 클래스 인스턴스를 사용하는 입장에서는 내부 구조를 파악할 필요전혀 없습니다.
그러면 이제 아까 만들었던 랜덤 뽑기 함수를 클래스 안에 정의 합니다. 리스트를 전달 받을 필요 없이 자기 자신의 클래스 인스턴스 내에 사용자 리스트를 입력 받았으므로, 그 데이터를 그대로 받아서 처리하면 되는 것 입니다.
자기 자신의 인스턴스에 존재하는 유저 목록을 가져온다.
위 사진을 보면 알 수 있듯 별개 파라메터로 리스트를 전달 받지 아니하고, 클래스 내부에 존재하는 인스턴스 자기 자신의 리스트self.getUsers()로 가져와서 처리함으로써 다른 외부 데이터에 의존하지 않습니다.
클래스 사용
클래스를 사용하는 입장에서, 단순히 인스턴스만 만들어주고, 그 인스턴스에 데이터를 직접 넣어 요청을 하면 알아서 처리 결과를 내 뱉어줍니다. 즉 각각의 인스턴스는 개별적이며 서로 영향을 끼치지 않습니다. 다양한 인스턴스를 관리하고 사용할 때 유용합니다.
랜덤 뽑기 이용
또한 클래스를 사용하는 입장에서는 addUser()build() 메서드만 알고 있으면 됩니다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.