객체지향프로그래밍(OOP : Object Oriented Programming)
- 객체 중심의 프로그램을 작성하는 방식
- 객체 끼리의 상호 작용을 통하여 프로그램을 작성하는 방식
- 부품화
- 캡슐화 == 클래스
- 속성과 기능을 하나의 블록으로 묶은 것
- 정보은닉
- 속성과 기능을 보호하기 위해서 접근을 제한하는 것
- 프로그램의 안정적 구현을 위해서
- 상속성
- 클래스 끼리 물려 주거나 물려받는 것
- 다형성
- 다양한 형태나 성질
- 하나의 객체를 여러개의 클래스로 표현하는 것들
객체(Object)
- 사전적인 의미로는 현실세계에 존재하는 모든 것들 하나의 대상체들
- 어떤 대상을 표현하기 위한 정보(속성)를 저장할수 있는 공간과 그 공간을 컨트롤 할 수 있는 기능(메소드)을 하나의 루틴으로 묶은
개별적인 개체로써 표현되는 변수
- 클래스라는 사용자 정의 자료형으로 만들어진 변수
클래스
- 어떤 대상을 표현하기 위한 정보(속성)를 저장할수 있는 공간과 그 공간을 컨트롤할수있는 기능(메소드)을 하나의 블록으로
묶어서 정의한 사용자 정의 자료형
- 클래스의 구성요소
- 속성 + 기능 + 보안(정보은닉)
- 멤버변수 + 멤버메소드 + 접근지정자 = class (사용자 정의 자료형)
- 클래스 상세 구조
class 클래스명:
클래스정의
멤버변수 - 데이터저장공간
멤버 메소드 - 클래스의 기능
- 생성자 - 클래스 객체 생성시 단 한번만 호출되는 메소드 - 객체의 초기 설정
- 소멸자 - 클래스 객체 소멸시 단 한번만 호출되는 메소드 - 객체 정리
- setter - 멤버 변수의 값을 셋팅하는 메소드
- getter - 멤버 변수의 값을 반환 하는 메소드
- user 메소드 - 사용자 필요에 의해 만들어지는 메소드
※ 클래스명은 클래스의 성격이 연상되는 단어로 이름을 지어준다
# 생성자 - __init__
# - 객체 생성시 단 한번만 호출되는 멤버 메소드
# - 객체 초기 설정을 위해서 사용한다
# 멤버변수 생성 다른 객체의 값 셋팅
# - 객체 생성 순서
# - 공간 할당 -> 생성자 호출
# 생성자는 우리가 정의 하지 않으면 자동으로 만들어진다
# 코드가 없다
# 아무런 기능이 없다
# - 객체 생성 순서 유지를 위해서 만들어진다
# -> None - 반환값의 형태를 명시하는 부분
# - 반환값이 없다
# self
# - 자기 자신을 호출한 인스턴스공간의 정보를 저장하는 참조형변수
# - 멤버 메소드에서만 사용 가능한 매개변수
# - 멤버 메소드라면 반드시 적혀야 한다
# - 인자값은 넣지 않아도 자동으로 참조된다
# - 멤버를 참조하기위한 참조형변수
class Info:
#생성자에서 셋팅할 데이터가 필요하다면 매개변수로 받아서 넣어주면 된다(self는 반드시 적어야 함)
def __init__(self,name = None,age = 0) -> None: # None은 자바의 void와 같은 성격
print("생성자 호출")
self.name = name # 멤버 변수 선언 - self를 통하여 선언해주어야 한다
self.age = age
a = Info(1,2,3,3,4,5)
print(id(a))
print(a.name)
class Info:
count = 0
# 클래스 멤버변수 - 클래스 전체의 객체가 공유하는 변수공간 - static이랑 비슷
# 모든 객체 통틀어 하나의 멤버변수 공간이 만들어진다
# 모든 객체가 하나의 공간을 참조하게 된다
# 이 클래스의 첫 객체가 만들어질때 만들어진다
# 항상 클래스를 통하여 접근하여야 한다
def __init__(self,name = None,age = 0) -> None:
print("생성자 호출")
Info.count += 1
self.name = name # 인스턴스 멤버 변수
self.age = age
def disp(self):
print(Info.count) # 권장방식
#print(self.count) # 비권장방식
print("이름 : {}".format(self.name))
print("나이 : {}".format(self.age))
self.count = 3
#print("키 : {:.2f}".format(self.height))
#print(Info.count)
a = Info("김코딩",20)
#a.height = 177.4# 멤버변수 선언
a.disp()
print("===") #구분선
b = Info("신코딩",27)
a.disp()
print("===") #구분선
#b.hei = 178
a = Info("김코딩",20)
a.disp()
print("===") #구분선
#접근 제한자(지정자, 제어자)
# - 클래스의 멤버를 접근을 단계적으로 제한할수 있는 키워드
# - 정보은닉을 위해서 사용한다
# - 멤버명 앞에 붙여서 적어주면 된다
#종류
# - private - __
# - 클래스 내부에서만 접근 가능함 그외의 외부에서는 모두 접근 불가
# - 일반적으로 별다른 제약이 없으면 멤버 변수는 private으로 설정된다
# - protected - _
# - 상속받은 클래스에서는 접근 가능함 그외의 외부에서는 접근 불가
# - 실제 런타임상의 제약사항이 아니다
# - 잘 사용되지 않는 접근 지정자
# - public - X
# - 클래스 내부와 외부 모두 접근 가능
# - 기본 디폴트 값
# - 일반적으로 별다른 제약이 없으면 멤버 메소드는 public으로 설정된다
# 데코레이터(자바의 어노테이션과 비슷함)
# - 바로 아래에 있는 영역에 강제적인 의미를 부여하는 키워드
# - @뒤에 알맞은 키워드를 함께 적고 밑에 코드를 구현하면 된다
# setter - 멤버변수의 값을 셋팅하는 메소드
# 1.메소드를 통한 접근
# - def set_멤버변수명(매개변수):
# 코드 정의
# 2.데코레이터를 사용하는 방식
# @멤버변수명.setter
# def 멤버변수명(self,매개변수):
# 코드 정의
# getter - 멤버변수의 값을 반환 하는 메소드
# 1.메소드를 통한 접근
# - def get_멤버변수명():
# return 멤버변수
# 2.데코레이터를 사용하는 방식
# @property
# def 멤버변수명(self):
# return self.멤버변수명
# property
# - 클래스의 멤버변수
class Info:
def __init__(self,name = None,age = 0) -> None:
print("생성자 호출")
self.__name = name
self.set_age(age)
#self.__age = age
#setter
def set_age(self,age):
if age < 1:
print("나이를 잘못입력하셨습니다.")
self.__age = 1
return
self.__age = age
#getter
def get_age(self):
return self.__age
@property
def name(self):
return self.__name
@name.setter
def name(self,name:str):
if name.__len__() < 2:
print("이름은 두글자 이상입니다.")
return
self.__name = name
def setData(self,name,age):
self.__name = name
self.set_age(age)
# if age < 1:
# print("나이를 잘못입력하셨습니다.")
# self.__age = 1
# return
# self.__age = age
def disp(self) -> None:
print("이름 : {}".format(self.__name))
print("나이 : {}".format(self.__age))
a = Info("김코딩",-20)
#print(a.name)
#print(a.__age)
#a.set_age(-30)
#print(a.get_age())
a.name = "이"
print(a.name)
#a.setData("이름없음",-50)
a.disp()
'PYTHON' 카테고리의 다른 글
[PYTHON] 상속 (0) | 2023.07.05 |
---|---|
[PYTHON] 클래스(소멸자) (0) | 2023.07.04 |
[PYTHON] 디폴트 매개변수 (0) | 2023.07.03 |
[PYTHON] dictionary (0) | 2023.06.30 |
[PYTHON] list와 tuple (0) | 2023.06.29 |