파이썬 기본 문법: 4. 함수, 클래스

1. 함수(Function)

1.1 함수의 개요

1.1.1 함수의 개념

  • 함수(Function)는 특정 작업을 수행하는 코드 블록을 말합니다.
  • 프로그래밍에서의 함수는 마치 수학의 함수처럼, 입력을 받아서 정해진 연산을 수행한 후 결과를 반환하는 역할을 합니다.
  • 함수는 프로그래밍에서 코드의 효율적인 관리, 재사용, 구조화 및 유지보수를 위한 핵심적인 도구입니다.

1.1.2 핵심 아이디어

  • 코드의 묶음: 여러 줄의 코드를 하나의 의미 있는 단위로 묶어 놓은 것
  • 재사용성: 한번 정의된 함수는 필요할 때마다 여러 번 호출하여 동일한 코드를 반복해서 작성할 필요가 없음
  • 모듈화 및 가독성 향상: 복잡한 프로그램을 여러 개의 작은 함수로 나누어 작성하면 코드의 구조가 명확해지고 이해하기 쉬워짐
  • 유지보수 용이성: 특정 기능에 대한 코드가 함수 안에 격리되어 있어, 해당 기능을 수정해야 할 때 함수 내부만 변경하면 됨

1.1.3 함수의 주요 구성 요소

  • 정의(Definition)
    • 함수를 만들고 그 기능을 정의하는 부분
    • 함수 이름, 입력(매개변수), 수행할 코드 블록, 출력(반환 값) 등을 포함
  • 호출(Call)
    • 정의된 함수를 실제로 실행하는 행위
    • 함수 이름과 필요한 입력 값(인수)을 전달하여 함수를 실행
  • 매개변수(Parameter)
    • 함수를 정의할 때 입력으로 받을 값을 나타내는 변수
  • 인수(Argument)
    • 함수를 호출할 때 실제로 전달하는 값
  • 반환 값(Return Value)
    • 함수가 작업을 수행한 후 호출한 곳으로 돌려주는 결과 값
    • 반환 값이 없을 수도 있음

1.1.4 비유

  • 함수: 요리 레시피
  • 매개변수: 레시피에 필요한 재료
  • 인수: 실제로 사용하는 재료의 양
  • 반환 값: 완성된 요리

1.1.5 함수의 예시 (Python 기준)

def add(a, b):  # 함수 정의: 이름은 'add', 매개변수는 a, b
  result = a + b
  return result  # 결과 값 반환

sum_result = add(5, 3)  # 함수 호출: 인수 5와 3을 전달
print(sum_result)  # 출력: 8

1.2. 함수 실습 예제

1.2.1 함수의 선언 방법

def 함수이름(인자1, 인자2, ...):
    코드들
    return 결과값

1.2.2 함수 선언과 사용

# 함수 선언
def add_number(n1, n2):
    result = n1 + n2
    return result

def add_text(t1, t2):
    print(t1 + t2)

# 함수 사용
answer = add_number(5, 10)
print(answer)

text1 = '안녕하세요~'
text2 = '만나서 반갑습니다.'
add_text(text1, text2)

1.2.3 함수 호출 시 인자의 전달 순서 및 전달 인자 지정방법

add_text(text2, text1)
add_text(t2=text2, t1=text1)

1.2.4 함수 선언 시 인자의 기본값 설정방법

  • 함수 선언 시 인자의 기본값 설정할 때, 기본값이 설정된 인자는 뒤쪽에 위치해야 합니다.

      def add_number(n1=100, n2=200):
          result = n1 + n2
          return result
    
      result = add_number(30)
      print(result)
    
      # 잘못된 기본값 설정의 예
      def add_number(n1=100, n2):
          result = n1 + n2
          return result
    
      # 올바른 기본값 설정의 예
      def add_number(n1, n2=100):
          result = n1 + n2
          return result
    
      result = add_number(30)
      print(result)
    

1.2.5 함수의 결과값의 다중 반환

def reverse(x, y, z):
    return z, y, x

a, b, c = reverse(10, 20, 30)
print(a, b, c)
print(result[0])
print(result[1])
print(result[2])
r1, r2, r3 = reverse(1, 2, 3)
print(r1)
print(r2)
print(r3)

2. 클래스(Class)

2.1 클래스의 개요

