본문 바로가기
프로그래밍 언어/Python

클래스와 객체 2번째 이야기

by Suff07 2024. 1. 6.

※ 주의

현재 제가 적는 게시글은 제가 잘 몰랐던 파이썬의 개념에 대해 적고 정리하는 글입니다.

그러므로 어느정도 기초적인 문법은 알고 있다는 전제하에서 글을 적습니다.

만약 문법을 전혀 모르신다면 아래 링크를 참고하시면서 봐주세용

https://wikidocs.net/book/1


 

앞서 설명했던 클래스를 살짝 다시 복기해봅시다.

 

클래스는 구조체와 함수의 결합체로써 객체를 생성하고 소멸시키기 위한 설계도라고 이야기했습니다.

 

객체는 클래스에 의해 만들어진 양산품이라 이야기했구요.

 

그러면 본격적으로 간단한 코드를 통해서 감을 잡아보도록 하겠습니다.

 


 

먼저 첫번째 코드입니다!

 

class Student:								
  def __init__(self):					
    self.name = None					
    self.ban = None						
    self.no = None							
    self.kor = None							
    self.eng = None							
    self.math = None						
    
    
    
s = Student()
s.name = "홍길동"
s.ban = 1
s.no = 1
s.kor = 100
s.eng = 60
s.math = 70
total = s.kor + s.eng + s.math
average = float(total/3)
print("이름 : ", s.name)
print("총점 : ", total)
print("평균 : ", average)


d = Student()
d.name = "커트 앵글"
d.ban = 1
d.no = 2
d.kor = 50
d.eng = 100
d.math = 80
total = s.kor + s.eng + s.math
average = float(total/3)
print("이름 : ", s.name)
print("총점 : ", total)
print("평균 : ", average)

 

첫번째문단은 student라는 클래스를 정의하는 구간입니다.
학생은 크게 이름,반,학번,국어 ,영어,수학 점수라는 클래스 변수로 구성이 됩니다.

우리가 학교에 입학을 하게 되면 각각의 이름이 있고 어느 에 소속이 되어있는지 어느 학번인지는 지정이 되잖아요?

그리고 중간고사랑 기말고사를 치게 되면 기록상에 점수가 각각 남게 될거구요.

 

아래 그림을 보면 더욱 이해가 빠를것입니다.

 

 

 

위의 class student는 첫번째 문단에서 정의한 클래스입니다.

그리고 아래의 김수영, 박민수, 이민호 , 석승호는 클래스에 의해 만들어진 객체입니다.

객체안에 들어있는 변수들은 각각 이름, 반, 번호, 국영수 점수가 포함되어있는것이죠!

 


개념적인 부분은 이해가 됐다면 코드를 보겠습니다.

 

class Student:								
  def __init__(self):					
    self.name = None					
    self.ban = None						
    self.no = None							
    self.kor = None							
    self.eng = None							
    self.math = None

 

여기에서 class Student는 클래스를 정의하는 부분인건 알겠고 name이랑 ban no kor와 같은 클래스 변수가 뭔지는 이해 했는데....

 

문제는 def __init__이랑 self는 무슨 의미지? 라고 의아해하실겁니다.

 

1. __init__는 매직메소드라고 해서 파이썬에서 자체적으로 만들어진 특별한 메소드입니다.

(앞으로 클래스 내부에서 정의된 함수를 메소드라고 지칭하도록 하겠습니다.)

매직 메소드에 대한 자세한 이야기는 네임 맹글링 이후에 설명을 하도록 하고 여기서는 일단 객체의 생성을 위해 파이썬에서 제공되는 특별한 메소드 로 이해하면 되겠습니다.

(이를 또 다른 말로는 생성자라고 합니다.)

 

2. self는 객체 자기 자신을 의미합니다.

이게 무슨 말인지 이해가 안가죠?

그러니까 Student1이라는 객체가 생성이 되는 순간에 self는 Student1이라는 객체 그 자신을 가리킨다 이말입니다.

그래서 맨 처음에 객체가 정의가 되면 객체의 이름과 성적 반 등은 None으로 정의가 되어있죠.

(아래 코드는 Student1 객체의 이름을 홍길동으로 정의한겁니다.)

 

여기까지 이해를 했다면 이제 이 코드는 거의 다 이해한 셈입니다.

 

s = Student()
s.name = "홍길동"
s.ban = 1
s.no = 1
s.kor = 100
s.eng = 60
s.math = 70
total = s.kor + s.eng + s.math
average = float(total/3)
print("이름 : ", s.name)
print("총점 : ", total)
print("평균 : ", average)

 

