일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- jupyter notebook
- pmf
- 모수
- 조건부확률
- 기본행연산
- 통계학입문
- 절삭평균
- 수학적확률
- 행사다리꼴
- 이산확률질량함수
- 누적분포함수
- 표본공간
- 이항분포
- 통계학개론
- 사조사
- 첨가행렬
- 이산형
- 확률밀도함수
- 베르누이분포
- 연속확률변수
- 기댓값과 분산
- 모평균
- 포아송분포
- 이변량자료
- 피어슨상관계수
- Anaconda
- 수치형자료
- 표본평균
- 범주형자료
- 균일분포
- Today
- Total
Syeonny의 블로그
객체지향 기초 본문
객체
SW 객체는 현실 세계의 객체를 필드와 메서드로 모델링한 것이다.
- 필드: 객체의 상태. 변수로 치환 (ex. 데이터)
- 메서드: 객체의 동작. 코드로 표현
클래스
객체를 생성하기 위한, 객체에 대한 설계도
붕어빵 틀: 클래스
붕어빵틀로 붕어빵 만들기: 인스턴스화
만들어진 붕어빵 1개: 객체
생성자
객체가 생성될 때 기본값으로 초기화하는 특수 메서드
__init__ 메서드 사용하여 생성자 정의
같은 클래스를 여러 번 호출해서 사용할 때, 생성자를 사용하면 초기화됨.
생성자가 없으면 일일히 클래스를 사용할 때마다 초기화 시켜줘야함.
생성자가 없는 코드
class Calculator:
pass
# 여러 번 클래스를 호출할 때 매번 속성을 수동으로 초기화해야 함
calc1 = Calculator()
calc1.operand1 = 10
calc1.operand2 = 20
calc2 = Calculator()
calc2.operand1 = 15
calc2.operand2 = 25
print(calc1.operand1 + calc1.operand2) # 30
print(calc2.operand1 + calc2.operand2) # 40
생성자가 있는 코드
class Calculator:
def __init__(self, operand1, operand2): # 생성자
self.operand1 = operand1
self.operand2 = operand2
# 생성자를 통해 객체를 초기화
calc1 = Calculator(10, 20)
calc2 = Calculator(15, 25)
print(calc1.operand1 + calc1.operand2) # 30
print(calc2.operand1 + calc2.operand2) # 40
메서드
클래스 안에 정의된 함수
첫 번째 매개변수는 항상 self 로 설정
def 메서드명(self, ...):
...
메서드 호출 방법: 객체참조변수.메서드명
변수 종류
지역변수: 함수 안에 정의. 함수가 끝나면 사라짐
전역변수: 함수 밖에 정의. 프로그램 전체에서 접근 가능
인스턴스 변수: 클래스 안에 정의되며 self.변수명 으로 접근
접근자와 생성자
접근자: 인스턴스 변수값 반환하는 메서드. 보통 get_변수명()
생성자: 인스턴스 설정값 반환하는 메서드. 보통 set_변수명()
why? 직접 접근을 제한하고 안전하게 데이터를 다루기 위해
캡슐화 (= 정보 은닉)
데이터와 메서드를 하나로 묶고 공용 인터페이스만 외부에 제공
구현 세부사항은 감추는 것
객체의 상태(속성)를 외부에서 함부로 변경하지 못하도록 보호
필요할 경우 getter/setter 메서드를 통해 간접적으로 접근하도록 함
목적: 데이터 보호와 무결성 유지
이터레이터와 제너레이터
이터레이터?
한 번에 하나씩 값을 반환하는 객체
이터레이터는 iter() 함수로 생성되고, next() 함수로 값을 하나씩 꺼냄
값을 모두 꺼내면 더 이상 반환할 값이 없어서 StopIteration 예외 발생
제너레이터?
이터레이터를 생성하는 함수
값 반환할 때 return 대신 yield 키워드 사용
실행 상태를 멈추고 값을 반환하며 함수 호출 시 이전 상태에서 실행을 계속함
필요할 때마다 값을 하나씩 생성
# 제너레이터 함수 정의
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator() # 제너레이터 객체 생성
# next()를 사용하여 값 하나씩 꺼내기
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
추상화
복잡한 시스템에서 핵심적인 기능만 정의하고, 구체적인 구현은 숨기는 것
공통점만 모아서 설계하고, 세부적인 구현은 각 클래스에서 다르게 할 수 있음
추상 클래스: 공통된 인터페이스나 동작을 정의하는 클래스
추상 클래스 자체는 객체를 생성할 수 없음
목적 자체: 설계
모듈
함수나 변수 또는 클래스를 모아 놓은 파일
코드 재활용하기 위해 사용됨
.py
가져오는 방법
import
from 모듈 import 함수나 변수
상속
상위 클래스(부모)로부터 객체를 이어받음(상속) + 자신이 필요한 기능(코드)만 추가하여 사용하는 것
부모클래스 생성자 호출 super() 사용
class Parent:
def __init__(self, name):
self.name = name
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # 부모 생성자 호출
self.age = age
다중 상속: 한 클래스가 여러 부모 클래스로부터 상속받을 수 있음
메소드 오버라이딩
자식 클래스의 메소드가 부모 클래스의 메소드를 오버라이드(재정의)
부모 클래스의 메서드 이름과 동일한 이름으로 작성하여, 새로운 동작을 구현
자식 클래스의 필요에 맞게 변경하기 위함.
다형성
동일한 메서드 호출방식으로 다양한 타입의 객체를 처리할 수 있는 기법
상속을 기반으로, 부모 클래스의 참조 변수에 자식 클래스의 객체를 할당
class Animal:
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Woof!"
class Cat(Animal):
def sound(self):
return "Meow!"
def make_sound(animal: Animal):
print(animal.sound())
make_sound(Dog()) # Woof!
make_sound(Cat()) # Meow!