CS

OOP 객체 지향 프로그래밍

haong_ 2022. 6. 15. 22:34

객체와 클래스

객체 Object

어떠한 속성(attribute)과 행동(behavior)을 가지고 있는 데이터. 객체들이 가진 속성중 상태는 value, 행동은 method 라고 부른다.
클래스에 선언된 모양 그대로 생성된 실체로 클래스의 인스턴스 라고도 부른다. 객체는 인스턴스를 대표하는 포괄적인 의미를 갖는다.

메서드 Method

특정 데이터 타입(or 클래스)의 객체에 공통적으로 적용가능한 행동(Behavior)

인스턴스 Instance

설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체. 
객체가 메모리에 할당되어 실제 사용 될 때 인스턴스라고 부른다. 

클래스 Class

객체들이 공통적으로 갖는 속성과 행위를 모아서 정의 내린것.
클래스를 통해 속성을 지정해 놓고 이 속성을 가지는 객체를 생성할 수 있다.(객체를 생성하는 설계도라고 생각하면 편함)

# 클래스 선언 
class 사각형:
	def __init__(self, 가로, 세로):
		self.가로 = 가로 # 속성 지정
		self.세로 = 세로
	def 면적(self): # 함수 지정
		return self.가로 * self.세로

a = 사각형(2, 4) # 사각형 클래스 인스턴스화 
b = 사각형(1, 1) # 속성만 지정해주면 계속 생성 가능
c = 사각형(3, 5)

a.면적() # 8 리턴 

예) 사각형이라는 클래스를 만들어 놓고 가로, 세로 길이를 속성으로 지정. 만들어둔 사각형 클래스의 인스턴스 객체를 선언하고 원하는 가로, 세로 값을 지정해 주면 지정된 속성으로 사각형 객체 생성. 계속 다른 값을 지정해주면서 사각형 클래스를 불러오면(위의 코드예제의 a, b, c처럼) 지정하는 대로 새로운 객체가 계속 생성된다.

생성자 Constructor

생성자의 이름 : init
객체가 생성될때 자동으로 호출되는 함수로 인스턴스 속성을 정의한다. (self는 인스턴스 자신을 의미)
따로 함수를 통해 속성을 지정해주지 않아도 객체 생성과 동시에 속성을 지정해 줄 수 있어서 편리하다. 

객체 지향 프로그래밍이란?

프로그램을 다양한 정보를 가진 객체들로 표현하고, 그 객체들 간의 상호작용을 통한 프로그래밍 방법.
개발과 유지보수, 업그레이드를 보다 쉽게 할 수 있게 해주는 장점이 있다. 
파이썬은 객체 지향 언어!

OOP의 구성

1) 추상화 Abstaction

추상화란?

  • 현실세계를 빗대어 공통의 속성이나 기능을 묶어 이름을 붙이는 것.
  • 객체의 공통된 속성들 중 필요한 부분만 클래스로 정의하는 설계 기법.
  • 변수의 값이나 내부 코드를 몰라도 사용 가능한것이 추상화의 원리.

이름 잘 짓기

  • 변수명에 해당 기능의 의미를 담아서 짓기. 이름만 보고 직관적으로 어디에 어떻게 쓰이는지 유추 가능.

문서화 하기 (Docstring)

  • 클래스, 메소드, 변수 등에 어떤 역할을 하는지 설명 적기.

2) 캡슐화 Encapsulation

캡슐화란?

  • 객체의 속성과 행동을 하나로 묶는 것.
  • 객체의 일부 구현 내용에 대한 외부로부터 직접적인 액세스 차단, 함수를 통해서만 접근 가능.

외부접근 차단 법 : 변수나 메소드 이름앞에 언더바 두개('__')를 붙여준다.

  • 파이썬에서는 언더바 하나를 앞에 붙여주면 private하게 간주되는 암묵적 약속(?)이 있다.

언더바가 붙은 변수 접근

  • 객체명.함수명으로 접근 ****
  • @property 데코레이터 사용 getter, setter 구현

property 데코레이터를 사용하면 메서드를 속성처럼 사용 가능.

# property 예제
class Person(): 
  def __init__(self): 
    self.__age = 0 
    
  @property 
  def age(self): # getter 
    return self.__age 
	@age.setter
  def age(self, value): # setter
    self.__age = value 
    
james = Person() 

james.age = 20 #인스턴스.속성 형식으로 접근하여 값 저장 
print(james.age) # 인스턴스.속성 형식으로 값을 가져옴
# 20

3) 상속성 Inheritance

상속이란?

  • 두 클래스 사이에 부모 자식 관계를 설정, 부모 클래스로부터 기능과 속성을 가져와 재사용.
  • 자식클래스에서 기능의 재정의, 새로운 기능 추가 가능.
  • 반복코드를 줄여줌.

isinstance, issubclass 함수로 인스턴스와 클래스 간의 관계 확인 가능.

Overriding

부모 클래스에서 정의한 메소드를 subclass에서 새롭게 정의하는것. (변경)
객체에 따라 함수 결과 값이 다르다. 

Overloading

같은 이름의 함수를 매개변수에 따라 다른 기능으로 동작하게 하는 것. (파이썬에는 오버로딩 지원안함)

4) 다형성 Polymorphism

다형성?

  • 같은 모양의 코드가 다른 동작을 하는 것.
  • 추상클래스에서 추상메서드를 만들고 이후에 오버라이딩하여 메서드를 재정의.
  • 재정의한 각각의 메서드들은 다른 행동을 나타냄.
  • 코드의 재사용성이 높아져 코드 길이 감소, 유지보수 용이.
# 다형성 예제 
class Animal: 
	def say(self): # 추상메서드 
		print('') 

# Animal 상속 
class Dog(Animal): 
	def say(self): 
		print('멍멍') # 오버라이딩
class Cat(Animal): 
	def say(self): 
		print('야옹') # 오버라이딩

dog = Dog()
cat = Cat()

# say라는 같은 함수명이지만 다른 클래스에서온 인스턴스이기 때문에 다른 결과가 나옴 
dog.say() # 멍멍
cat.say() # 야옹