“파이썬은 객체 지향적 프로그래밍 언어입니다. 파이썬의 모든 것은 오브젝트입니다. 문자열, 리스트, 함수, 심지어 모듈 또한 오브젝트입니다…”라고 하는 얘기는 귀가 아프도록 들으셨을 겁니다. 그런데 도데체 오브젝트가 무엇일까요? 오브젝트란 속성과 같은 여러가지의 데이터와 함수(오브젝트 안에서는 메소드라고 부릅니다.)를 포함한 하나의 데이터 구조를 말합니다. 또한 파이썬에서 이 오브젝트들은 변수에 할당될 수도 있고, 함수의 인자로 전달될 수도 있는 퍼스트 클래스 오브젝트입니다. 퍼스트 클래스 오브젝트에 대해서는 이전 강좌인 퍼스트클래스 함수를 참고하여 주십시오.
오브젝트란?
오브젝트란 데이터를 조금 더 쉽게 다루기 위해서 “네임스페이스”라는 것을 이용하여 만든 논리적인 집합입니다. 학교에서 학생들을 관리하기 위해서 학년을 나누고 반을 나누는 것처럼요. 파이썬 사전을 만드는 것과 클래스와 모듈로 데이터 집합을 만드는 것 모두 데이터를 손쉽게 저장, 변경 또는 엑세스 할 수 있도록 오브젝트를 만드는 것 입니다.
네임스페이스에 대해서는 모듈을 다룰 때 자세히 설명 드리겠습니다.
다음의 코드는 형식만 다를뿐 모두 논리적인 데이터 집합인 오브젝트를 만들어 필요한 데이터에 엑세스하는 방법을 보여주고 있습니다.
원하시는 디렉터리에 oop_2.py라는 이름의 파이썬 파일을 만들고 다음의 코드를 저장하여 주십시오.
사전을 사용하는 경우
터미널이나 커맨드창을 여시고 oop_2.py가 저장된 디렉터리로 이동하신 후, 프로그램을 실행하여 주십시오.
클래스를 사용하는 경우
모듈을 사용하는 경우
같은 폴더안에 student.py 파일을 하나 만든 후 아래 코드를 입력합니다.
위의 세가지 예 모두 형식과 방법이 조금 다를뿐 오브젝트라는 논리적 집합을 사용하여 똑같은 데이터를 출력하는 것을 알 수 있습니다.
그럼 이번에는 파이썬의 모든 것들이 정말 오브젝트인지 그리고 그 오브젝트 안에는 뭐가 있는지 확인해 볼까요? 먼저 문자열이 정말 오브젝트인지 확인해 보죠.
기억하세요~!
dir()는 파이썬의 표준 내장 함수입니다. 이 함수는 인자가 없을 경우에는 모듈 레벨의 지역변수를, 인자가 있을 경우에는 인자(오브젝트)의 모든 속성과 메소드를 보여줍니다. 이 함수는 디버깅을 할 때 아주 많이 쓰이는 중요한 함수입니다.
text라는 변수에 “string”이라는 6 글자만 할당하였을 뿐인데 뭐가 이렇게 많이 출력 되나요?!?
그 이유는 이렇습니다. text는 str이라는 데이터타입이 만들어낸 오브젝트이며 str 데이터타입에 정의된 모든 속성과 메소드를 상속 받았기 때문입니다.
정말 함수도 많은 속성을 가지고 있다는 것과 임의로 속성을 추가할 수도 있다는 것까지 확인하였습니다.
이제 어느정도 감을 잡으셨으면 클래스를 사용하여 새로운 데이터타입을 만들고 그 데이터타입의 인스턴스 오브젝트를 만들어 보죠.
회사에서 직원들의 인사 데이터를 관리하기 위한 클래스를 만들어 보겠습니다.
Employee라는 클래스를 정의하고 emp_1, emp_2라는 인스턴스를 만들었습니다. 그리고 id()함수를 이용하여 emp_1과 emp_2가 다른 메모리 주소값을 가진 별개의 오브젝트라는 것을 확인하였습니다. 그리고 둘다 같은 클래스의 인스턴스라는 것도 확인하였습니다.
이번에는 emp_1, emp_2 인스턴스에 변수를 추가하여 데이터를 저장해 보겠습니다.
인스턴스에 데이터를 저장하고 엑세스해 보았습니다. 그런데 위의 코드는 잘 못된 코드입니다. 위의 코드처럼 인스턴스 변수를 하나 하나 수동으로 할당하면 클래스를 사용하는 의미가 없습니다. init 메소드를 사용하여 인스턴스를 생성할 때 필요한 데이터를 할당하겠습니다.
노트
init 메소드는 “이니셜라이져”라고도 부르고 다른 언어에서는 “컨스트럭터”라고도 부릅니다. 이 메소드는 인스턴스가 생성될때 자동으로 호출되며 호출되는 순간 자동으로 인스턴스 오브젝트를 self라는 인자로 받습니다. 그리고 이 이니셜라이져를 사용해서 인스턴스 생성시에 여러가지 데이터를 인자로 전달하여 오브젝트안에 초기 데이터로서 저장할 수가 있습니다.
처음 클래스를 사용하는 사람들이 아주 많이 하는 실수가 있습니다. 그게 뭐냐면, 메소드를 정의할 때 self 인수를 잊어버리는 것입니다. 그럼 어떻게 될까요? 한번 보죠.
옹… 파이썬 인터프레터가 뭔가 알 수 없는 얘기를 하는데 무슨 뜻일까요?
full_name 메소드는 인자를 안 받는데 왜 1 개를 줬냐고하네요. emp_1.full_name() 이렇게 아무런 인자 없이 호출을 했는데 말이죠. 뭘까요?!? 그건 위에서도 설명했듯이 인스턴스의 메소드를 호출하면 인스턴스 자기 자신인 self가 첫번째 인자로 자동 전달되기 때문입니다. 다음 예제를 보시면 조금 이해가 쉬울 겁니다.
마지막행의 코드를 보시면 클래스를 통해서 메소드를 실행하였는데, 이런 경우에는 클래스는 어떤 인스턴스의 메소드를 호출해야 하는지 모르기 때문에 대상이 될 인스턴스를 인자로 전달해야 합니다. 사실 emp_1.full_name()를 실행하면 백그라운드에서는 Employee.full_name(emp_1)가 실행되는 것입니다.
이번 강좌는 여기서 마치고 다음 강좌에서 “클래스 변수”를 공부하며 클래스와 인스턴스의 차이점에 대해서 더 공부해 보겠습니다.