객체지향 프로그래밍

이상해씨·2023년 4월 6일
0

AI 기초

목록 보기
10/15

OOP

  • 객체 지향 프로그래밍 언어 (oop)

  • 실제 세상을 모델링한 것

  • 일련의 순서가 아닌, 객체(주체)와 객체의 행동, 데이터를 중심으로 작성

  • 객체 : 일종의 물건. 속성과 행동을 가짐
    1) 속성 : 변수
    2) 행동 : 함수

  • 기존의 코드를 재사용

1. OOP구분(클래스와 객체)

1) 클래스(CLASS) : 설계도
2) 인스턴스(instance) : 구현체, 우리가 사용하는 것

2. 클래스 구현하기

class Student(object):
	def __init__(self, name :str, number: int):
    	self.name =name
    	self.number= number
    def change_number(self, number):
    	print("번호 변경")
        self.number =number
    

2-1. 클래스 이름 작성하기

class 클래스이름(객체명):

  • 작명 case
  • snakecase 띄워쓰기를 로 표현 (함수, 변수명)
  • CamelCase: 띄워쓰기 부분에 대문자 (Class)

2-2. 속성 추가하기

속성 추가는 init, self로..!!
init은 객체를 초기화하는 예약함수
![]

  • 클래스는 속성정보와 행동정보가 필요
  • init을 통해 속성정보 설정 가능
  • self.를 통해 속성정보를 초기화
  • 는 특수 예약 함수 , 맨글링(함수이름 변경)으로 사용 (main, str, add__)
  • self.name과 name은 다른 객체

3. OOP 특성

1) 상속(Inheritance)
2) 다형성 (polymorphism)
3) 시각성 (visibility)

3-1. 상속

  • 자식 클래스가 부모 클래스에게서 속성과 방법(method)를 물려받는 것
  • 자식 클래스에 parameter가 없어도 부모 클래스에서 상속을 받음 .
#부모 클래스
class Parent:
	def __init__ (self, name, age):
    	self.name=name
        self.age= age

#자식 클래스 
class Child(Parent):
	def __init__(self,name, age):
    	super().__init__(name, age) 
        self.name=name
        self.age= age
  • super() : 부모클래스의 함수를 사용하겠다는 의미.
  • self : 자기 자신을 불러오겠다는 의미.

3-2. 다형성

  • 같은 이름 메소드의 내부 로직을 상속하거나 다르게 작성
  • 개념적으로 같은 일은 하는데 세부적으로 기능이 다른 기능을 구현하는 것을 의미
  • 파이썬에서는 dynamic Typing 특성으로 인해 같은 부모클래스의 상속
class Cat:
	def talk():
    	print("야옹")

class Dog:
	def talk():
    	print("멍멍")

3-3. 가시성(visuality) = 캡슐화

  • 객체 정보를 보는 정도를 조정
  • 모든 사람이 정보에 접근및 수정하는 것을 방지
  • 소스코드의 보호

캡슐화(Encapsulation)

  • 정보은닉(hidden information)
  • 클래스 설계시 클래스 간의 정보공유를 최소화하고 인터페이스만 알면 사용할 수 있도록 함
  • 사용법만 알면 누구나 소스코드를 사용할 수 있다.

1) private 변수(.__)로 다른 사람들이 쉽게 접속할 수 없게 함.

sel.__items=[]

2) 데코레이터(property decorator)를 추가하여 내부에서는 접근할 수 있게끔 처리. 숨겨진 변수를 반환하게 해줌

```
Class
.
.
.

@property
def items(self):
	return self.__items
.
.
.

items= My_bag.items # property decorator로   변수처럼 함수를 호출할 수 있다. 
My_bag.items.append("a") # 추가할 수 있다. 
    ```
  • 바로 수정하면 class 내부도 수정됨으로 copy하여 변수를 사용하자.

4

4-1. 일급함수(First-class)

  • 일급객체
  • 변수와 데이터 구조에 할당을 할 수 있는 객체
  • parameter, return 값으로 사용
  • 파이썬 함수
def square(x):
	return x*x
    
def cube(x):
	return x*x*x
    
def formula(method, list): #함수를 parameter로 넣음
	return [method(value) for value in list]
	# list에서 value를 가져와 square와 cube함수를 적용 
  • 한 값에 대하여 여러 함수를 적용하고자 할 때 사용

4-2. 내재함수(inner function)

  • 함수 속에 또 다른 함수가 존재하는 경우
def A(datas):
	def B(): 
    	prinT(datas)
    B()

A("Hello World!")
  • 많이 사용하는 방식

  • closures : 내재함수를 return값으로 반환
    - tag_func

    	```
    	def A(datas):
    		def B(): 

    prinT(datas)
    return B

    	another= A("Hello World!")

    anoter()

    	```

4-3. 데코레이터(decorator)

  • 복잡한 closures함수를 간단하게 만들어줌
def trace(func):                             # 호출할 함수를 매개변수로 받음
    def wrapper():
        print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
        func()                               # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                           # wrapper 함수 반환
 
@trace    # @데코레이터
def hello():
    print('hello')
 
@trace    # @데코레이터
def world():
    print('world')
 
hello()    # 함수를 그대로 호출
world()    # 함수를 그대로 호출

(출처: https://dojang.io/mod/page/view.php?id=2427)



참고

profile
공부에는 끝이 없다

0개의 댓글