KPlay의 코딩 그리고 잡동사니

목차

1. 클래스의 정의

2. 인스턴스의 정의

3. 클래스를 구성하는 멤버와 메소드의 정의

4. 클래스의 생성자

5. 메소드 구현

5. 인스턴스 구현

6. 생성한 인스턴스로 메소드 사용

7. 접근 연산자

8. self 키워드에 관하여

9. 클래스의 소멸자

10. 클래스의 상속(부모와 자식 클래스)

 

 

 

파이썬, JAVA, C++, 코틀린, 기타등등 객체 지향 프로그래밍 언어들의 필수개념 클래스(Class)이다

 

언어마다 클래스 선언 모양이 조금씩 다르긴하지만 개념은 동일하다.

 

클래스는 처음보는 사람입장에서는 알아야 할 것이 많기도하고 낯설기도해서 상당히 난해한 개념이다.

 

많이 사용해보면서 익숙해지는 수 밖에 없다.

 

 

 

 

 

 

 

클래스(Class)란

 

"반복되는 불필요한 소스코드를 최소화 하면서

현실세계의 사물을 컴퓨터 프로그래밍 상에서 쉽게 표현할 수 있도록 해주는 프로그래밍 기술"이다.

 

 

또 클래스로 만들어진 객체(Object)를 '인스턴스'라고 부르는데

 

인스턴스란 "클래스로 정의된 객체를 프로그램 상에서 이용할 수 있게 만든 변수"이다.

 

비유하자면, 자동차 공장에서 자동차를 찍어내는 기계가 클래스일때, 생산되는 자동차들이 인스턴스이다.

 

 

 

 

클래스는 2가지 요소로 이루어져있는데

 

첫번째가 "멤버"이고, 두번째가 "메소드"이다.

 

멤버는 "클래스 내부에 포함되는 변수"이고, 메소드는 "클래스 내부에 포함되는 함수"이다.

 

 

위의 내용을 한마디로 정리하면,

 

래스(Class)란 현실세계의 객체(Object)를 쉽게 표현할 수 있도록 

비슷한 기능(함수)과 필요한 재료(변수)들이 한데 모여있는 하나의 집합이라고 할 수 있다.

 

 

 

이제 클래스를 정의하는데, 간단하게 자동차라를 클래스를 선언해보자.

 

클래스는 먼저 일반적으로 인스턴스를 만들어주는 "생성자"라는것을 가진다.

 

생성자는 항상 함수형태로 존재하며 init이라는 고정된 이름을 가진다.

 

또, 매개변수로 기본적으로 self라는것을 가지고 있다.

 

 

 

 

 

여기서 하나의 자동차가 가지는 속성을 정의할 수 있는데

 

간단하게 자동차의 이름, 색상만 가진다고 명시해보자.

 

이렇게 생성자 self 매개변수 뒤에 차례대로 속성들을 정의해준다

 

 

 

 

그 후 멤버(변수)를 정의한다.

 

 

 

 

 

 

 

그다음으로는 클래스의 메소드(함수)를 정의해보자.

 

 

간단하게 자동차의 상태를 알 수 있는 show_info라는 '이름'과 '색상'을 출력하는 함수를 만들어보았다.

 

이렇게 하나의 클래스가 정의되었다.

 

 

 

 

 

 

 

즉, 프로그램 내에서 자동차라는 객체가 사용되기 때문에 클래스 형태로 자동차라는 틀을 정의해주었고

 

자동차라는 인스턴스는 name과 color라는 인스턴스를 가지며, show_info라는 함수를 이용해서 해당 자동차 인스턴스의 정보를 출력할 수가 있는것이다.

 

 

 

 

 

이제 인스턴스를 생성해서 show_info 메소드를 이용해보자.

 

 

