티스토리 뷰

📌 객체와 클래스

클래스는 객체에서 사용되는 속성(자료구조)과 메서드를 정의해 묶어준 것을 의미한다. 클래스가 설계도, 객체는 그 설계를 바탕으로 실체화한 것이라고 볼 수 있다. 객체는 인스턴스라고도 부른다. 

 

객체 지향 프로그래밍은 복잡한 문제를 잘게 나누어 객체로 만들고, 객체를 조합하여 문제를 해결한다. 따라서 복잡한 문제를 처리하는 데에 유용하다.

 

 

📍  객체 : 클래스로부터 생성되어 클래스의 속성(자료구조)과 메서드를 가진다

📍  클래스 : 객체에서 사용될 속성과 메소드를 정의한 틀

📍  속성 : 클래스와 객체에서 사용되는 변수(자료구조). 멤버 변수라고 부른다.

📍  메서드 : 클래스와 객체에서 사용되는 함수. 멤버 메서드라고 부른다. (매개변수 self를 필수로 가진다)

 

📍  클래스 내부의 함수는 일반 함수와 구분하기 위해 메서드라고 부른다.

📍  파이썬은 완벽한 객체 지향 언어는 아니다.

 


👉 클래스 정의와 사용

class 클래스명 :
    클래스 변수
    def 메서드(self) :
    	코드

✔  클래스는 여러 자료구조와 메서드를 묶어준다.

✔  클래스 이름을 짓는 방법은 변수와 동일하다. 클래스명은 대문자로 시작한다.

✔  메서드의 첫번째 매개변수는 반드시 self로 지정한다.

class Person :
    num = 100
    def hello(self) :
        print('Hello ')

        
#메인 루틴        
p1 = Person()
print(p1.num)	#100
p1.hello()	#Hello

✔  클래스를 위와 같이 생성한 후, 메인 루틴에서 사용하고자 하는 클래스의 객체(인스턴스 변수)를 만든다.

✔  클래스의 멤버 변수나 메서드에 접근할 때에는 객체명과 . 을 사용한다.

class Person :
    num = 100
    
    def __init__(self, name) :
    	self.name = name
            
    def hello(self) :
        print('Hello ',self.name)

        
#메인 루틴        
p1 = Person('짱구')
print(p1.num)	#100
p1.hello()	#Hello 짱구

✔  __init__ 메서드는 객체를 생성할 때 호출하는 메서드를 말한다. 생성 시 호출된다고 해서 생성자라 부른다.

 

👉 생성자

class Person :
    num = 100
    
    #생성자를 정의하지 않은 경우, 기본 생성자가 자동 생성
    # def __init__(self) : 
    # 	 pass
    
    def hello(self) :
        print('Hello ')

        
#메인 루틴        
p1 = Person()
print(p1.num)	#100
p1.hello()	#Hello

✔  따로 생성자를 정의해주지 않으면 기본 생성자가 사용된다. 기본 생성자는 매개변수로 self만을 가진다.

✔  기본 생성자를 사용하는 경우 객체 생성 시 클래스에 인수를 전달할 필요가 없다.

class Person :
    num = 100
    
    def __init__(self, name) :
    	self.name = name
            
    def hello(self) :
        print('Hello ',self.name)

        
#메인 루틴        
p1 = Person('짱구')
print(p1.num)	#100
p1.hello()	#Hello 짱구

✔   __init__ 메서드는 객체를 만들 때 호출된다. 객체 생성 시 호출된다고 해서 생성자라고 한다.

✔  self는 말하자면 생성된 객체 자기 자신을 의미한다.

✔  메인 루틴에서는 객체명과 .을 사용해서 멤버 변수나 메서드에 접근하는 것처럼

✔  클래스 내부에서는 self 라는 키워드를 사용해 객체가 가진 멤버 변수나 메서드에 접근한다. (예) self.name

 

✔  위와 같이 생성자를 통해 매개변수 name에 값을 받아와 self 키워드를 사용, 멤버 변수를 생성할 수 있다.

✔  이렇게 객체 생성 시에 받아온 인수로 만든 객체마다 다른 값을 가지는 멤버 변수를 인스턴스 변수라고 한다.

def __init__(self, *args) :
    args_list = []
    for i in args :
        list.append(i)

✔  생성자 오버로딩이 가능한 다른 프로그래밍 언어와 달리 파이썬은 __init__ 메서드를 여러 개 가질 수 없다.

✔  오버로딩을 구현하고자 한다면 매개 변수를 여러 형태로 받아올 수 있도록 가변 인자를 사용하고

✔  조건문을 통해 분기점을 지정하는 형태로 구현할 수 있을 것 같다.

 

👉 멤버 변수의 종류 : 클래스 변수와 인스턴스 변수

1.  클래스 변수

class Person :
    num = 100    
    def __init__(self, name) :
    	self.name = name
            
    def hello(self) :
        print('Hello ',self.name)
        
    def print_num(self) :
    	print(Person.num)

        
#메인 루틴        
p1 = Person('짱구')
p1.hello()	#Hello 짱구
p1.print_num()	#100

p2 = Person('유리')
p2.hello()	#Hello 유리
p2.print_num()	#100

