22.10.14 - 파이썬 OOP(객체 지향 프로그래밍)(1)

LaMelo·2022년 10월 16일
0

jupyter

목록 보기
15/29

1. 구조체

  • 클래스 이전에 구조체를 먼저 공부하는 이유는 클래스(class())가 C언어의 구조체에서 확장된 개념이기 때문입니다.

  • 구조체란 배열과는 달리 인덱스가 아닌 "변수명"으로 특정 대상을 프로그래밍적으로 묘사하기 위해 사용합니다.

    • 참고 : 파이썬은 구조체가 없다. 그럼에도 구조체와 유사한 클래스를 만든다.

추상화

  • 추상화는 대상을 간단하게 표현하는 것을 의미합니다.

  • 이를테면 사람을 만약 컴퓨터적으로 표현한다면 원래대로라면 표현해야하는 요소가 너무 많습니다.(외양 뿐만 아니라 자세한 부분 포함한다면 특징 지을 것이 무한대이다.)

  • 그러므로 프로그램적으로 모든 것을 다 묘사할 수 없고 비효율이기 때문에 필수적인 요소만 표현하게 되는데 이를 추상화라고 합니다.

추상화 예시

  • 고양이의 요소 : 털 색깔, 수염 모수, 몸무게, 품종, 이름, 나이, 선호 간식, 성별, 울음소리 ....기타등등

  • 동물병원에 등록할 때 필요한 정보는 주인, 품종, 이름, 나이, 방문기록 정도 된다. : 추상화

  • 개발시에는 개발자가 고려할 수 있는(혹은 기능이 요구하는) 최소한의 사항만을 정의합니다.

(1) 클래스

  • 클래스는 일종의 설계도 입니다.
  • 어떤 투입에 대해 어떤 동작을 설계해놓고 결과값을 도출하는 함수같이 작용하기 때문에 실제로 변수를 생성하기 전까지는 따로 기능하는 바는 없습니다.
    • 고양이? (클래스를 생성해도 실제로 출력되는 값은 없는 것을 알 수 있다.)
  • 클래스 생성을 저장받은 변수(cat1,cat2)를 객체(object) 혹은 인스턴스(instance)라고 호칭합니다.
  • 출력값
  • 강아지도 만들어 보자.
    • 3 마리 정도 만들었다.
    • 이런 저런 정보를 출력해보자.

(2) 구조체와 전용 함수

  • 위에서 고양이와 강아지에 대한 정보를 기입했을 때 하나하나 print() 구문으로 이름과 나이, 품종 등을 조사해야 해서 불편합니다.(포메팅 구문을 쓰더라도 불편한 것은 마찬가지)

  • 이럴때 함수를 선언해두면 편하게 조회할 수 있습니다.

    • 고양이 한마리를 더 추가해서 함수를 선언해보자.
    • cat 전용 함수
      • !!참고!! : 함수 소괄호 안의 cat은 변수를 밑에 print의 변수와 맞춰 준다면 출력에는 문제가 없다. (하지만 일을 할 때 출력자료와 연관된 변수명을 쓰는게 좋다.)
  • 출력

    • cat 전용함수이기 때문에 cat들은 잘 출력이 되지만 dog1은 출력이 안되는 것을 알 수 있다.
    • !!! 그런데 중요한 점!!! 은 dog1이 출력이 안된 것은 변수명이 cat_type이 아니라서 그렇다고 나오는데 이는 만약 품종 변수를 type로 해서 고양이와 강아지 변수 역시 type로 일치시켰다면 출력이 가능하다는 뜻이다.
      • 이는 다른 언어에서는 통용되지 않고 그냥 에러가 뜨며 파이썬의 융통성이라는 설명 : 파이썬은 동적 자료 언어이기 때문이다.(하지만 명확한 것이 필요한 부분에서 융통성은 약점으로 작용할 수 있을 것으로 보인다. 자료의 혼용)
    • 강아지 함수도 만들어보자.

2. 함수 실행시 작동 과정 (중요)

  • (1) 클래스 설정 (스택에 Dog 클래스 생성 / 힙에 자료 유형 저장)

    • class Dog:
      name = ""
      age = 0
      dog_type = ""
      owner_name = ""
  • (2) 1번 강아지 변수 설정(스택에 dog1 주소저장 / 힙에 dog1 인스턴스 생성 ) : dog1 = Dog()

  • (3) 강아지 정보 저장 (힙의 인스턴스에 정보들 저장)
    dog1.name = "진돌이"
    dog1.age = 1
    dog1.dog_type = "진도"
    dog1.owner_name = "김"

  • (4) 함수선언(스택에 함수 주소 생성 / 힙에 함수 인스턴스 생성) : show_dog_info(dog1)

  • (5) 함수출력(스택에 dog함수 주소 생성(!!다시 함수 코드로 올라가서 작업 시작!!) / Dog 인스턴스에서 정보 가져옴)

  • (6) 결과값 출력

    • 원하는 정보를 모두 출력 후 Return value None을 찍고 생성된 dog함수 주소(show_dog_info)가 스택에서 사라진다.

3. 특정 구조체 전용 함수를 외부에 선언할 필요가 있는가?

  • (1) 클래스의 탄생

    • 특정 구조체에서만 사용할 함수를, 굳이 외부에 빼서 혼란을 야기할 필요가 없다는 결론을 내렸습니다.
    • 그래서 클래스에서는 이제 변수와 함께 함수를 같은 소속으로 선언합니다.
    • 이렇게 클래스 내부에 선언된 함수를 가리켜 매소드(~.명령어)라고 부릅니다.
  • (2) 구조체와 클래스

    • C언어에서는 구조체까지 생각을 했었다.
    • 하지만 제작한 특정 함수는 해당 변수에만 사용이 가능한데 굳이 바깥에 노출할 필요가 있는가에 대해 생각이 미치게 되었다.
    • C 언어에서는 함수포인터를 사용하여 각각의 구조체에서 공유하는 방식으로 사용하였지만 C++에서 부터 바뀌기 시작하였다.
  • (3) 파이썬 class

    • 메서드는 기본적으로 대부분의 경우 self를 파라미터로 선언해야 한다.
    • 변수 지칭시에도 self.변수명을 사용합니다.
profile
가즈아~

0개의 댓글