DA Study/Weekly Paper

[Weekly Paper 1] 객체 지향 프로그래밍, 클래스, 인스턴스 / 정적 메소드

harrym8n 2024. 12. 17. 16:41

1) 객체 지향 프로그래밍(Object Oriented Pragramming)

: 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법. 쉽게 말하면 데이터와 처리방법으로 프로그램을 구성하는 것이 아닌, 다수의 "객체"를 만들어 이들 간의 서로 상호작용을 통해 프로그램을 만드는 방식

  • 객체 = 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹
    ex. FC온라인 게임

    • 객체 : 구단주
    • 데이터(속성) : 이름, 연령, 구단가치 등
    • 기능(행동) : login(), play_game(), sell_player() 등
  • 추상화 = 클래스를 설계하는 것 = 공통의 속성이나 기능을 묶어 이름을 붙이는 것

2) 클래스와 인스턴스

클래스

  • 객체 지향 프로그래밍(OOP)에서 특정 객체(object)를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀
  • 객체를 정의하고 만들기 위한 변수와 메서드의 집합

인스턴스

  • 인스턴스는 클래스를 통해 생성된 객체
  • 클래스가 설계도라면 인스턴스는 설계도를 바탕으로 만들어진 실체
  • 클래스를 사용하여 인스턴스를 생성하면 클래스의 속성과 동작이 각 인스턴스에 적용

속성

  • 클래스에서 선언된 변수, 인스턴스 속성 저장

메소드

  • 클래스 내에 구현된 함수, 인스턴스 기능 지정

일반 함수와 기능적으로 동일
파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용(객체를 호출할 때 호출한 자신이 전달되기 때문)

예시

  • 와플 만드는 기계 (클래스) / 만들어진 와플(인스턴스)
  • 차량 설계도(클래스) / 만들어진 차(인스턴스) / 차 스펙(속성) / 차 시동 걸기(메소드)
  • 유저 설계도(클래스) / 만들어진 유저(인스턴스) / 사람의 나이, 신체 정보, 성별 등(속성) / 사람의 행동(메소드)
#클래스 정의
class User:
    #메소드 정의
    def introduce(user):
        print(f"반갑습니다. 저는 {user.name}입니다.")

#인스턴스 생성
user1 = User()
user2 = User()

#인스턴스별 속성 추가
user1.name = '해리문'
user2.name = '샐리권'

user1.email = 'aa@aa.com'
user2.email = 'bb@aa.com'

#실행
print(user2.email)
User.introduce(user1)
user1.introduce() #인스턴스가 메소드의 첫번째 argument(함수의 인자)로 자동으로 전달됨

#결과
bb@aa.com
반갑습니다. 저는 해리문입니다.
반갑습니다. 저는 해리문입니다.
3) 정적 메소드(Static Method)

3) 정적 메소드(Static Method)

정의

  • 자기 자신(클래스 or 인스턴스)을 인자로 전달하지 않고 오직 명시적으로 전달 받은 인자만을 가지고 행동을 취하는 함수 - 클래스 밖의 함수와 별 차이가 없다.
  • 클래스를 통해 직접 접근할 수 있는 메소드

특성

  • 인스턴스 메소드와 달리 인스턴스 변수가 필요 없으므로 객체를 생성하지 않고도 호출할 수 있다.
  • 정적 메소드는 인스턴스/클래스 메소드와 달리 첫번째 변수가 자동으로 할당되지 않는다.
  • 따라서, 정적 메소드 내에서는 인스턴스/클래스 속성에 접근하거나 인스턴스/클래스 메소드 호출 불가
  • 인스턴스 멤버와 관련되지 않은 작업을 한다.
  • class안에 비슷한 류의 함수를 모아두고 싶을 때 / class 실행을 도와주는 유용한 유틸 기능 구현한 경우 사용

선언 및 호출

  • 선언 : @staticmethod 데코레이터 작성하여 선언
  • 데코레이터 : 함수/메서드의 기능을 확장하거나 변경해주는 특별한 문법(함수를 입력 받아 함수를 반환)*
  • 호출 : 인스턴스와 클래스 아무거나 사용해서 호출 가능
    • 클래스명.static메소드명() - 일반적으로 클래스명을 통해 호츌
    • 인스턴스명.static메소드명()
  • static 메소드는 인스턴스 변수를 호출할 수 없지만 인스턴스 메소드는 static 변수를 호출할 수 있다.
  • static 메소드는 인스턴스 메소드를 호출할 수 없지만 인스턴스 메소드는 - - static 메소드를 호출할 수 있다.
  • static메소드끼리는 호출 가능

예시

class hello:
    num = 10

    @staticmethod
    def calc(x):
        return x + 10

print(hello.calc(10))
#결과
20

Q: 클래스와 인스턴스를 설명해주세요.

클래스는 객체 지향 프로그래밍(OOP)에서 객체(object)를 정의하고 만들기 위한 변수와 메서드의 집합으로, 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀입니다.

인스턴스는 클래스를 통해 생성된 객체를 의미하며, 클래스가 설계도라면 인스턴스는 설계도를 통해 만들어진 실체입니다. 클래스를 통해 인스턴스를 생성하면, 클래스의 속성과 행동(메소드)이 인스턴스에 적용됩니다.

  • 객체는 선언, 인스턴스는 실체화를 의미 / 객체는 현실 세계, 인스턴스는 소프트웨어 세계
  • 클래스의 타입으로 선언 되었을 때 -> 객체
  • 그 객체가 메모리에 할당되어 실제 사용될 때는 -> 인스턴스

Q: 정적 메소드는 무엇이며, 어떻게 호출하나요?

자기 자신(클래스 or 인스턴스)을 인자로 전달하지 않고 오직 명시적으로 전달 받은 인자만을 가지고 행동을 취하는 함수로, 클래스 밖에서 선언되는 함수와 별 차이가 없습니다. 클래스나 인스턴스가 필요하진 않지만, 직접적인 연관이 있어서(관련성이 높아서) 묶어서 클래스 안에 제공하는 것이 좋을 것 같을 때 사용합니다.

클래스나 인스턴스를 통해 static메소드를 호출할 수 있지만, static메소드로 클래스와 인스턴스를 호출하는 것은 불가능합니다.