파이썬 객체지향 프로그래밍(3일차)

이상우·2021년 8월 8일
0

이번 강의에서 가장 힘들었던 것 같다. 함수, 클래스, 클래스의 상속과 다형성 등 많은 것들이 이해가 되지 않았다. 클래스는 Java언어에서 많이 들었는데, 파이썬에서도 클래스를 배우는 줄은 몰랐다. 그렇기에 따로 공부가 필수적이였다.

함수란?

입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것. 프로그래밍을 하다보면 똑같은 내용을 반복해서 작성하는 경우가 많다. 이럴 떄 함수가 필요하다.
함수의 구조

def 함수명(매개변수):
    <수행할 문장1>
    <수행할 문장2>
    ...

def는 함수를 만들 때 사용하는 예약어이며, 함수 이름은 되도록 함수 기능에 따라 작명을 하면 좋다. 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다.

입력값과 결과값에 따른 함수의 형태

1. 일반적인 함수

def 함수이름(매개변수):
    <수행할 문장>
    ...
    return 결과값

가장 흔하게 볼 수 있는 형태이다. 매개변수를 수행할 문장에 넣고 return하여 반환해주는 것이다.

1번 예시

>> a = add(3, 4)
>> print(a)
7

add 함수는 2개의 입력값을 받아서 서로 더한 결괏값을 돌려준다.

2. 입력값이 없는 함수

>> def say(): 
...     return 'Hi' 
... 
>>

2번 예시

>> a = say()
>> print(a)
Hi

위 함수를 쓰기 위해서는 say()처럼 괄호 안에 아무 값도 넣지 않아야 한다. 이 함수는 입력값은 없지만 결괏값으로 Hi라는 문자열을 돌려준다. a = say()처럼 작성하면 a에 Hi 문자열이 대입되는 것이다.

3. 결과값이 없는 함수

>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
... 
>>

3번 예시

>> a = add(3, 4)
3, 4의 합은 7입니다.

아마도 여러분은 ‘3, 4의 합은 7입니다.’라는 문장을 출력해 주었는데 왜 결괏값이 없다는 것인지 의아하게 생각할 것이다. 이 부분이 초보자들이 혼란스러워하는 부분이기도 한데 print문은 함수의 구성 요소 중 하나인 <수행할 문장>에 해당하는 부분일 뿐이다. 결괏값은 당연히 없다. <결괏값은 오직 return 명령어로만 돌려받을 수 있다.

4. 입력값도 결과값도 없는 함수

>> def say(): 
...     print('Hi')
... 
>>

4번 예시

>> say()
Hi

매개변수와 인수

매개변수와 인수를 헷갈려하는 경우가 많다.
매개변수: 함수에 입력으로 전달된 값을 받는 변수
인수: 함수를 호출할 떄 전달하는 입력값을 의미

def add(a, b):  # a, b는 매개변수
    return a+b
print(add(3, 4))  # 3, 4는 인수

매개변수에 초깃값 미리 설정하기

def say_myself(name, old, man=True): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("남자입니다.")
    else: 
        print("여자입니다.")

위 함수를 보면 매개변수가 name, old, man=True 이렇게 3개다. 그런데 낯선 것이 나왔다. man=True처럼 매개변수에 미리 값을 넣어 준 것이다. 이것이 바로 함수의 매개변수 초깃값을 설정하는 방법이다. 함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게 함수의 초깃값을 미리 설정해 두면 유용하다.

객체 지향(Object oriented) 프로그래밍

객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것

절자 지향 vs 객체지향

절차 지향

  • 기능중심으로 바라보는 방식. "무엇을 어떤 절차로 할 것인가?"가 핵심이 된다. 즉, 어떤 기능을 어떤 순설로 처리하는ㄷ가에 초점을 맞춘다.
  • 소형 프로그래밍 경우 적합(작은 기능을 객체별로 나눌 경우, 오히려 복잡할 수도 있음)

객체 지향

  • 기능이 아닌 객체가 중심이 되며, "누가 어떤 일을 할 것인가?"가 핵심이 된다. 즉, 객체를 도출하고 각각의 역할을 정의해 나가는 것에 초점을 맞춘다.
  • 대형 프로그래밍의 경우 적합(각 객체가 하는 역할이 많아도, 많은 역할을 객체로 묶을 수 있기 때문)

객체 지향 프로그래밍의 특징

1. 추상화(abstraction)

  • 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
  • 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.(클래스가 없는 객체지향 언어도 존재 ex.JavaScript)

2. 캡슐화(encapsulation)

  • 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
  • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
  • 코드가 묶여있어서 오류가 없어 편리하다.
  • 데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신을 한다. 보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.

3. 상속성(inheritance)

  • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
  • 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
  • 기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.

4. 다형성(polymorphism)

  • 약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
  • 동일한 명령의 해석을 연결된 객체에 의존하는 것
  • 오버라이딩(Overriding), 오버로딩(Overloading)

-오버라이딩(Overriding) - 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
-오버로딩(Overloading) - 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것

5. 동적바인딩(Dynamic Binding)

  • 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것.
  • 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 일어난다.
  • 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버라이딩 된 함수가 실행
  • 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장(다형 개념 실현)

객체 지향 프로그래밍의 장점

1. 소프트웨어의 생산성 향상
이미 만들어진 클래스를 상속받거나 객체를 가져다 재사용하거나, 부분 수정을 통해, 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다.

2. 보안성 향상
객체 지향적 프로그래밍의 캡슐화 특징으로 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.

객체 지향 프로그래밍의 단점

느린 실행 속도
객체 지향 프로그래밍은 캡슐화와 격리구조에 때문에 절차지향 프로그래밍과 비교하면 실행 속도가 느리다. 또한, 객체지향에서는 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가게 된다.

다음 게시글에 클래스, 모듈, 패키지 등을 자세히 쓰도록 하겠다.

느낀점

1.필요한 함수를 자유자재로 만들어 간결한 코딩을 짤 수 있는 능력을 키워야 할 것같다.
2.객체 지향 프로그래밍의 장점을 극대화 할 수 있도록 객체에 대해서 더 공부할 필요가 있다.

참고 사이트

https://wikidocs.net/24 - 점프 투 파이썬/04-01 함수, 05장 파이썬 날개달기
http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5 - 객체지향 프로그래밍 특징

profile
구상한것을 구현할 수 있는 개발자가 되고 싶습니다.

0개의 댓글