✔  클래스 변수는 예제에서의 num을 말한다.

✔  클래스 변수를 클래스 내부에서 사용할 때는 클래스명과 함께 사용한다 (예) Person.num

✔  하나의 클래스에 여러 객체가 생성되었어도, 객체끼리 공유하는 변수를 의미한다.

✔  객체 모두가 공유해야 하므로, 클래스 내부의 전역 변수로 생성한다.

 

2.  인스턴스 변수

class Person :
    num = 100    
    #self.name = name
    def __init__(self, name) :
    	self.name = name
            
    def hello(self) :
        print('Hello ',self.name)
        
    def print_num(self) :
    	print(Person.num)
        
#메인 루틴        
p1 = Person('짱구')
p1.hello()	#Hello 짱구
p1.print_num()	#100

p2 = Person('유리')
p2.hello()	#Hello 유리
p2.print_num()	#100

✔  위와 같이 생성자를 통해 매개변수 name에 값을 받아와 self 키워드를 사용, 멤버 변수를 생성할 수 있다.

✔  이렇게 객체 생성 시에 받아온 인수로 만든 객체마다 다른 값을 가지는 멤버 변수를 인스턴스 변수라고 한다.

✔  인스턴스 변수 또한 해당 객체 내부에서 전역 변수로 사용되므로, 생성 위치는 클래스 변수와 같다. (주석 참고)

✔  하지만 객체가 달라도 동일 값을 공유하는 클래스 변수와는 다르게 인스턴스 변수는 객체마다 다른 값을 가진다. 

 

 

👉 메서드의 종류

1.  인스턴스 메서드

class Myclass :
	num = 10	
	def print_num(self) :
		print(Myclass.num)

✔  인스턴스 객체에 속한 메소드를 의미한다.

✔  객체를 사용해 호출하고, self 매개변수를 사용한다.

✔  객체가 생성되어야지만 사용 가능하다.

✔  별다른 키워드가 필요하지 않다.

   

2.  정적 메서드 @staticmethod

class Myclass :
	num = 10	
	@staticmethod
	def print_num_s() :
		print(Myclass.num*2)	

✔  @staticmethod 를 붙여 정적 메서드임을 명시한다. 단지 편의를 위해서만 사용한다.

✔  클래스로만 호출 가능하며, 매개 변수가 없다.

   

3.  동적 메서드 @classmethod

class Myclass :
	num = 10	
	@classmethod
	def print_num_c(cls) :
		print(Myclass.num*10)

✔  @classmethod 를 붙여 동적 메서드임을 명시한다. 

✔  클래스로 호출 가능하며, cls 매개 변수를 사용한다. 

 

👉 클래스의 멤버 변수 / 메서드 비교

멤버
변수
클래스 변수   class명.변수명 객체들이 서로 공유   인스턴스/클래스 모두 사용
인스턴스 변수   self.변수명 객체마다 다른 값   인스턴스만 사용
  각각의 인스턴스 공간에 생성
메서드 인스턴스 메소드   def 메소드명(self, 매개변수) 인스턴스만 사용   인스턴스/클래스 변수에 접근 가능
정적 메소드   @staticmethod
  def 메소드명(매개변수)
인스턴스/클래스 사용   인스턴스/클래스 변수에 접근 불가능
동적 메소드   @classmethod
  def 메소드명(cls, 매개변수)
클래스만 사용   클래스 변수에 접근 가능
  (객체 생성 없이 클래스 변수 사용하기 위함)

💬  메서드의 차이에 대해서는 아직 잘 모르겠다.

💬  파이썬 코딩도장 Unit35를 참고하자 : dojang.io/mod/page/view.php?id=2378

 

👉 접근 지정자

✔  파이썬에서는 모든 멤버의 접근 지정자 기본값이 public이다.

✔  외부에서의 직접적인 접근을 막고 메서드를 통한 간접 접근을 허용하고 싶다면 private 멤버로 생성해야 한다.

class Test :
    def __init__(self, a, b) :
        self.n1 = a
        self.__n2 = b

    def print_number(self) :
    	print(self.n1, self.__n2) # private 멤버는 내부 접근만 가능하다
        
        
test = Test(10,20)
print(test.n1)		#10  
#print(test.__n2)	#error 발생 : private 멤버는 외부 접근이 불가능하다

test.print_number()	#10 20

✔  private 멤버 : 클래스 내부에서만 접근이 가능한 멤버. 메서드를 통한 간접 접근만 가능하다.

✔  public 멤버 : 클래스 내부, 외부 모두에서 접근이 가능한 멤버

 

✔  private멤버는 접두사 __를 사용해 명시한다. 다만, 접미사는 언더바를 1개까지만 사용할 수 있다.

✔  언더바를 2개 사용하면 특별 메서드로 인식하기 때문에 주의가 필요하다.

 

 

 

 

 

[참고] 엘리스 트랙-혼자 공부하는 파이썬 / 길벗-파이썬 코딩 도장 / 엘리스 트랙 - 예제 중심의 파이썬 입문 / 위키백과

댓글
«   2024/12   »
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
최근에 올라온 글
글 보관함
Total
Today
Yesterday