Python 11. OOP

jonghyuck’s velog·2022년 7월 27일
0

Python 정리

목록 보기
12/12
post-thumbnail

✅ 객체지향 프로그램이란?
✅ OOP 기초
✅ 객체와 클래스 문법
✅ OOP 속성
✅ 인스턴스 메서드
✅ 클래스 메서드
✅ 객체지향의 핵심 4가지

✅ 객체지향 프로그램이란?

객체 지향 프로그래밍(Object-Oriented Programming,OOP)는 컴퓨터 프로그래밍의 패러다임중 하나이다.

객체 지향은 프로그램을 명령어의 (절차지향)목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위 즉, "객체"들의 모임으로 볼 수 있다.

각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있다.

  • 한줄 정리
    • 프로그램을 여러 개의 독립된 객체들과 그 객체 간의 상호작용으로 파악하는 프로그래밍 방법

🖍 객체 지향이 필요한 이유

  • 어떤 역할을 해야하는 메서드나 클래스를 분리하기 위해서(추상화 개념)
  • 유지보수가 편하기 때문
  • 코드의 재사용률이 올라간다

조금 더 정리해서 말하자면, 절차지향의 경우 중간중간 필요한 정확한 위치에 기능을 넣어서 사용해야 하지만, 객체지향의 경우 원할때마다 해당 기능의 class를 불러와 인스턴스를 만들고 사용하면 된다. 이는 코드를 유지보수 하면서 더욱 두드러지게 된다.

❓그렇다면 클래스와 모듈의 차이는???

클래스

클래스는 사용자가 직접 객체를 선언하고 객체 멤버를 구성하여 사용할 수 있다. 이 때 클래스의 범위와 용도를 지정해줄 수 있다. 이렇게 만들어진 클래스는 그 용도와 목적에 맞게 상속을 통한

  1. 인스턴스화
  2. 인터페이스 구현

이 가능하다. 즉, 다른 객체에서 해당 클래스의 내부 멤버를 세부 용도에 맞게 변경하여 사용할 수 있다. 외부 객체에서 접근 가능한 클래스명을 import하여 사용할 수 있으며, 외부 객체에서 끌어다 쓰는 이 클래스 내부 멤버들은 클래스를 구현하는 동안에만 수명이 지속된다.

모듈

모듈은 어느 개인이나 단체에 의해 이미 완성되어 있는 것을 사용자가 가지고온 후 그 모듈 객체와 객체 멤버를 끌어와 사용. 이런 모듈은 클래스와 다르게 상속을 통한 인스턴스화, 인터페이스 구현이 불가능하다. 즉, 다른 객체에서 해당 모듈의 내부 멤버를 변경하여 사용하지 못한다.
모듈의 내부 멤버에 프로그램 수명동안 접근이 가능

  • 모듈과 클래스는 용도에 맞게 구성한 객체 멤버들을 캡슐화 시킨 후 가져다 사용한다는 부분에서는 동일하지만, 그 사용성에서 가장 큰 차이가 존재
  • 모듈은 보통 다운받은 파일을 프로그램에 포함시켜 놓고 자유롭게 사용하는 반면, 클래스는 그 목적에 맞게 각 프로세스에서 상속하여 사용
  • 모듈은 내부 멤버를 변경하여 사용할 수 없지만 상속받은 클래스는 멤버를 자유롭게 변경할 수 있다

📍 객체지향의 장점과 단점

  • 장점
    • 클래스 단위로 모듈화시켜 개발할 수 있으므로 많은 인원이 참여하는 대규모 소프트웨어 개발에 적합
    • 필요한 부분만 수정하기 쉽기 때문에 프로그램 유지보수가 쉬움
  • 단점
    • 설계가 어려움(많은 노력과 시간 필요)
    • 실행 속도가 절차지향에 비해 느림

✅ OOP 기초

📍 객체

  • 클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것
  • 속성행동으로 구성된 모든 것

예시

이름 : 박수철
직업 : 은행원
형제 : 11--- 속성(변수)
행동 : 축구를 한다.
업무 : 은행업무를 본다.
--- 행동(함수 - 메서드)


파이썬의 모든것은 속성과 행동이 존재하므로 객체이다.

예시
[1,3,2].sort() -> 리스트.정렬() -> 객체.행동()

또한, [1,3,2]는 리스트타입(클래스)의 객체 로 정의할 수 있다.

'', 'Hi', '파이썬' -> 모두 문자열타입(클래스)의 객체

객체(Object)는 특정 타입의 인스턴스(instance)이다.

  • 123, 900, 5 -> int의 인스턴스
  • 'hello', 'byb' -> str의 인스턴스
  • [1,2,3], [4,5,6] -> list의 인스턴스

