Python

파이썬을 배워보자! {클래스와 객체(1)}

25G 2021. 4. 10. 20:34

네 넨! 안녕하세요 접니다. 오늘 참지 못하고 치킨을 시켜버렸습니다 ㅎㅎㅎㅎ 너무 행복하네요 치킨을 기다리기 너무 힘든 나머지 이렇게 짬 내서 글을 올리게 됐습니다!! 

여러분~ 이번에 말씀드릴 클래스와 객체를 완벽하게 이해하게된다면!!진짜 프로그래밍을 하는데에 있어서 완전히 새로운 세상이 열린다고 보시면 됩니다!

전 글에서 말씀드린 "함수"이친구와 비슷하지만 완전 격을 달리하는 녀석이거든요!

C언어를 해보신 분들은 잘 아시겠지만 C언어에는 클래스가 없습니다! 클래스가 없이도 프로그래밍을 하는데 큰 문제가 없다는 뜻인데요 맞아요 꼭 클래스를 알고 있지 않아도 프로그래밍을 하실 수 있습니다! 하지만! 여러분께서 만약에 여러분이 만든 프로그램을 서비스를 한다고 상상해 보자고요!

프로그램을 서비스를 하다보면 그 프로그램 소스코드에 대해서 업데이트를 하거나 컴플레인이 걸려서 유지보수를 하게 될 일이 생길 것이라는 것은 조금만 생각해 보시면 알실 수 있을 거예요 

근데 만약에 클래스를 모르신다면 하나의 변수를 고치기위해서 수십 수백 개의 변수를 하나하나 찾아서 변수를 고쳐야 하고 수백 줄의 소스코드를 눈 아프게 하나하나 찾아가며 변수를 수정한다 하더라도!! 만약에 컴파일 오류라도 나버리면 어후,,, 너무 끔찍하지 않나요?ㅜㅜ 그러면 그냥 밤을 새우는 정도가 아니라 그냥 다 놓아버리고 싶을 정도의 절망감을 선사할지도 모릅니다

위와 같은 상황... 생각만 해도 끔찍하죠? 그래서 이번에 말씀드릴 "클래스"라는 문법도 어떤시각에서보면 함수와 비슷한 계념을 지녔지만 훨씬 더 큰 공통점과 특징을 아우르는 하나의 기능들의 모임

말 그대로 class인 것입니다! 

 

RPG게임을 예로 든다면 그 게임 안에는 전사도 있고 궁수도 있고 마법사도 있겠죠? 그리고 그에 맞서는 몬스터들 그리고 그런 npc들... 이처럼 많은 요소들을 그냥 책처럼 소스코드들을 나열한다면 정말 복잡하고 가독성도 떨어질뿐더러 위에서 말씀드린 것처럼 아주아주 유지보수에 약해져 버립니다! 

여러분이 한번 만들고 땡! 하면 모르겠지만 그 프로그램에 에러가 안난다고 정말 장담할 수 없고 프로그래밍에 100퍼센트는 없기 때문에 유지보수는 필수적인 부분입니다

 

그럼 클래스가 필요한 이유에 대해서는 충분히 설명드린것 같으니 한번 실질적인 것들로 보여드리죠

문법은 아주 간단합니다

 

 

class 클래스명 :

       요소

       기능

 

이게 다예요 함수와 참 닮아있죠? 

 

그럼 제가 작성한 소스코드를 보실까요?

여러분 만약에 마트에 있는 쇼핑카트에 대해서 클래스를 만들어 본다고 생각하고 프로그램을 만들어보면 어떨까요??

카트(클래스)라는 큰 카테고리 안에는 많은 요소들이 담겨 있죠 

카트의 높이, 카트의 바퀴수, 카트의 넓이 등등 카트 하나를 표현하기 위해는 많은 요소들이 필요하고

마트마다 카트의 종류가 바뀌면서 자연스럽게 카트의 요소들 또한 자연스럽게 수정되겠죠? 어떤 마트에 카트는 바퀴가 4개인데 어떤 마트는 3개일 수도 있는 거잖아요 