Car("소나타", 빨간색") 라는 형식으로 인스턴스를 하나 생성하여 car1이라는 변수에 담았다

 

이렇게 만들어진 객체 car1는 클래스 안의 메소드를 사용할 수 있으므로

 

car1.show_info() 함수를 이용하여 위와같이 출력이 가능하다 

 

 

 

 

 

 

 

 

마찬가지로 다른 인스턴스도 생성해서 사용가능하다.

 

 

이런식으로 '자동차'라는 클래스를 정의해놓으면 언제든지 필요할때 프로그램내에서

 

원하는만큼 인스턴스를 생성하여 사용할 수 있는것이다.

 

즉, 우리만의 일종의 '자료형'을 만든것이다. 흔히 정수, 실수, 문자열형의 자료형처럼.

 

이것이 클래스를 사용하는 이유이다.

 

 

 

 

 

 

 

 

 

 

 

또한 접근연산자( . )를 사용해 클래스의 멤버에 접근할 수 있는데

 

 

이런식으로 사용이 가능하다.

 

 

 

 

말하는게 늦었지만 파이썬에서 모든 클래스의 메소드는 기본적으로 위와같이 'self'라는 매개변수를 

 

첫번째 매개변수로 삼는다는 특징이 있다.

 

self는 이 클래스를 이용해서 생성된 인스턴스 그 자체를 의미한다.

 

 

이 self는 처음 봤을때는 낯설고 햇갈릴 수 있지만 계속 쓰면서 익숙해지면 되므로 처음부터 조바심을 가질 필요는 없다.

 

 

 

 

 

 

 

 

 

 

더해, 일반적으로 클래스에는 Setter함수라고 불리는 메소드가 많이 작성되는데

 

Setter함수는 "특정한 속성의 값을 변경"할 때 사용할 수 있다..

 

 

값을 변경하고자 할때는 self.name이라고 해서

 

현재 인스턴스가 가지고있는 name이라는 변수의 값을 매개변수로 건너온값으로 바꾸겠다고 할 수 있는것이다.

 

이 함수를 한번 사용해보면

 

 

 

 

 

 

이런식으로 car1 인스턴스의 name값이 소나타에서 아반떼로 변경되어 출력되는것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

또한, 클래스에는 '소멸자'라는 개념도 존재하는데

 

이는 파이썬과같은 특정 언어들에서 하나의 변수나 객체를 만든다고 하면 데이터가

 

메모리상에 해당 공간만큼 '동적할당' 되는데 너무많은 데이터가 할당이 되면 프로그램이 오작동 할 수 있으므로

 

한번 사용되고 더이상 사용되지 않는 데이터들 즉, 객체는 메모리상에서 할당을 해제해줘야한다.

 

그때 사용하는게 소멸자이다.  

 

 

말그대로 '생성자 init함수'와 반대되는 개념이다.

 

 

__init__과 반대로 __del__ 이라는 키워드를 쓴다.

 

 

 

 

 

 

 

 

 

인스턴스를 다 사용하고 나서 제거를 해야할때,

 

위와같이 소멸자 __del__을 정의해주고 

 

del car1이라고 입력해주면 메모리공간에서 할당해제된다.

 

원래는 아무 메세지가 뜨지 않고 할당해제만 되지만

 

위에서 소멸자의 동작을 확인하기위해 print함수를 정의해줬기 때문에

 

"인스턴스를 소멸시킵니다." 라는 메세지가 정상출력되는것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 소멸자를 이용해 할당해제된 인스턴스를 다시 사용하려고 하면 not defined라며 에러 메세지가 출력되는것으로

 

정상적으로 할당해제된것을 확인 할 수 있다.

 

 

 

 

 

 

 

 

 


 

 

 

 

 

그다음으로 알아볼것은 클래스의 '상속'이다.

 

클래스의 상속이란 "특정한 클래스가 다른 클래스의 멤버변수와 메소드를 물려받아 사용할 수 있는 개념"이다.

 

이 상속으로 인해 더욱 더 프로그램을 계층적으로 구성 할 수 있고, 불필요한 소스코드(중복되는)의 작성도 줄일 수 있다는 장점이 있다.

 

 

 

한번 우리가 '게임 프로그램'을 만든다고 가정을 해보자

 

게임 내에서 등장하는 다양한 캐릭터나 몬스터들을 우리는 Unit(유닛)이라고 부른다. 

 

 

따라서 Unit이라는 부모 클래스를 만들어보고

 

캐릭터와 몬스터라는 자식 클래스(부모 클래스를 상속 받은 클래스)를 만들어

 

자식 클래스에서 부모 클래스의 멤버와 메소드를 상속받아보자

 

 

 

 

 

 

 

 

 

 

 

 

먼저 부모클래스로 사용할 Unit이라는 클래스를 정의해보자.

 

속성에는 이름(name)과 전투력(power)을 넣고, attack이라는 메소드를 구현하였다

 

그 후에, unit1이라는 인스턴스를 만들어 이름은 '전사', 전투력은 '300'을 주고 attack함수를 실행해보았다.

 

 

 

이때 우리는 이런 '전사'와 같은 인스턴스는 '캐릭터'로 분류를하고

 

나중에 유명한 게임인 메이플스토리의 '슬라임'같은것은 '몬스터'로 분류를 하고자 개발을 할 수가 있을것이다.

 

즉, 프로그램을 계층적으로 구성하고자 한다면 이렇게 Unit클래스에서 끝내는것이 아니라

 

 

 

 

 

Monster라는 클래스를 만들어 Unit의 멤버와 메소드를 상속받는다

 

특정한 클래스가 다른 클래스를 상속하고자 할때는 클래스 이름 뒤에 소괄호를 열고

상속하고자 하는 클래스명을 적는다.

 

이제 Monster클래스는 Unit클래스를 상속받았기 때문에 Unit클래스 있는 기능들을 따로 구현하지 않아도 사용할 수 있다.

 

 

 

 

 

 

 

먼저 생성자를 만드는데 추가로 type이라는 속성을 추가해보자(몬스터니까)

 

 

 

 

 

 

 

Monster 클래스로 생성된 슬라임 객체가 attack함수를 정상적으로 사용할 수 있는것을 볼 수 있다.

 

이렇게 상속기능을 이용하게 되면 부모클래스에서 정의되어 있는 내용을 그대로 이용함으로써

 

소스코드를 줄이고, 계층적으로 프로그램을 작성할 수 있다.

 

 

 

 

 

 

 

더해, 이렇게

 

 

자식 클래스에서 만들어진 함수(show_info)같은 경우는 반대로 부모클래서에서는 이용할 수 없지만

 

자식 클래스에 한해서는 바로 정상적으로 함수를 이용할 수 있다는 특징이 있다.

 

 

 

마지막으로, 상속을 받은 자식클래스가 부모클래스와 동일한 이름의 함수를 가진다면 

 

자식 클래스의 함수를 우선적으로 처리한다는 특징이 있다.

 

 

 

 

이상으로 파이썬에서의 Class의 기본적인 개념들에 대해 알아봤다.

 

 

 

 

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band