Python 기초 - 9.클래스
클래스 정의
class 클래스명:
def __init__(self): #생성자. 객체 초기화, 객체의 멤버변수 정의.
멤버변수 정의 #멤버변수란 클래스 소속의 변수
def 기능(self):
실행문
- 클래스명은 첫글자 대문자, 뒤는 소문자 형식 사용
- self : 현재 객체. 여기서 아직 객체를 생성한 시점이 아니기 때문에 객체 이름을 알 수 없으므로 self 로 표현
멤버변수
정수 한 개: int
실수 한 개: float
문자열 한 개: str
카드정보 한 개: ??? ← 당연히 파이썬에는 정의되어 있지 않음. 직접 타입을 만들어야 한다.
⇒ class Card 를 정의
⇒ 카드번호, 카드명의자, 카드비밀번호와 같은 값들을 담으려면 클래스 안에 변수들이 필요
멤버 변수 = 클래스 안에 담는 변수
멤버변수 정의 (클래스 정의 안에 위치)
방법1.
def __init__(self):
self.number = ''
self.owner = ''
self.pwd = ''
self.comp = ''
방법2.
def __init__(self, number, owner, pwd, comp):
self.number = number
self.owner = owner
self.pwd = pwd
self.comp = comp
- 방법2 사용할 경우 객체 생성할 때 모든 멤버변수에 값을 넣어줘야 함. (방법1은 따로 정의 가능)
- 멤버변수에 기본값이 필요. 기본값이 pwd = ‘1234’ 처럼 미리 설정이 되어있을 경우 객체 정의할 때 생략가능
객체정의
- 객체(클래스로 만든 변수)는 바로 값을 할당할 수 없고 먼저 생성해야함. 생성하는 방법은 생성자 호출. 생성자 호출은 클래스이름().
- . : 멤버접근연산자
class Card: # Card라는 이름의 타입을 정의함. 이 타입의 변수는 카드 1개의 정보를 담을 수 있다.
def __init__(self): # 첫번째 파라미터는 현재 객체의 참조값을 받는다. 이름은 self가 아니어도 됨 (그러나 대체적으로 self를 사용함)
self.number = '' # 멤버변수 표현은 앞에 'self.변수이름' 형태로 표현한다. 카드번호
self.owner = '' # 카드명의자
self.pwd = '' # 비밀번호
self.comp = '' # 카드회사
def printCard(self):
print('number:', self.number)
print('owner:', self.owner)
print('pwd:', self.pwd)
print('comp:', self.comp)
def main():
x = 10 # 일반변수 정의: 변수이름 = 값
# 객체(클래스로 만든 변수). 값을 할당하기 전 먼저 생성자 호출을 해야 함
c1 = Card() # 객체정의
c1.number = '1234-5678-9010-1112' # 멤버변수 정의, '.' 은 멤버접근 연산자
c1.owner = '아무개'
c1.pwd = '1111'
c1.comp = '신한'
c1.printCard()
또는
class Card:
def __init__(self, number, owner, pwd, comp):
self.number = number
self.owner = owner
self.pwd = pwd
self.comp = comp
def printCard(self):
print('number:', self.number)
print('owner:', self.owner)
print('pwd:', self.pwd)
print('comp:', self.comp)
def main():
c1 = Card('1234-5678-9010-1112', '아무개', '1111', '신한')
c1.printCard()
- 멤버변수값을 정의할 때 멤버변수를 지정해주면(예, owner=’홍길동’) 순서를 안지켜도 된다.
클래스를 정의할 때는 객체 1개를 기준으로 객체의 정의에 포함되는 변수만 멤버로 정의하는 것이 “객체지향” 의 의미에도 부합되고 협업하기에 좋다.
- 객체 안에 변수로 객체가 들어갈 수도 있다 = 포함관계; 클래스 타입의 멤버변수
- 포함관계 - has a, 소유되는 관계
- 상속관계 - is a, 따로 정의하지 않아도 이미 부여되어 있는 값의 관계
중간정리
클래스와 객체의 정의는 어렵지만 확실히 이해해야하는 부분. 면접에서 질문할 수 있는 부분이기에 답변이 가능할 정도로 확실하게 이해하고 기억하자
-
데이터 타입 정의 ⇒ 클래스 정의 (이 시점에는 메모리가 아직 없음. “디자인타임”)
-
클래스를 정의하는 것은 새로운 타입을 정의하는 것과 같다
-
만든 타입으로(클래스로) 변수 생성 = 객체 생성 ⇒ 메모리 할당
-
생성한 변수(객체)에 값을 할당하거나 읽음
-
생성한 변수(객체)의 메서드 호출
-
메서드란?
데이터 타입별로 사용할 수 있는 함수. 예를들어 append()는 데이터 타입이 리스트인 경우 사용이 가능하고 일반 변수에는 쓸 수 없다. 클래스의 경우 새로운 데이터 타입을 정의하는 것이므로, 클래스 메서드는 해당 클래스만 사용이 가능한 함수가 된다.
-
-
객체 정의
- 모델링 할 때의 객체 = 샘플 → 샘플을 바탕으로 클래스 구성
- 개발에서의 객체 = 클래스 변수
클래스 디자인 패턴
- VO (Value Object) / DTO (Data Transfer Object) - 데이터를 담고 있는 것 자체로 의미를 가지는 클래스 (데이터의 저장소)
- 역할: 캡슐화, 값/데이터 묶음
- DAO (Data Access Object) - DB 또는 리스트 등 데이터의 집합에 접속하여 데이터의 추가/수정/검색/삭제 기능을 구현하는 클래스
- 역할: 저장소 작업 전담
- Service - 비즈니스 로직(사용자에게 제공할 기능)을 구현하는 클래스.
- 각 클래스 별로 용도를 명확하게 나누고 기능에 맞게끔 코드를 작성하는 것이 좋다
(사용자)주소등록필요 → Service가 등록 작업을 해서 DAO에 요청 → DAO가 리스트에 저장
(사용자)주소확인요청 → Service가 출력 작업을 위해 값 호출 → DAO가 호출 값을 리스트에서 검색 후 다시 Service에게 전달 → Service가 전달 받은 값을 출력
정적 멤버 변수 & 메서드 (static member variable and method)
메모리의 구조
프로그램이 사용하는 메모리를 뭉뚱그려 RAM이라고 할 때, 안에 단계별로 아래 공간들이 있다
-
static
-
힙(heap): 변수선언으로 할당 불가. C의 malloc(크기), new / 파이썬의 생성자 호출을 해야 할당 받는 메모리. 메모리가 할당 되면 주소로 접근.
⇒ 리스트, 객체 등이 저장되는 메모리
-
스택(stack): 함수, 메서드가 호출되면 할당받는 메모리. 변수선언으로 할당, 변수명으로 접근
- 지역변수의 데이터 값이 저장되는 공간.
- 메소드가 호출될 때 메모리에 할당되고 종료되면 해제되어 유효시간이 가장 짧음.
-
static: 클래스변수 저장. 프로그램이 시작해서부터 종료할 때까지 존재.
댓글남기기