Skip to content
This repository was archived by the owner on Jul 4, 2020. It is now read-only.

Latest commit

 

History

History
162 lines (116 loc) · 4.69 KB

5.md

File metadata and controls

162 lines (116 loc) · 4.69 KB

2019-02-25

오늘은 우리의 브롤스타즈 플레이어들을 클랜에 가입시켜보도록 하겠습니다. 브롤스타즈의 각 클랜에는 가입을 할 수 있는 최소 점수(트로피)가 있다고 합니다. 플레이어가 이 점수를 넘지 못하면 클랜에 가입하지 못하는 거죠.

이제 저희는 두 개의 정보를 관리하게 되었습니다. 이름, 그리고 트로피죠. 그런데 이걸 따로 따로 관리하다보면 플레이어의 이름과 트로피를 서로 매칭하기가 어려워집니다.

그런데 어차피 이 둘은 한 플레이어의 속성입니다. 그래서 이 정보들을 하나로 묶어줄수 있다면 좋을것 같습니다. 아래처럼요.

플레이어

  • 이름
  • 트로피

글로 이렇게 쉽게 표현할 수 있는데 파이썬에서는 어떨까요?

당연히 가능합니다!

클래스

그 방법은 바로 클래스를 이용하는 겁니다.

클래스는 우리 말로는 1학년 1반 할 때 그 반이라는 뜻입니다. 같은 반 친구들은 서로 친하고 항상 같이 다니죠? (그렇다고 치겠습니다...) 파이썬의 클래스도 이와 같이 서로 함께 다녀야 하는 정보들을 하나의 정보로 묶어줍니다.

문자열, 숫자, 논리값이 기본 데이터형이라면, 클래스는 복합 데이터형이죠.

파이썬에서 플레이어라는 클래스가 이름과 트로피라는 정보를 가지게 하려면 아래처럼 하면 됩니다.

class Player:
	Name = ""
	Trophy = 0

글로 써 본 것과 거의 비슷하지 않나요?

이렇게 하면 파이썬이 플레이어라는 데이터의 구조를 기억하고 있다가 나중에 실행할 때 이 구조대로 데이터를 생성해줍니다. 일종의 설계도죠.

클래스를 이용해 실제 데이터를 생성하려면 아래처럼 합니다.

p = Player()

그런데 p를 출력해보았더니 뭔가 어려운 글이 등장합니다.

print(p)
<__main__.Player object at 0x7fb9c93de898>

이게 뭔지 알려면 파이썬과 프로그래밍에 더 익숙해져야 합니다. 일단은 이렇게 출력되면 아, 클래스를 잘 생성했구나라고 생각하시면 됩니다.

그렇다면 이 플레이어가 어떤 플레이어인지 알려면 어떻게 해야 할까요? 플레이어의 속성을 검사해보면 됩니다. Player 데이터는 Name과 Trophy라는 속성을 가지고 있죠.

print(p.Name)
# (비어 있음)
print(p.Trophy)
# 0

이 값들은 클래스를 선언할 때 넣어준 것입니다.

그러면 "brollgood"라는 이름의 플레이어가 50개의 트로피를 가지고 있다라는 걸 표현하려면 어떻게 할까요?

... 직접 집어넣어야 됩니다. 네, 멋진 코드는 아니지만 괜찮습니다.

p = Player()
p.Name = "brollgood"
p.Trophy = 50

이런식으로 한번 세명의 플레이어를 생성해보겠습니다.

p1 = Player()
p1.Name = "brollgood"
p1.Trophy = 50

p2 = Player()
p2.Name = "MawhangJ2"
p2.Trophy = 100

p3 = Player()
p3.Name = "born2kill"
p3.Trophy = 250

이렇게 클랜에 가입하고 싶은 플레이어를 한데 묶어 players라는 이름을 주겠습니다.

players = [p1, p2, p3]

플레이어들을 확인하려면 for문과 print를 이용하면 되겠죠.

for i in players:
	print(i.Name)
	print(i.Trophy)

클랜에서 플레이어를 받는 최소 트로피의 기준이 100개 일 때 클랜원이 될 수 있는 플레이어를 검사하는 방법은 다음과 같습니다.

clan = []
if p1.Trophy >= 100:
	clan.append(p1)
print(clan[0].Name)
# p2, p3도 비교

이러면 p1이 100을 넘지 않기 때문에 에러가 나죠!!!

당연히 저희는 이렇게 하나씩 비교하지 않을 겁니다. 더 똑똑한 방법이 있죠. for문을 떠올리셨나요? 점점 익숙해지고 계실거라 생각합니다.

clan = []
for p in players:
	if p.Trophy >= 100:
		clan.append(p)

# 받아들여진 클랜원들 출력
for p in clan:
	print(p.Name)

오늘은 여기까지만 하겠습니다. 클래스에 익숙해지는데까지는 시간이 걸릴겁니다. 만일 쉽게 느껴지셨다면 그건 순수하게 제 설명이 좋기 때문... 여기서는 클래스의 제일 중요한 역할이 서로 연관된 데이터를 한데 묶어주는 거라는 것만 기억하시면 됩니다.

오늘의 퀴즈

제가 플레이어 클래스를 만들때 쓴 코드 기억하시나요?

p = Player()
p.Name = "brollgood"
p.Trophy = 50

이 코드는 잘 동작하긴 하지만 매번 플레이어를 생성할 때마다 이렇게 세줄씩 써야한다면 조금 피곤할 것 같습니다.

이렇게 NewPlayer 함수를 만들어 한 줄로 줄여보세요.

p = NewPlayer("brollgood", 50)