이 블로그 포스트는 새로운 프로그래밍과 oop class 상속/캡슐화/다형성 그리고 다른 컴퓨터 과학 관점에 대해서 들어 왔지만, 여전히 oop를 어떻게 쓰는지 정확하게 알지 못한다. 이 포스트에서는 왜 oop를 쓰는지 그리고 어떻게 쉽게 코딩을 할것인지에 대해서 설명을 할것이다.
이 포스트는 파이썬3를 사용하지만 그 컨셉은 어떤 프로그래밍언어에도 적용이 가능하다.
바로 이해할 수 있는 두개의 non-oop의 키워드가있다.
1. 코드를 복사 하는건 안좋은 것이다.
2. 코드는 항상 가변적이다.
싱글 태스크와 한번만 돌아가는 간단한 쓰고 버릴 프로그램을 제외 하면, 너는 계속 해서 업데이트가 필요할 것이다 너의 코드의 버그를 고치큰 새로운 기능을 추가 하든. 좋은 소프트웨어의 가장 큰부분중 하나는 가독성있고 변경하기 쉽게 작성한 소프트웨어 이다.
만약 당신의 프로그램에 코드를 복사/붙여넣기를 하면, 변경 하면서 그것은 당신의 프로그램의 다른 부분에서도 변경을 요구할 것이다. 이것은 문제가 있다. 만약 당신이 적용하는것을 실수 했다면, 당신은 모든곳 또는 일부분의 기능이 변덕스럽게 되어 버그를 고치는데 실패할 것이다. 복사 코드는 나쁜것이다. 당신의 프로그램에서 코드를 복사하는 것은 니 스스로 버그와 두통을 유발할 것이다.
함수는 코드복사를 없애준다. 당신이 함수안에 코드를 한번 작성하고, 당신의 프로그램에서 필요한 코드가 작동하는 곳 어디에서든지 함수를 불러 내면 된다. 함수 코드를 업데이트하면 어디에있는 함수든 업데이트하는 것이 자동으로 된다. 한수가 코드 업데이트를 쉽게 만든것 처럼, oop 기법을 하용하는 것은 또한 더의 코드를 변경하기 쉽게 조합한다. 그리고 코드는 항상 변경되어진다.
롤플레잉 게임 예
대부분의 객체지향프로그래밍 튜토리얼은 고양하다. 그들은 honk 메소드와 다른 예를가진 car 클래스를 가지는데 그것들은 프로그램을 작성하는 새로운 코더와 이전에 사용 해왔던 프로그램에 전혀 현실적이지 않은 예이다. 그래서 이 블로그는 RPG-style video gaem을 이용할 것이다. 우리는 정수형과 문자열의 모을을 게임안의 것들로 생각하는데 익숙 하다. 많은 사람들은 디아블로와 던전에드래곤을 알것이다.
rpg게임으로 부터 그래픽을 벗겨보면 그 캐릭터,무기 그리고 다른 오브젝트 들은 단순한 변수값안에 정수와 문자열의 묶음이다. 객체지향의 컨셉을 사용하지 않고 이 요소들을 파이썬 코드로 작성하면 이와같다.
name = 'Elsa' health = 50 magicPoints = 80 inventory = {'gold': 40, 'healing potion': 2, 'key': 1}
print('The hero %s has %s health.' % (name, health)) |
이 위에 변수의 이름은 매우 포괄적이다. 이 프로그램에 몬스터를 추가 할때, 당신은 플레이어 캐릭터 변수의 이름을 재정의하고 몬스터를 위해 새로 만들어야 한다.
heroName = 'Elsa' heroHealth = 50 heroMagicPoints = 80 heroInventory = {'gold': 40, 'healing potion': 2, 'key': 1} monsterName = 'Goblin' monsterHealth = 20 monsterMagicPoints = 0 monsterInventory = {'gold': 12, 'dagger': 1}
print('The hero %s has %s health.' % (heroName, heroHealth)) |
그러나 물론 당신은 몬스터를 하나이상을 추가 하기를 원할 것이다. 하지만 그때 당신은 monsterName과 heroName 와 같은 변수를 가지고 있다. 그런경우 그것을 매우 바보같은 코드로 아마 당신은 몬스터변수를 list로 만들것이다.
monsterName = ['Goblin', 'Dragon', 'Goblin'] monsterHealth = [20, 300, 18] monsterMagicPoints = [0, 200, 0] monsterInventory = [{'gold': 12, 'dagger': 1}, {'gold': 890, 'magic amulet': 1}, {'gold': 15, 'dagger': 1}] |
그때 당신은 고블린의 스탯은 list 0번 인덱스에 , 드래곤의 스탯은 list 1번 인덱스에, 그리고 아들 고블린들의 스탯을 list 3번 인덱스에 가질수 있다. 이 방법은 다양한 종류의 몬스터들을 그 변수 안에 담을 수 있다.
그러나 이 방법은 쉽게 버그를 야기 한다. 만약 당신의 리스트가 동기화되지 않으면, 그 프로그램은 더이상 옳은 일을 하지 않게 된다.