Python 기초 - 9.클래스

3 분 소요

클래스 정의

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: 클래스변수 저장. 프로그램이 시작해서부터 종료할 때까지 존재.

댓글남기기