첫번째 문장은 객체를 생성하는 부분이고  s.name은 s라는 객체 속 name의 인스턴스 변수를 가리킵니다.

그리고 s.name = "홍길동"이라고 s라는 객체속 name 인스턴수 변수로 접근하여 None을 "홍길동"으로 지정한겁니다.

 

그러면 s.kor=100은 무엇을 의미하는지 정리하고 이 코드는 마무리를 하도록 하겠습니다.

s라는 객체 속의 인스턴수 변수인 kor로 접근하여 None을 100으로 지정한겁니다.

 

라고 말씀하실 수 있다면 이 코드는 졸업하셔도 됩니다!

 

 

※ 클래스 변수 VS 인스턴스 변수

아니 아까는 클래스 변수라고 하더니 여기서는 인스턴스 변수라고 하네?

이게 무슨차이야? 라고 설명하자면 클래스 변수는 클래스 속에서 정의된 변수로써 같은 클래스라면 해당 변수를 공유하는 셈입니다.

앞서 말했다시피 모든 학생들은 이름,학번,학년과 반, 국영수 점수라는 기본적인 인적정보는 모두가 갖고 있습니다.

즉 모든 학생들이 해당하는 인적정보양식은 공유한다 이 말이죠!

그리고 각각의 학생들의 이름과 학년 학번,반, 국영수 점수는 같을수도 다를수도 있습니다.

즉, 학생들이 개별적으로 갖고 있는 고유한 개성이라던가 특징입니다.

(1번째 그림을 보면 아마 이해가 되실겁니다.) 

 

 

 


 

그러면 이번에는 두번째 코드를 통해서 한번 더 이해를 해보도록 하겠습니다.

 

class bus:
  def __init__(self,num,passengerCount,money):
    self.num = num
    self.passengerCount = passengerCount
    self.money = money
    
  def take(self,money):
    self.money = self.money + money
    self.passengerCount = self.passengerCount + 1

class student:
  def __init__(self,name,money):
    self.name = name
    self.money = money
  
  def takebus(self,bus):
    bus.take(1000)
    self.money = self.money - 1000
    print(self.money)  
    
    
a = bus(101,0,500)
b = student("John",3000)
b.takebus(a) #2000으로 출력
print(a.money) #500으로 출력

 

 

일단 첫번째 문단인 class bus 부분을 보도록 하겠습니다.

 

class bus:
  def __init__(self,num,passengerCount,money):
    self.num = num
    self.passengerCount = passengerCount
    self.money = money
    
  def take(self,money):
    self.money = self.money + money
    self.passengerCount = self.passengerCount + 1

 

def __init__는 생성자니까 클래스를 불러오면 자동으로 생성이 되는 코드겠구나가 감이 잡힐겁니다!

그런데 이번에는 뒤에 num이랑 passengerCount money라는 파라미터가 따라왔네요??

일단 쭉 내려가서 take라는 메소드를 보도록 합시다.

 1. self.money는 버스라는 클래스가 생성하게 되면 생기는 인스턴스 변수일거고....

 2. money는 take라는 메소드의 파라미터니까....

 3. 인스턴수 변수에다가 메소드에서 정의된 파라미터를 더한거구나!

로 이해가 될겁니다.

 

그러면 이제는 두번째 문단을 보도록 합시다

 

class student:
  def __init__(self,name,money):
    self.name = name
    self.money = money
  
  def takebus(self,bus):
    bus.take(1000)
    self.money = self.money - 1000
    print(self.money)

 

첫번째 생성자는 그다지 특이할게 없습니다 그쵸?

 

그런데 뒤에 두번째가 뭔가 신경쓰입니다. 뭐가 신경쓰이는지 보이나요?

바로 파라미터로 bus라는 클래스를 받아와서 bus 클래스의 메소드인 take를 바로 써버리는군요!

이렇게 클래스를 받아와서 쓸 수도 있지만 사실 이것은 객체지향에서는 권장되지 않는 Tight Coupling에 속한답니다.

(Tight Coupling과 Loose Coupling에 대한 개념은 차후에 설명하도록 하겠습니다.)

 

그 외에는 그다지 특이할게 없으니 마지막 문단으로 넘어가 봅시다.

 

 

마지막 문단을 그림으로 정리하면 다음과 같습니다!

 

다음은 상속에 대해서 설명하겠습니다!

'프로그래밍 언어 > Python' 카테고리의 다른 글

클래스와 객체 1번째 이야기  (0) 2024.01.02
NameSpace란?  (0) 2023.12.29
파이썬의 동작과정  (2) 2023.12.27
정적타이핑과 동적타이핑  (0) 2023.12.27