안녕, 세상!

5. 클래스 본문

It공부/Python

5. 클래스

dev_Lumin 2020. 3. 15. 08:00

① 클래스와 객체

클래스와 객체를 예시를 들어서 설명을 하겠습니다.

 

붕어빵 틀 -> 클래스(class)

붕어빵 틀에 의해서 만들어진 붕어빵 -> 객체(object)

 

클래스는 똑같은 무엇인가를 계속해서 만들 수 있는 설계 도면(붕어빵 틀)이고, 객체는 클래스로 만들어진 존재(붕어빵)입니다.

클래스로 만든 객체는 객체마다 고유한 성격을 띄며 객체들은 서로 전혀 영향을 주지 않습니다.

 

클래스 형식 : class(매개변수):

                             적용할 코드

 

 

객체와 인스턴스의 차이

- 클래스로 만든 객체를 인스턴스라고 합니다. 다만 말로 표현하는 차이지 의미에는 큰 차이가 없습니다.

- "붕어빵은 인스턴스"라는 말보다 "붕어빵은 객체"라고 말하는 것이 더 어색하지 않고, "붕어빵은 붕어빵 틀의 객체"라는 말보다 "붕어빵은 붕어빵 틀의 인스턴스"라는 표현이 더 잘 어울립니다.

 

 

 

 

② 클래스를 사용하는 이유

클래스를 사용하는 이유는 여러가지 이지만 예시를 통해 이유들 중 하나를 설명하겠습니다.

 

만약에 어떤 프로그램에서 2대의 계산기가 필요한 상황이 발생하면 각각의 결과 값을 유지해야 하기 때문에 계산기 함수 하나만으로 결과값을 따로 유지할 수 없습니다.

클래스 함수가 없다면 다음과 같이 계산기 함수를 두 개를 따로 만들어야합니다.

클래스를 사용하지 않을 시

 

하지만 클래스를 사용한다면 위와 같이 함수를 두 번 생성할 필요 없이 계산기 함수의 틀을 자료형 형식으로 한 번만 만들어서 변수들이 계산기 함수 틀의 자료형을 사용해서 계산기 여러 개를 만들어서 각각의 결과 값을 가질 수 있습니다.

 

x와 y는 cal이라는 자료형이 되어서 계산기 2대 역할을 할 수 있습니다.

위의 예시는 계산기 두 대의 예시를 들었지만 필요한 계산기가 10대가 필요할 경우는 변수도 많이 필요하고 더 복잡하기 때문에 클래스의 필요성을 크게 느낄 수 있습니다.

 

 

 

 

③ 클래스 구조

 

우선 클래스로 덧셈 계산기를 만든 예시를 봅시다.

클래스로 만든 덧셈 계산기

(1) 메소드(method)

 - 클래스 안에 있는 함수를 메소드라고 합니다.

 - 위에서는 setdata함수와 add함수가 메소드입니다.

 

 

(2) 객체 변수

 

 - 해당 객체의 고유값을 저장할 수 있는 공간

 

 

(3) self 매개변수

 

 - 위의 setdata메소드는 매개변수가 self, a, b 이렇게 세 개가 있는데 x객체가 setdata메소드를 실행시킬 때 매개변수에 1,2두 개만 넣었는데 오류 없이 실행이 되었습니다.

 - self의 매개변수에 들어가는 값은 객체 그 자체가 들어가는 것입니다. 그래서 x.setdata(1,2) 가 실행이 되면 x객체가 self 매개변수에 들어가고 1과 2의 값은 각각 a, b 매개변수에 대입되는 것입니다.

 - self 매개변수는 매개변수명을 꼭 self로 할 필요 없이 바꿀 수 있습니다.

 - 파이썬의 메소드의 첫 번째 매개변수는 관례적으로 self 매개변수를 사용합니다.

 

 

 

(4) 서로 다른 객체는 독립적인 관계입니다.

 

id 함수 - 해당변수의 주소값을 출력

 

x 객체의 객체 변수 a와 y 객체의 객체변수 a의 주소가 서로 다르므로  각각 다른 곳에 그 값이 저장됩니다.

객체 변수는 그 객체의 고윳값을 저장할 수 있는 공간이므로  다른 객체들 영향을 받지 않고  독립적으로 그 값이 유지됩니다.

 

 

(5) 클래스 변수

 

 - 클래스에 선언한 변수입니다.

 - 위의 코드에서는 cal 클래스의 num이 클래스 변수입니다.

 - 형식 : 클래스 이름. 클래스 변수

 