객체의 특징

  • type(타입) = 어떤 연산자와 조작(method)이 가능한가?
  • 속성(attribute) = 어떤 상태(데이터)를 가지는가?
  • 조작법(method) = 어떤 행위(함수)를 할 수 있는가?

✅ 객체와 클래스 문법

  • 객체의 설계도(클래스)를 가지고, 객체(인스턴스)를 생성
    • 클래스 : 객체들의 분류 ( 설계도 )
      • 클래스의 첫문자는 대문자를 사용한다.
    • 인스턴스 : 하나하나가 실체 ( 실제 제품 )

클래스 생성 예시

'''
1. 클래스 생성
'''
class Student:

	kor_grade = '고등학생'
    student_cnt = 0
    # 위 두가지 클래스 변수는 모든 인스턴스에 공통으로 들어가는 속성이므로 클래스 변수 처리
    
	def __init__(self, name, age, score): # init메서드 : 생성자(Constructor)
        self.age = age
        self.name = name
        self.score = score
    
    def say_hello(self):
    	print(f'안녕하세요 저는 {self.age}{self.name} 입니다.')
        Student.student_cnt # 인스턴스 내에서 클래스 변수 접근
        '''
        다른언어의 this와 비슷함!!!
        self : 만들어지는 인스턴스의 이름을 뜻하는 매개변수
        self는 argument에 적지 않는다!
    	생성자 안에, 생성하려는 속성을 작성
        '.'opterator >>>> 대상.속성같은 느낌 (대상의 속성을 가져와라)
        '''
    @classmethod   
    def plus_student_cnt(cls):
    	Student.student_cnt += 1
    	
'''
2. 객체(인스턴스) 생성
클래스이름() : >>> 생성자 호출
'''
s1 = Student('홍길동', 15, 80) # 객체 생성 및 객체 **주소값**을 변수에 할당
'''
s1은 Student 클래스의 인스턴스를 지칭하기 때문에 s1을 인스턴스라고 한다.
s1은 Student 클래스에 선언한 특징(속성 및 메서드)를 가지고 있음
s1. << '.'operator 사용하면 s1의 속성값 및 메서드 사용 가능
학생들의 속성(이름,나이,점수)를 넣어봅시다.
실제세계에서 학생들은... 전부 다른 속성값을 가지고 있다.
>>>> 인스턴스마다 다른 값을 가진다!!! >>>> 이런 특징을 가지는 값
우리는 인스턴스 변수라는 곳에 저장
'''
s2 = Student('김길동', 26,100)
s3 = Student('삼길동', 25, 32)
#... 계속 만들수 있음
########################클래스 변수 #######################
'''
클래스 변수는 인스턴스와 상관없습니다. 인스턴스가 있던 말던
사실은 인스턴스를 통해 접근가능하긴 합니다.
'''
s1.student_cnt = 100  #형태로 접근 가능
'''
하지만 이렇게 쓰면 안된다. 웬만하면 클래스접근 방식을 사용하자.
'''
Student.student_cnt = 100
print(Student.student_cnt)
#########################메서드 시작######################
'''
메서드 : 클래스 내부의 데이터를 활용해서 동작하는 함수
인스턴스 메서드 : 인스턴스 변수를 활용, 첫번째 인자는 self로 고정
클래스 메서드 : 클래스 변수를 활용
스태틱 메서드 : 인스턴스 또는 클래스 변수를 활용하지 않는 메서드
클래스 내에서 인스턴스 변수, 메서드를 사용하기 위해서는
항상 self.'뭐시기[()]' 형태로 사용합니다
'''
s1.say_hello()

📍 객체 비교하기

  • ==
    • 동등한(equal)
    • 변수가 참조하는 객체가 내용이 같을경우 True
    • 두 객체가 같아 보이지만 실제로 동일한 대상을 가리키는지는 확인하지 않음
  • is
    • 동일한(identical)
    • 두 변수가 동일한 객체를 가리키는 경우 True

✅ OOP 속성

  • 특정 데이터 타입 or 클래스의 객체들이 가지게 될 상태 or 데이터를 의미
  • 클래스 변수 or 인스턴스 변수가 존재
class Person:
	blood_color = 'red' # 클래스 변수
    population = 100 # 클래스 변수
    
    def __init__(self, name):
    	self.name = name # 인스턴스 변수

person1 = Person('지민')
print(person1.name) # 지민

인스턴스 변수란?

  • 인스턴스가 개인적으로 가지고 있는 속성(attribute)
  • 각 인스턴스들의 고유한 변수
  • 생성자 메서드 (__init__)에서 self.<name>으로 정의
  • 인스턴스가 생성된 이후 <instance>.<name>으로 접근 및 할당

