스터디/파이썬 스터디 강의자료

[2팀/김세연] 8차시 파이썬 스터디-객체지향프로그래밍

알 수 없는 사용자 2023. 5. 18. 21:59

8주차 - 객체 지향 프로그래밍

 

8차시_객체지향프로그래밍_강의안.pdf
1.13MB
8차시_객체지향형_과제.pdf
1.39MB

-객체 지향 프로그램을 배우는 이유

:여러 사람이 프로그램을 개발할 때 어떤 방법이 좋은지에 대한 고민과 비슷함

>내가 아니라 남이 만든 코드를 재사용하고 싶을 때 사용하는 대표적인 방법

 

함수처럼 어떤 기능을 함수 코드로 묶어 두는 것이 아니라, 어떤 기능을 수행하는 하나의 단일 프로그램을 객체라고 하는 코드를 만들어 다른 프로그래머가 재사용할 수 있도록 함. 이것은 컴퓨터공학의 오래된 프로그래밍 기법 중 하나임.

 

 

-객체와 클래스
객체
실생활에 존재하는 실제적인 물건, 개념을 뜻하며, 속성과 행동으로 구성됨
객체 지향 프로그래밍은 이러한 객체의 개념을 활용하여 프로그램으로 표현하는 기법이다.
속성은 변수variable로, 행동은 함수function로 정의됨

 

객체들을 위한 설계도를 만들어야 함 > 클래스

: 객체가 가져야 할 기본 정보를 담은 코드로 일종의 설계도 코드

선수의 이름, 포지션, 소속팀등은 기본적으로 가지고 있어야 할 속성이며,

이러한 정보를실제 생성되는 객체에 손흥민 같은 선수 이름을 할당함

 

  •  
  • - 클래스를 선언하기 위한 기본 코드 템플릿
  •  

예약어인 class 코드를 맨앞에 입력, 만들고자 하는 클래스 이름, 상속받아야하는 다음 클래스의 이름을 괄호 안에 넣음

 

(상속: 기존에 만든 클래스의 특징을 그대로 이어받아 사용하는 것을 말함 객체 지향 프루그래밍의 장점 중 하나는 재사용성이고, 이를 손쉽게 하는 것이 바로 상속임 이러한 객체 지향 프로그래밍의 대표적인 특징은 뒤에서 다시 다룸)

 

-속성의 선언

:속성에 대한 정보를 선언하기 위해서는 _ init__()라는예약 함수를 사용

이외에도 str, add 등이 있음

 

class SoccerPlayer(object):
def__init__(self, name, position, back_number):
    self .name = name
    self.position = position
    self .back_number = back_number
  • init 함수의 첫번째 매개변수는 반드시 self변수 사용
  • self 변수는 생성된 인스턴스에 접근하는 예액어, 생성된 인스턴스를 지정하는 변수
  • self 뒤의 매겨변수들은 실제 클래스가 가진 속성으로 이름,포지션,등번호임 >실제로 생성되는 인스턴스에 할당
  • self.name=name 코드에 할당 / 딕셔너리형과 비슷, name이 매개변수 역할

 

-함수의 선언

: 함수는 이 클래스가 할 수 있는 다양한 동작을 정의

class SoccerPlayer(object):
    def change_back_number(self, new_number):
    print("선수의 등번호를 변경한다: From %d to %d" % (self .back_number, new_number))
    self.back_number = new_number
  • 기존 함수와 비슷, 함수 이름을 쓰고, 매개변수 사용
  • 가장 큰 차이전은 self를 매개변수에 반드시 넣어야 함

 

-_의 쓰임

(1) _1개를 사용할 때

: 이후로 쓰이지 않은 변수에 특별한 이유를 부여하고 싶지 않을 때

for _ in range(10):
    print("Hello, World")

(2)_ _2개를 사용할 때

: 특수한 예약 함수나 변수를 의미