2.1.1 클래스의 개념

  • 클래스(Class)는 객체(Object)를 만들기 위한 설계도 또는 틀입니다. 객체를 선언하기 위한 자료구조로서의 틀이라고 생각할 수 있습니다.
  • 클래스는 객체를 선언하기 위한 틀이므로 그 자체로는 사용할 수 없으며, 인스턴스 객체를 생성하여 사용합니다.
  • 현실 세계의 사물이나 개념을 프로그램 내에서 표현하기 위해 사용되며, 데이터(속성)와 기능(메서드)을 하나의 단위로 묶습니다.

  • 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 데이터와 기능을 묶어 현실 세계를 프로그램 내에 효과적으로 모델링하고, 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 합니다.

2.1.2 핵심 아이디어

  • 객체 지향 프로그래밍(OOP)의 핵심: 클래스는 객체 지향 프로그래밍의 중요한 구성 요소입니다.
  • 데이터와 기능의 캡슐화: 관련된 데이터와 해당 데이터를 조작하는 기능을 하나의 클래스 안에 묶어 관리합니다.
  • 코드의 재사용성 및 확장성: 한번 정의된 클래스를 기반으로 여러 개의 객체를 생성할 수 있으며, 상속 등의 기능을 통해 코드를 확장하고 재사용하기 용이합니다.
  • 추상화: 복잡한 시스템을 단순화하여 모델링하고 이해하기 쉽게 만들어줍니다.

2.1.3 클래스의 주요 구성 요소

  • 속성(Attribute)
    • 클래스가 가지는 데이터 또는 상태를 나타내는 변수
    • 객체의 특징이나 정보를 저장(예: 자동차 클래스의 속성 - 색상, 모델, 속도)
    • 프로그래밍 언어에 따라 멤버(멤버변수, 클래스멤버)라고 표현하기도 함
  • 메서드(Method)
    • 클래스 내부에 정의된 함수
    • 객체의 행위 또는 기능을 나타냄
    • 객체의 속성을 조작하거나 특정 작업을 수행함
      • 예: 자동차 클래스의 메서드 → 가속하다, 멈추다, 경적을 울리다
  • 생성자(Constructor)
    • 클래스의 객체가 생성될 때 자동으로 호출되어 객체의 초기 상태를 설정하는 특별한 메서드
    • 일반적으로 ‘__ init__‘이라는 이름을 사용함
  • 인스턴스(Instance)
    • 클래스를 기반으로 실제로 생성된 객체
    • 클래스는 설계도이고, 인스턴스는 그 설계도에 따라 만들어진 실체라고 생각할 수 있음

2.1.4 비유

  • 클래스: 자동차 설계도
  • 속성: 설계도에 명시된 차량의 색상, 모델, 엔진 종류 등
  • 메서드: 설계도에 명시된 가속 기능, 제동 기능 등
  • 객체(인스턴스): 설계도에 따라 실제로 만들어진 특정 자동차 (예: 빨간색 소나타)

2.1.5 클래스의 예시 (Python 기준)

class Dog:
    def __init__(self, name, breed):
        self.name = name  # 속성
        self.breed = breed  # 속성

    def bark(self):  # 메서드
        print("멍멍!")

my_dog = Dog("해피", "푸들")  # Dog 클래스의 인스턴스 생성
print(my_dog.name)   # 객체의 속성에 접근
my_dog.bark()      # 객체의 메서드 호출

2.2 클래스 실습 예제

2.2.1 클래스의 선언과 사용

class MyClass:
    var = '안녕하세요'

    def sayHello(self):
        print(self.var)
obj = MyClass()
print(obj.var)
obj.sayHello()

2.2.2 생성자와 소멸자

  • 생성자

      class MyClass2:
          def __init__(self):
              self.var = "안녕하세요"
              print("MyClass2 인스턴스 객체가 생성되었습니다.")
    
      obj = MyClass2()
      print(obj.var)
    
  • 소멸자

      class MyClass3:
          def __init__(self):
              self.var = "안녕하세요"
              print("MyClass3 인스턴스 객체가 생성되었습니다.")
    
          def __del__(self):
              print("MyClass3 인스턴스 객체가 메모리에서 제거됩니다.")
    
      obj = MyClass3()
      del obj
    

2.2.3 클래스의 상속

class Add:
    def add(self, n1, n2):
        return n1 + n2

class Calculator(Add):
    def sub(self, n1, n2):
        return n1 - n2

calc = Calculator()
print(calc.add(1, 2))
print(calc.sub(1, 2))
class Add:
    def add(self, n1, n2):
        return n1 + n2

class Multiply:
    def multiply(self, n1, n2):
        return n1 * n2

class Calculator(Add, Multiply):
    def sub(self, n1, n2):
        return n1 - n2

calc = Calculator()
print(calc.add(1, 2))
print(calc.multiply(3, 2))
print(calc.sub(1, 2))