클래스 변수란?

  • 한 클래스의 모든 인스턴스가 공유하는 값
  • 같은 클래스의 인스턴스들은 같은 값을 갖게 됨
    • 예시 : 특정사이트의 User의 수
  • <classname>.<name>으로 접근 및 할당

✅ 인스턴스 메서드

메서드의 종류
1. 인스턴스 메서드
2. 클래스 메서드
3. 정적 메서드

  • 인스턴스 변수를 사용하거나 설정하는 메서드
  • 클래스 내부에 정의되는 메서드의 기본
  • 호출시 첫번째 인자로 인스턴스자신 self가 전달됨
    • self매개변수는 첫번째 인자로 정의
    • 다른 단어도 사용가능하지만 암묵적 규칙
class MyClass:
	def instance_method(self, arg1, ...)

📍 생성자(constructor)

  • 인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
  • 인스턴스 변수들의 초기값을 설정
class Person:
  	def __init__(self, name):
  		print(f'인스턴스 생성.{name}')
person1 = Person('지민')

📍 매직메서드 or 스페셜메서드

  • 특정 상황에 자동으로 불려지는 메서드
    • __str__(self), __len(self)__등이 존재
class Circle:
	def __init__(selfm, r):
  		self.r = r
    def area(self):
  		return 3.14 * self.r * self.r
  	def __str__(self):
  		return f'[원] radius: {self.r}'
  	def __gt__(self.other):
  		return self.r > other.r
c1 = Circle(10)
c2 = Circle(1)
print(c1)
print(c2)
print(c1 > c2)
print(c1 < c2)

[원] radius : 10
[원] radius : 1
True
False

  • __str__ : 어떤 인스턴스를 출력하면 __str__의 return값이 출력
  • __gt__: 부등호 연산자

📍 소멸자(destructor)

class Person:
  	def __init__(self, name):
  		print(f'인스턴스 생성.{name}')
person1 = Person('지민')
del person1

✅ 클래스 메서드

클래스 메서드는 클래스가 사용할 메서드를 의미한다.
(인스턴스 메서드는 외부에서 사용할 메서드)

class MyClass:
	@classmethod
    def class_method(cls, arg1,...)

이와 같이사용하며, 첫 번째 인자로 클래스(cls)가 전달된다.

  • 여기서 @classmethod(데코레이터)를 사용해야 해당 함수가 클래스 메서드로 사용됨을 선언하는것임을 인지하자!

데코레이터

  • 함수를 어던 함수로 꾸며서 새로운 기능을 부여
  • @데코레이터(함수명)형태로 함수 위에 작성
  • 순서대로 적용 되기 대문에 작성 순서가 중요

스태틱 메서드

  • 인스턴스, 클래스의 변수 아무것도 사용하지 않을 경우 사용
    - 객체의 상태, 클래스 상태를 수정 불가
  • 일반함수처럼 동작하지만, 클래스의 이름공간에 귀속
  • @staticmethod 데코레이터를 사용하여 정의

✅ 객체지향의 핵심 4가지

면접 주요 질문!!!!!!
1. 추상화
2. 상속
3. 다형성
4. 캡슐화

📍 상속

  • 상속이란?
    • 이미 완성되어있는 코드를 재사용하기 위한 방법중 하나
    • 부모 클래스가 가지는 특징(속성, 메서드)을 재사용하기 위한 방법
  • 클래스는 상속이 가능함
    • 모든 파이썬 클래스는 object를 상속 받음
'''
# 상속 예시
class ChildClass(ParentClass):
	pass
'''
class Shape: #부모 클래스(super class)
	pass
    def __init__(self, name, area):'
    	self.name = name
    	self.area = area
    def draw(self):
    	print(f'{self.name}을 그립니다.')
        
# 여기까지가 부모클래스이면서 공통된 속성들
# 별도의 각각 속성들은 child class에 작성

class Rectangle(Shape): # Shape 클래스 상속
	def __init__(self, width, height):
    	self.width = width
        self.height = height
        '''
        만약, 부모클래스의 init 변수또는 정보가 8필요하다면, 
        부모클래스의 생성자 호출하기
        자식 클래스 내에서 부모클래스를 지칭할 때
        super 키워드를 사용
        super().__init__()
        '''
       
class Circle(Shape): # Shape 클래스 상속
	def __init__(self, radious):
    	self.redious = radiousj
    
rect1 = Rectangle() # Rectangle 클래스 인스턴스 생성
# 상속을 하면 기존 클래스의 특징 그대로 사용 가능
  • 또한, 파이썬은 다중상속(한번에 두가지 상속)이 가능하다.

📍 다형성

  • 동일힌 메서드가 클래스에 따라 다르게 행동할 수 있음을
    의미
  • 즉, 서로 다른 클래스에 속해있는 객체들이 동일한 메시지에 대해 다른 방식으로 응답할 수 있음

0개의 댓글