✅ 객체지향 프로그램이란?
✅ OOP 기초
✅ 객체와 클래스 문법
✅ OOP 속성
✅ 인스턴스 메서드
✅ 클래스 메서드
✅ 객체지향의 핵심 4가지
객체 지향 프로그래밍(Object-Oriented Programming,OOP)는 컴퓨터 프로그래밍의 패러다임중 하나이다.
객체 지향은 프로그램을 명령어의 (절차지향)목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위 즉, "객체"들의 모임으로 볼 수 있다.
각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있다.
조금 더 정리해서 말하자면, 절차지향의 경우 중간중간 필요한 정확한 위치에 기능을 넣어서 사용해야 하지만, 객체지향의 경우 원할때마다 해당 기능의 class를 불러와 인스턴스를 만들고 사용하면 된다. 이는 코드를 유지보수 하면서 더욱 두드러지게 된다.
클래스는 사용자가 직접 객체를 선언하고 객체 멤버를 구성하여 사용할 수 있다. 이 때 클래스의 범위와 용도를 지정해줄 수 있다. 이렇게 만들어진 클래스는 그 용도와 목적에 맞게 상속을 통한
이 가능하다. 즉, 다른 객체에서 해당 클래스의 내부 멤버를 세부 용도에 맞게 변경하여 사용할 수 있다. 외부 객체에서 접근 가능한 클래스명을 import하여 사용할 수 있으며, 외부 객체에서 끌어다 쓰는 이 클래스 내부 멤버들은 클래스를 구현하는 동안에만 수명이 지속된다.
모듈은 어느 개인이나 단체에 의해 이미 완성되어 있는 것을 사용자가 가지고온 후 그 모듈 객체와 객체 멤버를 끌어와 사용. 이런 모듈은 클래스와 다르게 상속을 통한 인스턴스화, 인터페이스 구현이 불가능하다. 즉, 다른 객체에서 해당 모듈의 내부 멤버를 변경하여 사용하지 못한다.
모듈의 내부 멤버에 프로그램 수명동안 접근이 가능
이름 : 박수철
직업 : 은행원
형제 : 1남 1녀
--- 속성(변수)
행동 : 축구를 한다.
업무 : 은행업무를 본다.
--- 행동(함수 - 메서드)
파이썬의 모든것은 속성과 행동이 존재하므로 객체이다.
예시
[1,3,2].sort() -> 리스트.정렬() -> 객체.행동()
또한, [1,3,2]는 리스트타입(클래스)의 객체 로 정의할 수 있다.
'', 'Hi', '파이썬' -> 모두 문자열타입(클래스)의 객체
객체(Object)는 특정 타입의 인스턴스(instance)이다.
'''
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()
class Person:
blood_color = 'red' # 클래스 변수
population = 100 # 클래스 변수
def __init__(self, name):
self.name = name # 인스턴스 변수
person1 = Person('지민')
print(person1.name) # 지민
메서드의 종류
1. 인스턴스 메서드
2. 클래스 메서드
3. 정적 메서드
class MyClass:
def instance_method(self, arg1, ...)
class Person:
def __init__(self, name):
print(f'인스턴스 생성.{name}')
person1 = Person('지민')
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
class Person:
def __init__(self, name):
print(f'인스턴스 생성.{name}')
person1 = Person('지민')
del person1
클래스 메서드는 클래스가 사용할 메서드를 의미한다.
(인스턴스 메서드는 외부에서 사용할 메서드)
class MyClass:
@classmethod
def class_method(cls, arg1,...)
이와 같이사용하며, 첫 번째 인자로 클래스(cls)가 전달된다.
면접 주요 질문!!!!!!
1. 추상화
2. 상속
3. 다형성
4. 캡슐화
'''
# 상속 예시
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 클래스 인스턴스 생성
# 상속을 하면 기존 클래스의 특징 그대로 사용 가능