728x90

파이썬 또한 대표적인 객체지향 언어이다. 객체지향언어에 대한 설명은 블로그에 정리해 두었으니 해당 링크를 참고

또한 객체지향 언어에서도 파이썬은 class를 사용하는 객체지향 언어이다.

(이에 대해서 Javascript가 대표적으로 class가 아닌 프로토타입 기반의 객체지향 언어이다. 물론 ES6문법을 통해 class를 사용할 수 있게 되었지만 말이다. 이에 대해서는 후에 정리해 보려 한다.)

 

파이썬에서는 객체지향 프로그래밍을 구현하기 위해 class를 어떻게 사용하는지에 대해 정리해 보려 한다.

 

Class란?

->데이터(변수)와 기능(함수,메서드)을 함께 묶어 놓은 개념이다.

 

Class의 사용

- 변수와 함수가 들어있는 Class를 선언
- Class를 객체로 만들어서 Class안에 선언된 변수와 함수를 사용한다. 

 

아래의 코드를 참고해보자. 왼쪽의 경우가 class를 사용하지 않고 데이터와 기능을 정의한 것이며, 이를 class를 사용하여 정리한 것이 오른쪽의 코드이다.

 

Class 사용 규칙

 

1) class는 대문자로 시작하는 캐멀케이스 사용

 

2) self는 자기 자신을 가르킨다.

-> 왼쪽의 코드와 같이 class 내에서 함수를 선언할 때, 매개변수 가장 처음에 자기 자신을 선언하고(이 때 꼭 self를 쓰지 않아도 되지만, 일반적으로 self를 가장 많이 쓴다. 

 

3) 변수 선언 시에 생성자 __init__( )을 사용한다.

-> self로 자기자신을 선언하고, 그 다음에 선언하고자 하는 변수를 기재하고, 함수 내에서 self.변수 = 변수의 형태로 변수(데이터)를 선언하면 된다.

 

 

-> Class를 선언한 후에, 외부에서 변수 = 클래스(대입할 변수들) 의 형태로(위의 예시코드 참고) 선언하여 사용할 수 있다. 

 

-> 변수에 언더바를 추가하면 프라이빗 변수로 외부에서 조작 불가하다.

-> 그리고 이러한 프라이빗 변수는 getter setter를 통해 접근 가능

 

예시코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 제약조건을 걸어주어 특정 함수의 로직을 거쳐서 변수를 넣어주는겍 getter, setter이다. 
class User:
    def __init__(self, first_name):
            self.first_name = first_name
            
    def setter(self, first_name): #저장시
       #setter에 제약조건 달아주기:  
        if len(first_name) >= 3: #first_name은 3글자 이상이어야해~ 안그럼 에러다~
            self.first_name = first_name
        else:
            print("error")
            
    def getter(self, first_name): #출력시
        print("getter")
        return self.first_name
            
    def disp(self):
        print(self.first_name, self.last_name)
    name = property(getter, setter) #property: getter, setter에 print처럼 접근할 수 있도록 도와주는 함수
        
user1 = User("Grace")
cs

 

-> 혹은 프로퍼티를 활용하여 프라이빗 변수에 접근가능하기도 하다.

 

위의 예시코드에서 property를 추가 한 것이다. property를 통해 __width를 선언하고, setter를 통해 width 변수 사용 시에 대한 조건을 추가해 주었다. 

 

그렇게 하니, 외부에서도 프라이빗 변수에 접근하여 변경할 수 있으나 이에 대한 조건도 설정해둘 수 있게 되었다.

 

 

 

 

 

 

 

 

 

 

Class 상속

Class의 기능을 그대로 가져다가 기능을 수정/추가 할 때 사용하는 방식

 

1) class 클래스 명(상속 받을 것)

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
#4. 상속
 
class Calculator:
    def __init__(self, num1, num2): #def__init__(self, num1, num2=10): 처럼 default 값도 쓸 수 있고 *args, **kargs 도 사용가능
        
        self.num1 = num1
        self.num2 = num2
        
    def plus(self): 
        return self.num1 + self.num2
    
    def minus(self):
        #pass
        return self.num1 - self.num2
    
    
#Calculator2는 Calculator에 곱하기 기능을 추가한 것이라면,
class Calculator2(Calculator): # class 클래스 명(상속 받을 것)
    #이러면 Calculator기능이 다 들어오고
    #추가/수정 할 것만 여기에 적어주면 된다. 
    
    #추가
    def mul(self): 
        return self.num1 * self.num2
    
    #수정(재정의): 메서드 오버라이딩을 사용하여 수정한다. 
    def plus(self):
        return self.num1 + self.num2 + 10
    
    
    
cal3 = Calculator2(2, 4)
cal3.plus(), cal3.minus(), cal3.mul() #실행 결과 16, -2, 8
cs

 

2) Class - super

부모 class에서 사용된 함수의 코드를 다시 자식의 class에서 재사용할 때 사용되는 것. 바로 위의 코드에서 잠깐 상속해서 overriding해서 다시 수정해서 쓰는 것 까지 배워봤는데, 부모 class에서 사용된 함수의 코드를 다시 자식의 class에서 재사용할때 사용되는 것이 super이다. 

1
2
3
4
5
6
7
8
9
class A:
  def plus(self):
      code1
 
class B(A):
  def minus(self):
      code1 # -> super().plus()
      code2
 
cs

이런 코드가 있다고 할때, 자식 class인 B에 부모 class의 code1이 중복(동일)하다. 이럴 때, 이를 code1로 쓰는게 아니라 super().plus() 라고 쓰면 A의 code1이 그대로 이 위지에 적용된다.

그리고 뭔가를 수정할 때도, class A에서 code1만 수정해주면 된다.

 

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#여기서 maxhealth를 추가하여 Marine2를 만들고 싶다면, 
class Marine2(Marine):
    #수정: overriding
    def __init__(self):
        self.health = 40 #이거랑
        self.attack_pw = 5 #이게 중복된다. 
        self.max_health = 40
        
        
        
#이를 super을 이용해서 대체해 줄 수 있다.
class Marine2(Marine):
    def __init__(self):
        super().__init__() #super().뭘 그대로 상속받을지 
        self.max_health = 40
        
        
my_marine = Marine2()
my_marine.health, my_marine.attack_pw, my_marine.max_health #실행 결과: 40, 5, 40
 
cs

 

3) is a & has a : 클래스를 설계하는 개념

-> A is a B: A는 B이다. 상속을 이용해서 클래스를 만드는 방법

1
2
3
4
5
6
7
class Person():
    def __init__(self, name, email):
        self.name = name
        self.email = email
class Person2(Person):
    def info(self):
        print(self.name, self.email)
cs

 

->A has a B : A는 B를 가진다. A가 B객체를 가지고 클래스를 만드는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#class 사람: 이름, 이메일, 정보출력()을 has a 로 만들기
 
class Name:
    def __init__(self, name):
        self.name_str = name
        
class Email:
    def __init__(self, email):
        self.email_str = email
 
class Person:
    def __init__(self, name_obj, email_obj):
        self.name = name_obj
        self.email = email_obj
        
    def info(self):
        print(name.name_str, email.email_str)
 
my_name = Name("Grace")
my_email = Email("he__y@gmail.com")
p = Person(name, email)
cs

 

 

 

Reference

파이썬 공식문서

참고 블로그 링크

728x90

+ Recent posts