많아지는 변수와 함수들신조어 중 클라스 라는 말이 종종 등장하죠. 격이 다르다, 차원이 다르다 라는 의미로 "크~ 클라스 오지구연"이라고 내뱉곤 합니다. 여기서의 클라스는 우리가 지금부터 이야기하려는 클래스가 맞습니다. 교실의 classroom까지 떠올릴 필요는 없습니다. ? Show
어찌 되었건 우리는 클래스라는 새로운 개념을 배울 예정입니다. 본격적으로 배우기 전에 클래스가 왜 필요한지 가상의 예시를 통해 천천히 알아가보죠.
위 상황을 파이썬 코드로 만들어봅시다. 실제로 싸우는 상황도 코드로 묘사하여 봅시다.
간단한 로직인 것 같으면서도 생각보다 긴 코드가 만들어졌습니다. 자 첫번째 몬스터 구상을 완성했군요. 하지만 게임에는 몬스터가 단 한마리만 등장하는 법은 없죠. 3마리까지 추가한다고 칩시다. 같은 변수명을 쓰면 겹치게 되니 변수명 뒤에 숫자를 붙여서 몬스터를 구분할 수 있도록 해요. 예감이 되시나요? 코드가 아주 길어질 게 분명합니다.. 일단 해 봅시다.
핫하.. 귀찮아서 필살기를 써서 모든 몬스터를 죽여버렸습니다. 어찌어찌 해결이 되었나요? 근데 단 3개의 몬스터를 만드는데도 60줄 가까이 코드를 작성했습니다. 하지만 몬스터가 10마리가 필요하다면? 그 뿐만 아니라 몬스터에게 이름이 주어질 수도 있고, 방어력이 생길 수도 있습니다. 어쩌면 몬스터가 마법을 쓸 수도 있죠! 골치가 아파집니다. 모든 몬스터에게 일일히 변수와 함수를 추가할 생각을 하니 머리가 지끈거리지 않나요? 클래스 등장이제 클래스가 등장합니다. 예시를 우선 봅시다. ##1## 등의 번호를 누르면 해당 설명으로 곧장 이동합니다.
천천히 하나하나 설명할게요. a_1(1.) 클래스 정의
a_2(2.) 생성자 정의
메소드를 정의하는 방법은 함수와 완전히 동일하나, 첫번째 인수를 무조건
클래스를 정의할 때 a_3(3.) 속성 초기화
우리가 변수를 정의할 때 단지 대입문을 통하여 정의했던 것과 마찬가지로 속성 정의도 대입문으로 진행됩니다. 간단하게 a_4(4.) 인수가 없는 일반 메소드 정의
a_5(5.) 속성 접근
a_6(6.) 인수가 있는 일반 메소드 정의
a_7(7.) 객체 생성
우리가 클래스를 만들었다고 해서 곧바로 클래스의 기능을 쓸 수 있는 것은 아닙니다. 클래스를 정의해놓고, 그 클래스를 이용해서 객체를 만들어야 비로소 클래스가 가지고 있는 메소드와 속성을 이용할 수 있습니다. 클래스는 일종의 틀 입니다. 틀을 통해 객체를 생성해내는 것이지요. (우리가 함수를 일단 정의해놓고 나중에 쓰고 싶을 때 함수를 호출하는 것과 비슷한 원리입니다.)
앞서 생성자를 정의할 때
a_8(8.) 메소드 호출
a_9(9.) 한 번에 메소드 접근
몬스터들은 모두
같은
결과는 동일합니다.
패러다임 분리클래스의 장점은 명확합니다. 똑같이
동작하는 부분과 다르게 동작하는 부분을 명확하게 분리시켜서 코드 작성을 훨씬 손쉽게 할 수 있습니다. 위
냉혹한 프로그래밍의 세계에서는, 중복으로 코딩하는 것을 손쉽게 허용하지 않습니다. 작성할 때의 귀찮음도 크겠지만, 무엇보다도 수정해야 할 사항이 있을 때 일일히 변경해야 한다는 게 너무 번거롭기 때문입니다. 클래스의 장점이 조금은 이해가 되셨나요? 이제 용어를 정리할 시간입니다. 위 예제를 설명하면서 수많은 용어가 등장했습니다. 꼭 기억해요!
용어 정리를 간단하게 했습니다. 이 정도면 간단한 겁니다. ? 이제 다시 위의 몬스터 예제를 읽어내려서 이해가 가지 않는 지점이 혹시나 있는지 체크해 주세요. 이해가 다 되었다면 다음으로 진행해주시기 바랍니다.
개념 추가 정리핵심 개념과 더불어서, 파이썬에서 클래스를 사용할 때의 유의점과 참고할 만한 사항을 정리합니다. 선 요약하면 다음과 같습니다.
클래스의 이름은 대문자로, 메소드와 속성의 이름은 소문자로 시작하도록 합니다.스타일에 관한 내용입니다. 개발자 조상님들은 대대로 클래스 명에는 대문자로, 메소드와 속성 명에는 소문자로 시작하도록 해왔습니다. 유명한 파이썬 모듈도 모두 그렇게 해왔습니다. 프로그래머간의 약속입니다.
우리가 알 수 있는 정보는 극히 적습니다. 또 다른 예제를 봅시다. 이름 모를 나그네가 소리소문없이 코드만 쓰고 떠나갔습니다.
함수 정의 앞에 간단하게 주석으로 코드 작성에서 ‘다른 사람’이라 함은 과거의 나, 미래의 나가 될 수 있다는 사실을 항상 유념해주세요. 옛날에 쓴 코드를 왜 이렇게 썼는지 현재의 내가 이해할 수 없을 수도 있고, 현재의 내가 당연하게 썼던 코드를 미래의 내가 왜 이렇게 썼는지 도무지 이해할 수 없을 수도 있습니다. 상식을 고수하는 건 스스로에게도 좋습니다. 생성자를 정의했다면 거기에 맞춰 객체를 생성해야 합니다.
에러가 발생합니다. 생성자가 1개의 인수를 필요로 하지만 위 예제에서는 생성자에 아무런 인수도 넘겨주지 않아 에러가 발생했습니다.
클래스는 동일하고 이번에는 인수를 2개 넘겨주었는데요, 마찬가지로 개수가 맞지 않아 에러가 발생했습니다. 메소드와 속성은 이름 중복이 허용되지 않습니다.
인터페이스가 같다 라는 말은 파이썬에서는 쉽게 얘기하여 서로 다른 객체가 이름이 같고 기능이 비슷한 메소드를 가지고 있다라고 말할 수 있습니다.간단히 예제를 보고 설명합시다.
한번 더 강조하지만 세 개의 클래스들은 완전히 독립된 클래스입니다. 피가 하나도 섞이지 않은 완전 남이나 마찬가지인 클래스들이죠. 하지만 이 클래스를 이용하는 방법은 우연찮게 같았습니다. 이러한 상황 속에서 우리는 두 가지 새삼스러운 사실을 다시 한번 확인할 수 있습니다. 첫째, 서로 다른 객체가 이름이 같고 기능이 비슷한 메소드를 가지고 있다면 이 객체를 사용하는 방법은 동일하다는 점입니다. 아까 전에 이를 인터페이스가 같다 고 이야기하였죠. 반대로 이야기하면 둘째, 인터페이스가 같다고 판단하는 것은 또 다른 차원의 문제라는 점입니다. 위 코드에서는 단순히
결과는 다음과 같습니다.
이러한 문제를 해결하고자 하는 두 가지 접근법이
있습니다. 하나는 파이썬의 세계에서 모든 변수는 객체 입니다.이것은 좀 충격적인 사실입니다. 파이썬에서는
결과가 나왔습니다. 죄다 자주 쓰는 이것이 시사하는 바는 도대체 무엇일까요? 그것은 바로 변수들을 객체로서 설명 가능하다는 사실입니다. 클래스가 같은 객체나 값은 결국 같은 용도의 메소드와 속성을 가지고 있으며, 오직 다른 것은 속성에 존재하는 값임을 알 수 있습니다. 또한 객체의 일반적인 성질을 이용할 수 있다는 것인데요, 이는 다음과 같습니다.
즉, 어떤 클래스를 정의해 놓았다 해도 특정 메소드를 프로그램 실행 도중에 추가하거나 삭제할 수도 있으며, 리스트나 딕셔너리에 메소드를 직접 저장할 수도 있는 등 무궁무진한 활용법을 기대해볼 수 있다는 것이죠. 심지어 메소드의 인수나 반환 값으로 함수를 받을 수도 있구요. 함수가 값이다? 무슨 말인지 알쏭달쏭할 것 같습니다. 이러한 활용법은 꽤 고급 활용법에 해당하므로 직접 구현할 일은 앞으로도 없을 수 있지만, 실제 유용한 모듈이나 라이브러리가 이러한 객체적 특성을 이용하여 편리한 기능을 제공하고 있다는 사실을 알고 있어야 제대로 된 활용을 할 수 있을 것입니다. 더 나아가기
연습 문제
프로그래밍 문제
프로그래밍 문제 정답
|