* 객체 지향 프로그래밍(Object Oriented Programming)
- 현실세계의 사물과 사물들이 메시지를 통해 상호작용하는 구조를 소프트웨어로 구현한 프로그래밍 방식
- 현실세계의 사물 = 소프트웨어상의 객체
- 다수의 사용자가 기존의 절차지향 프로그램을 사용하면 병목현상이 발생하여, 함수 처리의 부하를 감소시키기 위해 개발
- 프로그램의 유지보수성을 향상시킴
- 절차지향 프로그램의 개선안일 뿐, 완전히 대체되는 것은 아님
* 함수
- 독립적인 기능을 수행할 수 있는 코드의 집합
- 정의 > 호출 2단계를 거침
- 인수와 매개변수는 이름을 다르게 하는 것이 좋음
* 클래스(class)
- 공통 기능을 갖는 함수들을 하나로 묶을 수 있는 단위
- 객체를 생성할 수 있도록 객체 내에서 공유할 수 있는 자료와 그 자료들을 처리하는 함수를 묶어 정의한 것.
- 구성요소 : 멤버(Member) + 생성자(Constructor) / 변수 + 메서드(생성자 포함) 이라고도 함
- 멤버 : 멤버변수(자료) + 메서드(기능) (=속성, 행위)
- 속성(attribute) : 자료를 뜻함. 변수 또는 필드
- 행위(action) : 기능을 뜻함. 함수 또는 메서드
- C언어의 구조체와 비슷한 역할을 하는 일종의 사용자 정의형 자료구조
- 함수처럼 외부에서 넘겨받는 매개변수가 없고, 객체를 생성하기 위한 생성자 함수를 포함
- 객체를 통해 함수를 호출하기 때문에 클래스 내부의 메서드 밖에는 '함수들을 반환하는' return문이 없음
- 클래스 정의 > 객체 생성 > 생성한 객체 사용 3단계를 거침
* 객체(object)
- 소프트웨어로 '구현 할' 현실세계의 사물
- 클래스에 의해 만들어지는 결과물
- 클래스의 속성에 실제 자료가 들어가고, 실제 자료를 동작시키는 함수가 하나로 묶여진 단위
- 객체를 생성하지 않으면 클래스의 멤버를 쓸 수 없음
- 클래스와 객체는 1 : N의 관계를 가짐
- 운영체제의 제어를 받으며, 소스코드 안에 직접적으로 보이진 않음
* 인스턴스(instance)
- 클래스에 의해 소프트웨어에 '구현 된' 실체
- https://cerulean85.tistory.com/149
- 방금, 가장 최근 만들어진 것(즉시성)
- 실체화된 인스턴스는 메모리에 할당
- 객체와 확실하게 구분되는 개념은 아님
* 생성자
- 메서드의 일종으로, __init__이라는 이름과 self라는 매개변수를 포함하여 선언됨
- self 매개변수는 생성자 내에서 클래스의 멤버를 호출하는 데 이용
- 매개변수는 객체가 생성되는 시점에서 외부의 실인수를 받아 멤버변수에 초기화하는 역할
- 객체 생성과 동시에 지역변수 초기화 역할을 함
- 초기화 대상이 없으면 생략할 수 있으며, 생략 시 파이썬에서 기본 생성자를 만들어줌
- 참고자료 : 생성자를 여러개 만들고 싶을 때 (클릭 시 링크로 이동)
* 메서드
- 클래스에 포함된 함수
- 객체 생성 후 참조변수명을 통해 접근
- 함수의 선언과 동일하지만 멤버변수를 사용하기 위해 self라는 매개변수를 포함하고 있음
- self는 기본적으로 작성하는 것. 별도의 인수를 받지는 않음.
* 객체 생성
- 클래스의 생성자를 이용하여 생성 (객체를 생성하면 생성자가 제일 먼저 실행)
- 참조변수 = 클래스명(실인수) 와 같이 객체 생성
- 실인수(actual parameters, arguments) : 생성자의 매개변수에 전달할 실제 값(인수)
- 가인수(formal parameters) : 메서드에 정의된 매개변수
- ex ) obj = calc_class(10, 20)
1. 클래스 calc_class에 10, 20의 인수를 가지고 접근.
2. 가장 먼저 생성자가 실행됨. 생성자에 10, 20이 대입되어 멤버변수 초기화와 동시에 객체를 생성.
3. 참조변수 obj에 생성된 객체를 가리키는 주소 저장.
대입연산자 '='는 연산자 우선순위의 가장 마지막이기 때문에
'='의 오른쪽부터 실행된 후 obj에 값이 할당되는 구조로 생각하면 좋음.
* 멤버 호출
- 생성된 객체의 참조변수를 이용하여 객체의 멤버 호출
- 참조변수.멤버(변수 or 메서드)
- 클래스에 의해 서로 독립적인 객체가 만들어지고, 참조변수에 의해 객체를 참조하는 메커니즘
* class 예시
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 31 32 33 34 35 36 37 38 39 40 | # 클래스 정의 class calc_class : # 클래스 변수 : 자료 저장 x = y = 0 # 생성자 : 객체 생성 + 멤버변수 초기화 # 메서드 내부가 아닌 # 클래스 내부 && 메서드 바깥에서 변수가 선언되었다는 것을 표시하기 위해 # self 키워드를 씀. 안쓰면 클래스 멤버 변수로 간주되지 않음. def __init__(self, a, b) : print('~~객체 생성~~') self.x = a # 10 self.y = b # 20 # 클래스 함수 (메서드) def plus(self) : # self : 멤버(변수+함수) 참조 객체 p = self.x + self.y # 변수 연산 # p : 지역변수 # self.x, self.y : 전역변수 # 지역변수, 전역변수 개념은 기준에 따라 달라질 수 있음 return p # 클래스 함수 / 멤버 함수(기능) def minus(self) : m = self.x - self.y # 변수 연산 return m # 객체 생성 # class(1) -> object(n) 생성 obj = calc_class(10, 20) print(type(obj)) # <class '__main__.calc_class'> print(obj) # <__main__.calc_class object at 0x000001866E62BB50(주소값)> obj2 = calc_class(10, 20) print(obj2) # 다른 주소 출력 # 멤버 호출 # object.member() print('plus = ', obj.plus()) # plus = 30 print('minus = ', obj.minus()) # minus = -10 | cs |
* 생성자 예제
Q. 클래스 내부에 num1, num2 멤버 변수와 나눗셈 함수 div와 제곱 함수 squ를 선언하고 결과를 출력하는 프로그램
0을 입력할 경우 나눗셈 오류 문장 출력
A.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # ver.1 (사용자 정의 생성자) class Calc_class: def __init__ (self,x,y): self.num1 = x self.num2 = y def div(self): if self.num1 <= 0 or self.num2 <= 0 : return print("나눗셈연산은 0으로 나누기가 불가능합니다. 다시 입력하세요.") else : return self.num1 / self.num2 def squ(self): return self.num1 ** self.num2 obj = Calc_class(int(input("1번째 정수를 입력하세요:")),int(input("2번째 정수를 입력하세요:"))) print ("나눗셈 : ",obj.div()) print ("제곱 : ",obj.squ()) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # ver.2 기본 생성자 사용 class calc_class12: def member_clear(self,x,y): self.num1 = x self.num2 = y def div(self): try : return self.num1 / self.num2 except ZeroDivisionError : # 에러메시지 복붙 print("나눗셈연산은 0으로 나누기가 불가능합니다. 다시 입력하세요.") def squ(self): return pow(self.num1, self.num2) # pow 제곱 함수 c1 = calc_class12() c1.member_clear(int(input("정수를 입력하세요 : ")),int(input("정수를 입력하세요 : "))) print ("나눗셈 : ",c1.div()) print ("제곱 : ",c1.squ()) | cs |
'study > python' 카테고리의 다른 글
파이썬 pandas - 데이터프레임(DataFrame) 생성 및 데이터 출력 (0) | 2022.07.28 |
---|---|
파이썬 pandas - 시리즈(Series) (0) | 2022.07.27 |
파이썬 pandas, jupiter - 환경 설치, 설정 (0) | 2022.07.27 |
파이썬 데이터베이스 - csv, json 파일 형식 다루기 (0) | 2022.06.17 |
파이썬 데이터베이스 - MySQL 연동하는 법과 SQL문 활용 (0) | 2022.06.13 |
댓글