본문 바로가기
Python

[Python 기초] 파이썬 클래스(class)와 인스턴스(instance)

by dev수니 2021. 4. 2.
반응형

 

 

 1  클래스 (class)

 

 

객체를 정의해 놓은 것이다. 클래스의 용도는 객체의 생성이다.
  객체 : 실제로 존재하는 사물 또는 개념을 의미한다. 객체의 용도는 객체의 속성과 기능에 따른다.

 

 예를 들어 붕어빵과 붕어빵틀로 비유를 해보자면 클래스는 붕어빵틀이고 그에 따른 객체는 슈크림붕어빵, 팥붕어빵 등 으로 예를 들 수 있다.

 

클래스를 생성하면 생성된 클래스를 메모리에 할당하고 객체 생성, 인스턴스 생성 후 주소값을 반환한다.

 

 

 

 

클래스의 생성 방법

 class 클래스명:
      클래스 멤버1
      클래스 멤버2
      클래스 멤버3
      ...

  ※ 위의 클래스 멤버로 들어갈 수 있는 것은 변수, 메서드(클래스 내에서 정의해 준 함수) 가 있다.

 

 

 

클래스 사용 방법

# main
클래스명()

메인 상에서 클래스명()으로 위에서 정의해준 클래스를 사용할 수 있다.

 

 

 

 


 

 

 

 2  인스턴스 (instance)

 

 

 

클래스에서 선언한 클래스명을 변수에 담게 되면 그 틀을 가지고 원하는 속성과 기능을 부여할 수 있다.

 

아까의 붕어빵틀로 예를 들자. 붕어빵틀 클래스가 있고 그 클래스를 가지고 인스턴스를 생성하게 되면 인스턴스 하나하나 마다 반죽의 종류, 들어가는 내용물 등을 다르게 설정해 줄 수 있는 것이다. 

 

 

 

 

인스턴스 생성 방법

 class 클래스명:
      클래스 멤버1
      클래스 멤버2
      클래스 멤버3
      ...
# main
인스턴스 변수 명 = 클래스명()

 

 

 

 

 

 

 

 

 

# 다음 Animal 클래스를 생성후 클래스 멤버로 변수 age , name와 cry()메서드를 선언해 주었다.

1
2
3
4
5
6
7
class Animal:
     age = 0
     name = 0
     def cry(self,str1):
          print(self.name,str1,"운다.")
# main
print(Animal())
cs
<__main__.Animal object at 0x000002024983A430>
>>>

위 출력내용은 Animal 이라는 객체가 주소값 0x000002024983A430 으로 생성됐다 라는 것을 말한다.

 

 

 

 

 

# 그리고 다음과 같이 main에서 코드를 추가해준다.

1
2
3
4
5
6
7
8
9
10
class Animal:
     age = 0
     name = 0
     def cry(self,str1):
          print(self.name,str1,"운다.")
# main
print(Animal())
= Animal()    # Animal 클래스의 인스턴스 a 생성
print(a)    
print(id(a))
cs
<__main__.Animal object at 0x0000029B8973A430>
<__main__.Animal object at 0x0000029B8973A430>
2867049243696
>>>

위 출력내용의 2867049243696은 객체의 주소(reference) 를 나타낸다.

또한 줄8을 보면 Animal클래스를 변수 a에 담아줌으로써 클래스 Animal의 인스턴스를 생성해 주었다.

줄 10에서는 id() 함수를 사용해 객체의 주소(reference) 를 나타내주었다.

 

 plus id() : 객체의 주소(reference) 를 나타낸다.

 

 

 

 

# 위에서 선언해준 인스턴스 a의 주소를 이용해서 Animal객체에 토끼,3을 저장

 

# a. 을 이용

1
2
3
4
a.name = "토끼"        # a. : 인스턴스 a내의 멤버에 접근하겠다는 의미
a.age = 3
print(a.age)
print(a.name)
cs
3
토끼

줄1과 2를 보면 "a. " 를 통해 인스턴스 a내의 멤버 name과 age에 접근한 것을 볼 수 있다. 인스턴스는 클래스로부터 생성된 것이기 때문에 클래스멤버와 같은 멤버를 갖는다. 위와 같은 방식으로 인스턴스를 생성해주고 인스턴스마다 다른 name값, age값을 설정해줄 수 있는 것이다.

 

 

 

 

# 인스턴스 b를 생성해주고 b의 주소를 이용해서 Animal객체에 강아지,1을 저장

1
2
3
4
5
= Animal()
b.name = "강아지"
b.age = 1
print(b.name)
print(b.age)
cs
강아지
1

 

 

 

Animal객체를 리스트에 담기 

1
2
3
4
5
animallist = []     # 빈리스트
animallist.append(a)    # 리스트 animallist에 Animal객체 a를 추가 
animallist.append(b)    # 리스트 animallist에 Animal객체 b를 추가 
 