이처럼 어떠한 큰 카테고리를 만들어 놓고 그 특징되는 요소들에 각각에 다른 개성을 표현할 수 있도록 한다면 정말 가독성도 좋고 보기좋은 프로그램이 만들어질 거라고 생각이 듭니다!

바로 코드 보시죠

여지껏 보여드린 소스코드들 중에는 가장 긴 것 같지만 사실 한줄한줄 보면 참 별것 없습니다

일단 하나 하나 설명하면 이 포스팅이 너무 길어지니 큰 틀만 말씀드리고 그 틀에 자세한 내용은 차차 다루도록 하겠습니다

일단 8번째 줄을 보면 클래스를 선언합니다 클래스명은 cart군요! 그리고 __init__이라고 하는 함수처럼 보이는 녀석이 있고 그 소스코드 뭉치 안에는 변수명을 보면 유추할 수 있듯이 카트의 구성"요소"를 담은것 처럼 보입니다. 

이렇게 클래스의 요소들의 특징을 묶어놓은 것이 "생성자"라고 합니다.

 

"생성자"라는 것은 클래스가 생성되고 호출될 때 자동으로 같이 묶여서 호출되는 역할을 하는 친구 입니다. 

쉽게 말씀드리자면 위에서 말씀드렸듯이 클래스는 하나의 공통된 특징을 가진 무언가를 모아 놓은 것인데 공통된 특징을 매번 선언하는 것보단 생성자라는 아이가 이 클래스의 특징은 무엇이다 라고 알려준다고 생각하시면 좀 더 이해가 잘 되실 것 같아요

카트가 여러가지 있지만 바퀴가 없는 카트가 없고 넓이와 길이는 카트마다 다르겠지만 넓이와 길이가 필요 없는 카트는 없듯이 이러한 큰 틀에 특징들을 묶어놓은 거죠

그리고 이 생성자는 클래스가 호출될 때 같이 호출되는 거고요! 그래야 생성자를 만든 의미가 있겠죠?

 

그리고 생성자 밑으로 20번부터 여러 가지 함수들이 나열되어 있습니다! 함수가 뭐라고 했죠? 하나의 기능을 하는 소스코드들이라고 했습니다.

근데 제가 위에 __init__을 설명할 때 "함수처럼"이라고 한 것은 클래스 안에 선언된 함수는 조금은 다른 개념을 가지고 있기 때문입니다

클래스 안에 있는 함수는 이름부터 다른데요 바로 "메서드"라고 합니다

 

"메서드"는 간단하게 말씀드려 클래스 안에 있는 함수라고 생각하시면 좀 더 편하실 겁니다. 물론 이 말은 처음의 이해를 돕는 말이 다라 고정도만 하겠습니다. 

클래스 안에 있는 함수이니 당연히 클래스의 공통된 특징을 위한 기능을 가진 함수겠죠? 

그래서 위 소스코드를 하나하나 보시면 이해가 되시겠지만 보시면 카트가 그냥 카트의 특징(생성자)만 있다고 끝이 아니죠? 결국은 카트는 물건을 담고 그걸 운반해야 되는 아주 기본적인 기능들이 필요하니까 그런 기능들을 정리해서 메서드로 만들어 놓은 것입니다

 

하... 여러분.. 객체지향이라는 것은 말처럼 추상적이기도 하고 이 객체지향의 개념은 좀 쉬울지 몰라도 이걸 설계하는 과정으로 넘어가게 되면 많은 공부가 필요한 것 같습니다.. 저는 백앤드와 프런트 앤드에 관심이 많은데 곧 jsp로 넘어 가게 됐습니다... 그래서 부랴부랴 관련된 책들을 보며 조금씩 이해도를 올려가고 있습니다

 

오늘 참 많은 말씀을 드렸는데요 ㅠㅠ 여러분도 많이 복잡하실 거라 생각합니다.. 자연스러운 것이라 생각해요 ㅠㅠ 누구나 어려워하는 부분이니 파이팅합시다!!

그럼 너무나도 긴 글 읽어주셔서 감사하고 다음에 봬요!