Skip to content

Latest commit

 

History

History
415 lines (275 loc) · 10.7 KB

220720_Python.md

File metadata and controls

415 lines (275 loc) · 10.7 KB

💻Self:


호출하는 인스턴스를 파이썬 내부적으로 그대로 전달해준다.

#self는 인스턴스가 지니는 값을 넘겨주는 역할을 한다.
class Person:
    # self가 자동으로 넘어가기 때문에 name만 입력해주면 되는 것이다.
    def __init__(self, name):
        self.name = name

    def greeting(self):
        print(f'안녕하세요, {self.name}입니다.')

        # 아래는 출력이 안된다. 왜나햐면 인스턴스가 지니는 name 값을 불러올 수 없기 때문에
        print(f'안녕하세요, {name}입니다.')

gildong = Person('길동')
gildong.greeting()

로또 번호 자동생성기를 함수화 해보자.

import random

# 5장 구입
for i in range(5):
    number = range(1,46)
    result = random.sample(number)
    result.sort()
    print(result)

# 함수화 해보자.
def lotto(n):
    lotto_list = []
    for i in range(n):
        number = range(1,46)
        result = random.sample(number, 6)
        result.sort()
        lotto_list.append(result)
    print(lotto_list)

# 다른 환경에서 import 해서 사용할 때
import lotto
print('파일명'.lotto_generator(5))

로또 번호 자동생성기를 여러 기능을 지니는 클래스로 만들어보자.

import random

class Lotto:
    def __init__(self):
        self.list = []

    def number_generator(self, n):
        for i in range(1, n+1):
            numbers = random.sample(range(1,46), 6)
            numbers.sort()
            self.list.append(numbers)
        return self.list

    def check_number(self, real_num):
        for i in self.list:
            if i == real_num:
                return 'Congrats! You won the lottery!'
            else:
                return 'Next time... Maybe?'

l1 = Lotto()
print(l1.number_generator(2))
print(l1.check_number([1]))

💻클래스


클래스 속성(attribute):

  • 한 클래스 내의 모든 인스턴스가 지니는 공통된 같은 값을 클래스 속성이라고 한다.

  • 클래스 선언 내부에서 정의된다.

  • <classname>.<name>으로 접근 및 할당이 가능하다.

#클래스 변수를 정의한다.
class Circle:
    pi = 3.14

c1 = Circle()
c2 = Circle()

# 이미 클래스 내에 변수로써 pi = 3.14 가 정의되어 있기 때문에 인스턴스는 모두 같은 pi값을 지닌다.
print(c1.pi) # 3.14
print(c2.pi) # 3.14

💻LEGB Rule


L: Local (함수 내부를 의미한다. 지역변수가 하나의 예가 될 수 있겠다.)

E: Enclosed Functional locals (함수 내부의 기준으로 바깥 쪽을 의미한다. Global과 Local 사이의 범위이다.)

G: Global (함수영역에는 포함되지 않는 함수 바깥쪽 영억, 가장 바깥영역을 뜻한다. 함수 밖에서 선언되는 전역변수가 하나의 예가 될 수 있겠다.)

B: Built-in (파이썬 모듈 내부인 내장영역을 뜻한다. 파이썬의 reserved words 등이 이에 해당한다.)



💻인스턴스와 클래스 간의 이름 공간(namespace):


인스턴스 객체를 통해 함수의 이름을 찾을 때,

인스턴스 객체 영역 ->> 클래스 객체 영역 ->> 전역 영역 (LEGB와 같은 순서) 순으로 탐색하게 된다.

탐색하지 못한 경우에는 AttributeError 예외가 발생한다.


⛔클래스 내에서 변수에 접근하려고 할 시에, 반드시 self를 통해 접근하여야 한다. 전역변수와 클래스 내의 변수의 이름이 동일할 경우 문제가 발생할 수 있다.

str = 'Global variable'
class test:
    str = 'Class variable'

    def set(self, msg):
        self.str = msg

    def Print(self):
        print(str) # self.str을 하지않아 전역 변수를 호출한다.

    def PPrint(self):
        print(self.str) # 클래스 변수를 호출한다.

t1 = test()
t1.Print() # Global variable
t1.PPrint() # Class variable

💻인스턴스 메서드


함수가 인스턴스를 호출하면서 인스턴스에 메서드 사용이 필요할 때 사용한다. 쉽게 말해서 인스턴스를 조작하기 위한 메서드이다.


💻클래스 메서드


  • 내부적으로 클래스에 메서드 사용이 필요할 때 사용한다.

  • 클래스가 사용할 메서드이다.

  • 오직 클래스만을 위한 메서드이다. 클래스에만 적용된다.

  • @classmethod 데코레이터를 사용하여 정의한다.

  • 데코레이터: 함수를 어떤 함수로 꾸며서 새로운 기능을 부여한다.

    • 호출 시, 첫번 째 인자로 클래스(cls)가 전달된다.
class MyClass:

    @classmethod
    def class_method(cls, args1)

💻스태틱 메서드


  • 인스턴스 변수, 클래스 변수를 전혀 다루지 않는 메서드이다.

  • 속성을 다루지 않고 행동 및 기능만을 정의할 때 사용된다.

  • 호출 시 어떠한 인자도 전달되지 않으며 클래스 정보에 접근/수정을 할 수 없다.