대표적으로 _ _ str _ _ 이나 _ _ init_ _ 같은 함수

str() 함수는 클래스로 인스턴스를 생성했을 때, 그 인스턴스 자체를 print() 함수로 화면에 출력하면 나오는 값을 뜻

 

  • 인스턴스 사용하기
    인스턴스:클래스에서 실제적인 데이터가 입력되어 사용할 수 있는 형태의 객체
    (붕어빵틀: 클래스, 붕어빵: 인스턴스 (여러 가지 재료가 들어간 붕어빵))
    • 클래스에서 인스턴스를 호출하는 방법
    :클래스 이름 호출하고, __init() 매개변수에 맞추어 값을 입력
    : jinhyun이라는 인스턴스 자체가 soccerplayer클래스 기반으로 생성
    jinhyun이라는 인스턴스 자체가 soccerplayer 클래스에서 self에 할당
    :해당 코드는 self 변수에 아무런 값도 할당 안함

 # 전체 SoccerPlayer 코드
class SoccerPlayer(object):
    def __init__(self, name, position, back_number):
        self.name = name
        self.position =position
        self.back_number = back_number
    def change_back_number(self, new_number):
        print("선수의 등번호를 변경한다: From %d to %d" % (self.back_number, new_
number))
        self.back_number = new_number
    def __str__(self):
        return "Hello, My name is %s. I play in %s in center." % (self .name,self.position)

 # SoccerPlayer를 사용하는 instance 코드
jinhyun = SoccerPlayer("Jinhyun", "MF", 10)

print("현재 선수의 등번호는:", jinhyun .back_number)
inhyun.change_back_number(5)
print("현재 선수의 등번호는:", jinhyun.ba아c_number

현재 선수의 등번호는: 10
선수의 등번호를 변경한다: From 10 to 5
현재 선수의 등번호는: 5

-클래스를 사용해야하는 이유

:자신의 코드를 다른 사람이 손쉽게 사용할 수 있도록 설계하기 위함

데이터를 변환하거나 데이터베이스에 저장하는 등의 역할이 필요

 

리스트와 함수로 각각 만들어 공유하는 것보다

하나의 객체로 생성해 다른 사람들에게 배포한다면 작업이 훨씬 더 쉬워짐

 

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

-상속

:그대로 무엇인가를 내려받는 것을 뜻

부모클래스에 정의된 속성과 메서드를 자식 클래스 가물려받아 사용한다는 것

 

상속의 구조

  • 상속은 부모 클래스보다 자식클래스가 더 구체롸
  • 부모 객체는 일반적인 기능, 자식 객체 상세한 기능

-다형성

:같은 이름의 메서드가 다른 기능을 하는 것

:각각 클래스에서 구현되는 내부 로직에 차이가 있음 > 이를 함수의 다형성이라고 함

  • 사용하는 이유?

객체 지향 프로그래밍을 사용하는 이유와 같음

다른 사람의 코드를 쉽게 재사용하기위해, 내부적인 구현과정은 모르더라도, 함수,클 래스의 역활은 명확히 알아야 함

-가시성

:객체의 정보를 볼 수 있는 레벨을 조절하여 객체의 정보 접근을 숨기는 것을 말함

핵심 개념은 캡슐화(encapsulation)와 정보 은닉(information hiding)임

캡슐화

:사용하는 방법만 알면 되는 것 즉 객체의 매개변수 인터페이스만 명확히 알면 사용할 수 있음 보통은 객체의 세부 내용은 모른 채 객체의 사용법만 알고 사용한다는 뜻

정보은닉

:외부에서 코드 내부를 볼 수 없게 하기 위해 내부의 정보를 숨시는 개념

캡슐화와 정보 은닉으로 표현은 다르게 하지만 둘 다 코드의 내부의 구현을 잘 해서 외부에서 쉽게 사용, 세부적인 내용은 모르게 하는 것이 비슷함