파이썬에서
함수를 정의할 때 def라는 키워드를 사용한 것처럼 클래스를 정의할 때 class라는 키워드를 사용한다.
클래스를 사용하는 목적 : 변수와 함수를 모아 하나의 새로운 객체(타입)으로 만든다.
(우리가 메인 코드 내에 def를 라인 들여쓰기를 구분해 구현했듯이 class 역시 라인 들여쓰기를 이용해 구분하여 내부에 그대로 구현할 수도 있고, .py 파일로 만들어서 하나의 객체 패키지로 따로 분리할 수도 있다. 자바에서 우리가 현재 .class 파일을 만들어 하나의 객체로 분리한 것처럼.)
파이썬
class Animal:
pass
BusinessCard라는 클래스를 정의 자바에서 그동안 배운 것과 비교하면
자바
public class Animal {
pass;
}
이것과 같은거다.
그리고 클래스 내의 변수는 특별히 '필드 또는 클래스 변수', 클래스 내의 함수는 특별히 'Method(메소드)'라 부른다.
파이썬
또한 존재하기만 하는 Animal이라는 클래스는 '클래스 Object'라고 부르고,
그것이 메모리에 위치하여 사용이 되는 순간 '인스턴스'라 부른다.
dog = Animal()
dog
<__main__.Animal object at 0x0302ABB0>
Animal이라는 '클래스 Object(객체)'가 메모리 0x0302ABB0 위치에 '인스턴스'로 생성되고, dog라는 변수가 이를 연결한다.
이제 dog = Animal()이니까 dog는 인스턴스가 된거다.
따라서 dog 인스턴스의 타입을 확인해보면
type(dog)
<class '__main__.Animal'>
애니멀이라는 크래스라는 것을 확인할 수 있다.
이를 정리하면 dog라는 객체 변수는 이제 인스턴스고 dog의 타입은 Animal 클래스다.
자바와 비교해보면
public class Animal {
String name;
}
public class Main {
public static void main(String[] args) {
Amimal dog = new Animal(); // Animal 클래스가 new를 통해 메모리에 할당되어 인스턴스가 되었고, 객체 변수 dog가 이를 연결한다.
// 즉, 이제 dog는 인스턴스다.
Animal cat; // cat은 객체 변수
// 인스턴스화
cat = new Animal(); // Animal 클래스가 new를 통해 메모리에 할당되어 인스턴스가 되었고, 객체 변수 cat이 이를 연결한다.
}
}
와 같다. 다만 자바에서 다른 점은, 파이썬처럼 변수 dog 자체를 하나의 객체 변수로 만들어 바로 Animal를 메모리에 할당해 '인스턴스로' 만드는 방법과 동일한 방법 외에도, cat 인스턴스처럼 객체 변수 선언과 인스턴스화를 분리시킬 수 있다. (아마 자바가 옛날 언어라 int나 double도 보면 자료형 선언해주고 값 넣어주고 따로 해서 그런듯...)
생성자, 인스턴스에 대해서 좀 더 자세히 알아보자.
파이썬
class Animal:
name = ''
def __init__(self, name):
self.name = name
def __del__(self):
self.name = ''
dog = Animal('흰둥이')
자바
public class Animal {
String name
public Animal(name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Amimal dog = new Animal('흰둥이');
}
}
과 같다. __init__이 Constructor(생성자)를 의미한다. 그리고 파이썬에서 메소드는 무조건 첫 번째 변수를 self로 가진다. (그냥 문법임).
( __del__ 은 소멸자)
다시 한 번 정리하면 메모리에 할당되어 인스턴스가 되기 이전인 Animal 클래스의 'name' 변수는 '클래스 변수'라고 부르고, 클래스를 메모리에 할당해 인스턴스화 되어 생성된 dog 인스턴스의 'name' 또는 'self.name' 또는 'this.name'은 '인스턴스 변수'라 부른다.
참고한 곳
파이썬이 보이는 그림책, https://wikidocs.net/3455
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
'개발자 > Python' 카테고리의 다른 글
Python (파이썬) while(True) (0) | 2020.04.29 |
---|---|
Python (파이썬) select 함수 (0) | 2020.04.29 |
Python (파이썬) Matplotlib 시각화를 해보자 (0) | 2020.04.27 |
Python (파이썬) Matplotlib 한글 깨짐 해결 (0) | 2020.04.27 |
Python (파이썬) inplace (.rename) (0) | 2020.04.26 |