class MyClass:

    #클래스 차원에서 사용할 수 있는 변수
    class_variable = '클래스변수'

    def __init__(self):
        self.instance_variable = '인스턴스 변수'

    #인스턴스 메서드 정의
    def instance_method(self):
        return self, self.instance_method

    #클래스 메서드 정의
    @classmethod
    def class_method(cls):
        return cls, cls.class_variable

    #스태틱 메서드 정의
    @staticmethod
    def static_method():
        return '스태틱'

c1 = MyClass()
print('인스턴스 변수 호출', c1.instance_variable)
print('인스턴스 메서드 호출', c1.instance_method())
print('클래스 메서드 호출', c1.class_method())
print('스태틱 메서드 호출', c1.static_method())

💻객체 지향의 핵심개념


  • 객체지향의 핵심 4가지
  1. 추상화: 클래스 내에 기능들을 만들어 놓고 인스턴스 생성 시, 기능을 이용할 수 있게 해주는 개념이다. 이러한 형태를 미리 만들어 놓는 것을 추상화라고 한다.
class Person:
    def __init__(self, name):
        self.name = name

    def introduce(self):
        return f"hi, I'm {self.name}."

  1. 상속: 두 클래스 간의 부모-자식 관게를 정립하는 것이다. 상속을 통해 상위 클래스에 정의된 속성, 행동, 관계 및 제약조건을 모두 하위 클래스에게 전달이 가능하다. 재사용성이 향상된다는 장점이 있다.
class Human:
    def __init__(self, name):
        self.name = name

    def work(self):
        print(self.name + 'works hard')

class Student(Human):
    def work(self):
        print(self.name + 'studies hard')

class Teacher(Human):
    def work(self):
        print(self.name + 'teaches with effort')
  • isinstance(object, classinfo): 실제로 인스턴스인지 확인 가능
class Human:
    def __init__(self):
        return None

class Animal:
    def __init__(self):
        return None

h1 = Human()
a1 = Animal()

print(isinstance(h1, Human)) # True
print(isinstance(a1, Human)) # False
  • issubclass(class, classinfo): 상속관계인지 알아보는 메서드

    • classinfo는 클래스 객체의 튜플일 수도 있으며, classinfo의 모든 항목을 검사한다.
class Human:
    def __init__(self, name):
        self.name = name

    def work(self):
        print(self.name + 'works hard')

class Animal:
    def __init(self):
        return None

class Student(Human):
    def work(self):
        print(self.name + 'studies hard')

class Tiger(Animal):
    def hunt(self, target):
        print('Tiger is approaching to the pray')

print(issubclass(Student, Human)) # True
print(issubclass(Tiger, Human)) # False
  • super(): 부모클래스의 요소를 호출할 수 있다. 자식클래스에서 부모 클래스를 사용하고 싶은 경우 활용한다.

    • super().__init__(name, age)이런식으로 코드를 다시 작성할 필요 없이 새로 추가하고 싶은 값만 추가할 수 있다.
class Person:
    def __init__(self, name, age, number, email):
        self.name = name
        self.age = age
        self.number = number
        self.email = email

class Student(Person):
    def __init__(self, name, age, number, email, student_id):
        super().__init__(name, age, number, email)
        self.student_id = student_id

  • 메서드 오버라이딩(method overriding)을 통해 자식 클래스에서 메서드의 재정의가 가능하다.

  • 상속관계에서의 이름 공간은 인스턴스, 자식 클래스, 부모 클래스 순으로 탐색한다(작은 것부터 큰 것으로)


🌟다중상속: 두개 이상의 클래스를 상속 받는 경우, 상속 받은 모든 클래스의 요소를 활용이 가능하다.
중복된 속성이나 메서드가 있는 경우 상속 순서에 의해 결정된다.

  1. 다형성: 동일한 메서드가 상속 받는 자식 클래스에 따라 조금 다르게 정의되는 개념이다.
  • 메서드 오버라이딩(method overriding): 메서드 덮어쓰기 기능이다. 메서드를 재정의 하는 것이다.
#다형성과 메서드 오버라이딩
class Human:
    def __init__(self, name):
        self.name = name

    def work(self):
        print(self.name + 'works hard')

class Student(Human):
    def work(self):
        print(self.name + 'studies hard')

class Teacher(Human):
    def work(self):
        print(self.name + 'teaches with effort')

  1. 캡슐화: 파이썬에서는 접근 제어를 지원하지 않는데, 수단과 방법을 다 쓰면 접근이 가능하기 때문이다.
  • 접근 제어자 종류
  1. Public Access Modifier: 어디서나 호출이 가능하다. 하위 클래스 override를 허용한다.

    • 언더바 없이 시작하는 메서드나 속성이다.

  1. Protected Access Modifier: 부모/자식 간에만 호출이 가능하다.

    • 언더바 1개로 시작하는 메서드나 속성이다.

  1. Private Access Modifier: 본인만 접근이 가능하다. 클래스 그 자체에서만 가능하다는 뜻이다.

    • 언더바 2개로 시작하는 메서드나 속성이다.

References

https://wikidocs.net/80519 (LEGB 규칙)

https://yes90.tistory.com/48 (LEGB 규칙)

https://www.geeksforgeeks.org/scope-resolution-in-python-legb-rule/ (LEGB)

https://goodgid.github.io/Python3(3)-(2)/ (클래스 객체와 인스턴스 객체의 이름공간)

http://www.tcpschool.com/java/java_polymorphism_concept (다형성 개념)

https://www.w3schools.com/java/java_polymorphism.asp (다형성 개념)

https://www.fun-coding.org/PL&OOP1-8.html (다형성 개념)