print(animallist)
cs
[<__main__.Animal object at 0x0000021900DCA430>, <__main__.Animal object at 0x0000021902ECBF70>]
>>>

리스트에 Animal 객체가 담긴 것을 확인할 수 있다.

 

 

 

 

 


 

 3  클래스 안에서의 변수

 

 

 

클래스 변수

1. 모든 인스턴스가 공유한다.
2. 인스턴스의 생성 이전에 이미 메모리공간에 할당된다.

 


인스턴스 변수

1. 인스턴스 변수는 해당 인스턴스만 사용가능하다.
2. 인스턴스가 생성되는 시점에 메모리에 할당된다.

 

 

 

 


 

 

Ex 예제

 

자동차 클래스
# Car
# 브랜드명, 가격, 속력, 색상

# 현대 소나타
# 4000
# 240
# 검정

# Benz S클래스
# 1억
# 300
# 하얀색

# 각각의 인스턴스를 생성해서 모든 정보를 출력
# 두 차를 모두 구입했을 경우 가격을 출력
# 총 가격 : **입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Car:
     Brand_name = ""
     price = 0
     speed = 0
     color = ""
 
     def info(self):     # 정보 출력 메서드
     print("*"*15)
     print(self.Brand_name)
     print(self.price)
     print(self.color)
     print("*"*15)
     # 클래스 안의 메서드 매개변수 자리는 무조건 self 변수를 먼저 작성해준다.
     # 호출시에 호출한 객체 자신이 전달.
# main
sonata = Car()
sonata.Brand_name = "현대 소나타"
sonata.price = 4000
sonata.speed = 240
sonata.color = "검은색"
 
sclass = Car()
sclass.Brand_name = "벤츠S클래스"
sclass.price = 10000
sclass.color = "하얀색"
 
sonata.info()
sclass.info()
 
print("총가격:",sonata.price + sclass.price,"만원 입니다.")
cs
***************
현대 소나타
4000
검은색
***************
***************
벤츠S클래스
10000
하얀색
***************
총가격: 14000 만원 입니다.

줄7에서 클래스 메서드에 매개변수를 꼭 설정해주어야 main에서 인스턴스 객체의 주소값이 매개변수에 담겨 메서드내의 문장들을 실행할 수 있다.

 

 따라서 줄27에서 인스턴스 sonata의 주소값이 info()의 매개변수에 담겨 차례로 print(sonata.Brand_name) , print(sonata.price) , ... 이 실행되는 것이다.

 

 

 

 

 

 

Ex 예제

 

Person 클래스를 생성하고 정보를 저장하는 프로그램

# 클래스 Person
# 변수 name , age , job , hei , wei , address , phone

# 매서드 init() : 정보 입력 메서드

# 메서드 print_init() : 정보 출력 메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Person:
     name = ""
     age = 0
     job = ""
     hei = 0.0
     wei = 0.0
     address = ""
     phone = ""
 
     def init(self,name,age,job,hei,wei,address,phone):
          self.name = name
          self.age = age
          self.job = job
          self.hei = hei
          self.wei = wei
          self.address = address
          self.phone = phone
          print("객체생성 완료!")
 
     def print_init(self):
          print()
          print(self.name)
          print(self.age)
          print(self.job)
          print(self.hei)
          print(self.wei)
          print(self.address)
          print(self.phone)
 
minsu = Person()
minsu.init("김민수",20,"강사",175.5,67.9,"서울시 강남구","010-1234-1234")
 
dada = Person()
dada.init("우다다",3,"고양이",40.5,3.2,"서울시 송파구","none")
 
minsu.print_init()
dada.print_init()
cs
객체생성 완료!
객체생성 완료!

김민수
20
강사
175.5
67.9
서울시 강남구
010-1234-1234

우다다
3
고양이
40.5
3.2
서울시 송파구
none
>>> 

 

 

 

 

Ex 예제

# TV 클래스
# 특징, 기능

# 브랜드명, 색상, 전원상태(on/off) , 채널
# 채널up, 채널down 메소드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Tv:
     brand_name = ""
     color = ""
     power = False
     channel = 10
 
     def init(self,brand_name,color,channel):
          self.brand_name = brand_name
          self.color = color
          self.channel = channel
          print("TV")
 
    def power():     # 입력값X 반환값X
          not power
 
     def channelUp(self):
          self.channel += 1
          
     def channelDown(self):
          self.channel -= 1
 
samsung = Tv()
samsung.init("삼성TV","하얀색",2)
samsung.channelDown()
print(samsung.channel)
cs
TV
1

줄13에서 power()로 TV의 전원을 키는 메서드를 선언했다. power의 값이 False이기 때문에 not power해주게 되면 True값이 된다. 

+plus not 연산자 : ~가 아니다.
# not true -> 참이 아니다. 결과는 거짓
# not false -> 거짓이 아니다. 결과는 참

 

반응형

댓글