위의 '클래스로 만든 덧셈 계산기' 코드에서 cal 클래스 변수 num의 숫자를 5에서 8로 바꿔줍니다.

x 객체와 y 객체의 num 값도 바뀌었습니다.

 

위의 '클래스로 만든 덧셈 계산기' 코드에서 클래스 변수 num의 주소는 다음과 같습니다.

모두 주소가 같으므로 클래스 변수는 객체가 받아도 같은 메모리 공간을 공유하는 것을 알 수 있습니다.

 

 

 

(6) 생성자(Constructor)

 

위의 클래스로 만든 덧셈 계산기의 일부 코드를 수정해 보았습니다.

setdata 메소드를 실행시키지 않고(위의 그림에서 주석처리 함) 바로 add 메소드를 실행시키면 각각 객체들의 객체 변수 a, b가 초기화가 되지 않으므로 오류가 발생합니다.

setdata를 실행해야만 객체들의 객체변수 a,b가 초기화되기 때문입니다.

이렇게 객체에 초깃값을 설정해야 할 필요가 있을 때는 setdata와 같은 메소드를 호출하여 초깃값을 설정하기 다보 다는 생성자를 구현하는 것이 안전한 방법입니다.

 

생성자는 객체가 생성성될 때 자동으로 호출되는 메소드입니다.

파이썬 메소드 이름을 __init__ 를 사용하면 이 메소드는 생성자가 됩니다.

__은 언더바 두 개를 연속으로 입력한 것입니다.

 

 

생성자 만든 덧셈계산기

x=cal(1,2)와 같이 생성자가 있는 클래스를 자료형으로 만들 객체는 객체를 만들 때 생성자에 매개변수가 존재하면 매개변수에 들어갈 값(1과 2)을 넣어줘야 합니다.

x객체를 만들면서 생성자가 한 번 호출되고, y객체를 만들면서 생성자가 한 번 더 호출되니까 "생성자가 생성되었습니다!"라는 문구가 두 번 나온 것을 알 수 있습니다.

 

 

 

(7) 클래스의 상속

 

 - 상속이란 "물려받다"라는 뜻이다. 

 - 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것입니다.

 - 부모 클래스 : 상속받을 클래스  

 - 자식 클래스 : 상속받는 클래스

 

위의 '생성자 만든 덧셈 계산기' 코드에서 cal이라는 클래스를 상속받은 클래스는 다음과 같습니다.

morecal 클래스는 cal 클래스를 상속 받음으로써 morecal클래스를 자료형처럼 쓰는 객체들(위의 코드에서는 x객체)은 cal클래스의 메소드인 add메소드를 사용할 수 있고, 새로 추가한 mul 메소드는 당연히 사용할 수 있습니다.

 

 

상속을 쓰는 이유

 - 보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용합니다.

 - 클래스에 기능을 추가하고 싶으면 기존 클래스를 수정할 수도 있지만 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 합니다.

 

 

 

(8) 메소드 오버 라이딩 (Overriding)

 

 - 부모 클래스에 있는 메소드를 동일한 이름으로 다시 만드는 것입니다.

 - 메소드를 오버 라이딩하면 부모 클래스의 해당 메소드는 실행되지 않고 대신 오버 라이딩한 메소드가 호출됩니다.

 

위의 '생성자 만든 덧셈 계산기' 코드에서 cal 클래스의 add메소드는 덧셈을 하는 메소드인데 새로운 메소드에 오버 라이딩시켜서 뺄셈으로 바꿔봅니다.

overcal 클래스에 cal 클래스를 상속시킨 후 cal 클래스에 있는 add 메소드를 오버라이딩 해서

overcal 클래스를 사용한 객체들(위 코드에서 v객체)은 add 메소드를 호출할 때 오버 라이딩된 add메소드가 호출되므로 덧셈이 아닌 뺄셈이 됩니다.

 

 

 

 

 

 

 

 

 

 

'It공부 > Python' 카테고리의 다른 글

복소평면에 허수함수 그래프 그리기(파이썬)  (0) 2020.08.08
4. 함수  (0) 2020.03.14
3. 자료형(2)-리스트, 튜플, 딕셔너리  (0) 2020.03.13
2. 변수와 자료형(1)  (0) 2020.03.12
1.파이썬 설치 및 특징  (0) 2020.03.11
Comments