Skip to content

Latest commit

 

History

History
299 lines (193 loc) · 6.6 KB

220719_Python.md

File metadata and controls

299 lines (193 loc) · 6.6 KB

💻OOP:


Object Oriented Programming(객체지향 프로그래밍)

문제를 여러가지 객체로 나누어 작업하는 프로그래밍 방식

프로그램을 객체라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식



💻객체란:


객체는 결국 특정 타입의 인스턴스이다.

  • 123,900,5는 모두 int의 인스턴스

  • 'hello', 'bye'는 모두 string의 인스턴스이다.

  • [232,89,1],[]는 모두 list의 인스턴스이다.

🌟int, string, list는 모두 클래스이다.

a = [1,2,3]
print(a,type(a)) # <class 'list'>

b = '123'
print(b,type(b)) # <class 'str'>

객체의 특징:

  • 타입(type): 객체의 타입에 따라 어떤 연산자/메서드 적용 가능한지가 달라진다.

  • 속성(attribute): 객체가 지니는 값, 상태를 나타낸다.

  • 조작법(method): 객체의 타입에 따라 어떠한 함수 및 행위가 가능한지 달라진다.



💻절차지향 프로그래밍:


순차적인 처리로써 프로그램 전체가 유기적으로 연결되는 구조의 프로그래밍 방법이다.

컴퓨터의 처리구조와 유사하여 실행속도가 빠르다는 장점이 있다.



💻객체지향 프로그래밍:


프로그램안에 여러가지 독립된 객체들과 그 객체들 사이에 발생하는 상호작용으로 프로그램을 정의하는 방법이다.

실제 세계를 모델링하여 프로그래밍하는 기법이기도 하다.

  1. 추상화: 현실 세계를 프로그램 설계에 반영

  2. 캡슐화: 클래스 내부의 변수와 메소드를 하나로 패키징(묶는) 방법이다. 비슷한 개념으로 정보은닉이 있다. 객체의 응집도와 독립성을 높임으로써 객체의 모듈화를 지향한다.

  • 정보은닉: 객체의 내부 구현을 숨겨 객체가 반드시 정해진 메소드를 통해서만 상호작용하도록 유도.

ex: 자바에서의 접근제어자

public, protected, default, private

  1. 상속: 자식클래스에게 부모클래스가 지니는 특징(속성, 메서드 등)을 물려준다. 이를 통해서 새로운 클래스를 생성하였을 때 속성이나 메서드를 따로 정의해줄 필요가 없다.

  2. 다형성: 하나의 객체가 여러개의 타입을 가질 수 있는 것이다.

ex: 자바에서의 대표적인 다형성 구현법

overriding, overloading, functional interface



💻절차지향 프로그래밍과 객체지향 프로그래밍 예시


🌟사각형의 넓이를 구해보자.

절차지향 프로그래밍 예시

def area(x, y):
    return x * y

def perimeter(x, y):
    return 2 * (x + y)

a = 10
b = 20
c = 30
d = 40
square1_area = area(a, b)
square1_perimeter = perimeter(a, b)
square2_area = area(c, d)
square2_perimeter = perimeter(c, d)

객체지향 프로그래밍 예시

class Rectangle:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def area(self):
        return self.x * self.y

    def perimeter(self):
        return 2 * (self.x + self.y)

r1 = Rectangle(10, 20)
r1.area()
r1.perimeter()

r2 = Rectangle(30, 40)
r2.area()
r2.perimeter()

🌟사각형 구하기 클래스에서의 개념


사각형: 클래스

각 사각형(r1, r2): 인스턴스

사각형의 정보: 속성

사각형의 행동/기능: 메서드(넓이, 높이 구하기)



💻OOP 기초


기본문법
#클래스 정의 (클래스 정의 시에는 CamelCase, 변수/함수 정의시에는 Snake_Case)
class MyClass:
    pass
#인스턴스 생성
my_instance = MyClass()
#메서드 호출
my_instance.my_method()
#속성 접근 시...
my_instance.my_attribute

클래스: 객체들의 분류(class)

인스턴스: 하나하나의 실체/예(instance)

class Person:
    pass
print(type(Person)) # <class 'type'>

p1 = Person()
print(type(p1)) # <class '__main__.Person'>

isinstance(person1, Person) # True



💻얕은복사와 깊은복사의 개념


  • 얕은복사: 데이터의 주소 값만 복사한다는 것을 의미한다.

  • 깊은 복사: 실제의 데이터 값을 새로운 메모리 공간에 복사한다는 것을 의미한다.

#얕은 복사
a = [1,2,3]
b = a
b[0] = 'hi'
print(a) # ['hi',2,3]
print(b) # ['hi',2,3]
#깊은복사
a = [[1,2],2,3]
b = list(a) # list(a)라는 새로운 저장소를 생성하여 b 값을 복사한다.
b[0][0] = 'hi'

print(a) # [[1,2],2,3]
print(b) # [['hi'],2,3]

#또는
import copy
a = [[1,2],2,3]
b = copy.deepcopy(a) #메서드를 사용하는 것도 가능하다.
b[0][0] = 'hi'

print(a) # [[1,2],2,3]
print(b) # [['hi'],2,3]



💻인스턴스:


인스턴스 메서드: self.method(), object.method()

  • 인스턴스를 조작하기 위한 메서드

  • 클래스 내부에 정의되는 메서드의 기본

  • 호출 시, 첫번 째 인자로 인스턴스 자기자신(self)이 전달됨

생성자 메서드: __init__

  • 인스턴스 객체가 생성될 때 자동으로 호출되는 메서드

  • 인스턴스 변수들의 초기값을 설정

class Person:
    def __init__(self):
        print('인스턴스가 생성되었습니다.')

p1 = Person() # 인스턴스가 생성되었습니다.

소멸자 메서드: __del__

  • 객체가 소멸될 때 호출하는 메서드

  • 리소스 해제 등의 종료 작업을 위해 활용됨

#소멸자 메서드
class Person:
    def __del__(self):
        print('인스턴스가 사라졌습니다.')

p1 = Person()
del p1 # 인스턴스가 사라졌습니다.
class Person:
    #인스턴스가 생성될 때 특정 작업을 수행하게 한다.
    def __init__(self, name):
        #인스턴스의 이름을 정의해준다.
        self.name = name
        print('응애!')

#Person 클래스의 인스턴스를 생성
man = Person('김철수')
print(man.name)
woman = Person('김영희')
print(woman.name)

#아래의 방법으로 인스턴스의 속성 정의도 가능하다.
man = Person()
man.name = '홍길동'
print(man)
print(man.name)

⛔그래서 self가 무엇인가? : 생성된 인스턴스 자기자신을 뜻한다.


References

https://blog.hexabrain.net/285 (생성자와 소멸자)

https://journeytosth.tistory.com/73 (인스턴스 메서드 / 정적 메서드 / 클래스 메서드)

https://rok93.tistory.com/entry/%EC%96%95%EC%9D%80%EB%B3%B5%EC%82%AC-VS-%EA%B9%8A%EC%9D%80%EB%B3%B5%EC%82%AC (깊은복사 / 얕은 복사)

https://zzang9ha.tistory.com/372 (깊은복사 / 얕은 복사)