클래스, OOP(객체지향프로그래밍)

O(logn)·2023년 9월 15일
1

자료구조

목록 보기
2/10
post-thumbnail
post-custom-banner

목차
2.1 클래스
2.2 재귀 함수
2.3 (부록)재귀함수가 반복문보다 나은 경우


2.1 클래스

클래스란

  • 객체를 찍어내는 템플릿의 역할
  • 설명보다는 예시를 보는 것이 효과적
  • 아래 Dice()클래스 예시는 주사위를 소환하고(__init__) 굴려서(roll) 주사위의 눈금을 확인하는(get_face)클래스로, 간편하게 반복 작업을 수행할 수 있음
import random
class Dice:
    def __init__(self):
        self.face = 0

    def get_face(self): # 주사위의 숫자를 리턴한다.
        return self.face

    def roll(self):
        # 1~6 사이의 랜덤한 정수값으로 face 속성을 갱신한다.
        self.face =  random.randint(1,6)

# 아래를 수정하시오.
d1 = Dice() # Dice()클래스의 인스턴스 호출
d2 = Dice()
d3 = Dice()

d1.roll() # roll()메소드 호출
d2.roll()
d3.roll()

print(d1.get_face(),d2.get_face(),d3.get_face()) # 메소드를 호출하는 것이 더 낫다.
print(d1.face, d2.face, d3.face) # 멤버변수를 호출하는 것이 더 복잡함(최대한 접근하지 못하게 해야 함)

클래스 명명 규칙

  • 이름을 지을 때에는 항상 명사로
  • 첫 시작은 대문자로
  • 둘 이상의 단어는 첫 문자를 대문자로하고 붙여 씀(PascalCase)

클래스의 구성요소

  1. 객체
    객체(Object)는 속성(데이터)과 동작(메서드)을 가진 소프트웨어의 기본 단위
    self: 생성된 인스턴스 자신

  2. 속성(Attributes)(= 멤버 변수)
    : 객체의 상태 나타내며 데이터 저장 목적
    Dice() 클래스에서 속성은 face
    : 주사위 윗면의 눈금 수 데이터를 저장하고 현재 눈금 수 표현

  3. 메서드(Methods)(= 멤버 함수)
    : 객체의 동작을 정의하며 객체의 상태를 조작하거나 객체 간 상호작용을 수행하려는 목적.
    - Dice() 클래스에서 메서드는 __init__,get_face, roll이 있음.
    - __init__메서드는 속성의 초기화 동작을 수행
    - 메소드 명명 규칙
    1) 메소드 명은 동사
    2) 첫 시작은 소문자로
    3) 둘 이상의 단어는 첫 문자를 소문자로하고 두 번째 단어의 첫 문자는 대문자로 하여 붙여 씀(camelCase)

    1. 인스턴스
      : 클래스를 기반으로 실제로 생성된 객체d1,d2
    • 클래스의 인스턴스는 클래스에 정의된 속성과 메서드를 포함
    • 각 인스턴스는 고유한 데이터를 가질 수 있음

클래스 특징

  1. 상속성(Inheritnace)

클래스의 필요성

  • 길고 복잡한 코드를 가독성 좋게 표현하기 위함.

2.2 재귀 함수

핵심은, 이 세상에서 유일한 망치를 만들기 위해 필요한 그 망치가 이미 존재한다고 믿는 것!

2.2.1 재귀 함수 예제

[클래스] Q4


정답

class Student:
    def __init__(self, name, id, major):
        self.name = name
        self.id = id
        self.major = major

    def get_name(self):
        return self.name

    def get_id(self):
        return self.id

    def get_major(self):
        return self.major

    def print(self): # 메소드 print()
      print('Name:%s, ID:%s, Major:%s'%(self.get_name(), self.get_id(), self.get_major())) # 파이썬의 기본 print함수
      # print(f"Name:{self.get_name()}, ID:{self.get_id()}, Major:{self.get_major()}")


## 아래는 수정하지 마시오.
s1 = Student('Lee', 101, "Data Science")
s2 = Student('Kim', 102, "Mathmatics")

print(s1.get_name())
print(s2.get_name())

s1.print()
s2.print()

[클래스] Q5

import random

class Dice:
    def __init__(self):
        self.face = 0

    def get_face(self): # 주사위의 숫자를 리턴한다.
        return self.face

    def roll(self):
        # 1~6 사이의 랜덤한 정수값으로 face 속성을 갱신한다.
        self.face =  random.randint(1,6)

# 아래를 수정하시오.
d1 = Dice() # Dice()클래스의 인스턴스 호출
d2 = Dice()
d3 = Dice()

d1.roll() # roll()메소드 호출
d2.roll()
d3.roll()

print(d1.get_face(),d2.get_face(),d3.get_face()) # 메소드를 호출하는 것이 더 낫다.
print(d1.face, d2.face, d3.face) # 멤버변수를 호출하는 것이 더 복잡함(최대한 접근하지 못하게 해야 함)

[재귀함수] Q6

def count_up(n):
  if n == 1 :
    print(1)
  else:
    count_up(n-1)
    print(n)

count_up(4)
print('==========')
count_up(5)

[재귀함수] Q7

def recur_sum(nums):
  if len(nums) <= 1:
    return nums[0]
  else:
    return recur_sum(nums[:-1]) + nums[-1]

# 아래는 수정하지 마시오.
print(recur_sum([1,2,3]))
print(recur_sum([2,1,2,3]))    

[재귀함수] Q8


def fibo(n):
  if n == 0:
    return 0
  elif n == 1: 
    return 1
  else:
    return fibo(n-2) + fibo(n-1)

# 아래는 수정하지 마시오.
for i in range(0, 11):
    print(fibo(i))

[재귀함수] Q9

def reverse_str(x):
  if len(x) <=1:
    return x
  elif len(x) == 2:
    return x[1]+x[0]
  else:
    return x[-1]+reverse_str(x[:-1])

print(reverse_str("abc"))
print(reverse_str("123456"))

2.3 부록: 재귀함수가 반복문보다 나은 경우

  1. 재귀적인 표현이 자연스러운 알고리즘
    [EX] 피보나치 수열 점화식( f(n) = f(n - 1) + f(n - 2) )

  2. 가독성 향상

  • 적은 변수 사용

2.4 참고자료

클래스 개념
클래스, 메소드 명명 규칙
클래스 표기법 camelCase
재귀함수가 반복문보다 나은 경우

profile
는 내 성장의 시간 복잡도!!
post-custom-banner

0개의 댓글