클래스 & 인스턴스 & 생성자 (Class & instance & Constructor)

Rex·2022년 2월 6일
0

인생 프로그래밍

목록 보기
26/33

본 글의 저작권과 원문은 https://blog.naver.com/sweetie_rex 에 있습니다.
현재의 글은 업데이트가 되지 않음을 유의해서 읽어주세요.
최신 업데이트 된 글을 읽으시려면 아래의 링크를 확인해주세요.

클래스 & 인스턴스 & 생성자 (Class & instance & Constructor)

클래스(Class)

앞의 코드에서 유저(User)와 사과장수(Merchant) 의 class 를 만들었는데, 그게 무엇인지 정확하게 설명해보려고 해.

객체 지향 프로그래밍을 설명하면서, 이런 얘기를 했어.

'객체(Object)' 라는 것은 우리의 현실과 상상속에 존재하는 모든 것(Object) 을 말해.

class 는 우리가 상상하는 추상적인(Abstraction) 무언가를 프로그래밍 언어로 구체화(Realization) 시켜놓은 형태를 말해.
이전의 코드를 다시 한번 보자.

class User:       # 유저 클래스
    name = None   # 유저의 이름
    money = None  # 유저의 돈
    apple = None  # 유저의 사과갯수
    
    def buy(self, user, thing, price, amount):  # '구매하기' 행동 함수
        # ... 함수 내용 ...

우리는 앞의 예시에서 유저사과장수 이라는 존재를 상상하면서, 그들은 [이름, , 사과갯수] 를 가지고 있을거라고 상상했어.
그리고 유저는 구매하기 라는 행동을 할 수 있다고 상상했어.
그런 머릿속의 상상을 위의 코드로 만든거야. 이러한 과정을 구현(Implementation) 이라고 해.
구현이란, 상상하던 것을 코드로 만들어내는 행위 를 말해.
프로그래밍이라는 행위 자체가 모두 구현이야. 프로그래밍은 머릿속으로 상상하는 것을 만들어내는 일이잖아.
그 중에서 클래스의 구현은 추상적인 객체(Object) 에 대한 구체화(Realization) 라고 볼 수 있지.

말이 좀 어렵다고?
예를 더 들어볼게. 인간(Person) 이라는 존재를 class 로 만든다면 어떻게 구체화 시킬 수 있을까?
인간에게는 무수히 많은 상태값(property) 들이 존재하겠지?
이름, 나이, 직업, , 몸무게, 배고픔의정도, 신체의온도, 시력, 취미, 등등.. 셀 수 없이 많을거야.
그리고 그 상태값들은 다양한 행동(method) 에 의해서 수시로 변화하게 될거야.

그러면, 인간의 행동(method) 에는 어떤 것들이 있을까?
숨쉬기, 보기, 듣기, 말하기, 읽기, 쓰기, 먹기, 걷기, 생각하기 등등.. 행동도 셀 수 없이 많을거야.

한가지 예를 더 들어서 자동차(Car) 라는 존재를 class 로 만들면 어떨까?
자동차의 상태값(property) 에는
제조사, 이름, 배기량, 연비, 무게, 엔진 등등 이 있을거고,
자동차의 행동(method) 에는
시동켜기, 시동끄기, 가속, 브레이크 등등 이 있을거야.
당연히 이러한 행동에 따라 자동차의 상태값도 수시로 변하게 되겠지.
자동차의 움직임에 따라 다른 객체의 상태값을 변화시키기도 하지.
예를들면 미세먼지 라던가, 오존층 의 상태값이라던가..

이런 우리의 생각들을 코드로 작성해서 class 로 선언하여 만들 수도 있겠지.

class 는 사전적 의미로 '종류, 분류' 라는 뜻을 가지고 있어.
클래스로 선언되는 것은 프로그래밍 내에서 하나의 종류로 분류 하겠다는거야.
인간이라는 종류, 자동차라는 종류로 선언하는거지.

이처럼 클래스는 프로그래밍을 위해서 하나의 구체적인 분류를 만들어 놓은거야.
이제 클래스의 인스턴스(instance) 에 대한 설명을 해볼게.

인스턴스 (instance)

이전의 코드에서 잠깐 언급된 적이 있는데, 주석에 'instance 생성' 이라고 작성했었어.

class User:      # 유저 클래스
    # ... properties ...
    # ... constructor ...
    # ... methods ...
    
class Merchant:  # 사과장수 클래스
    # ... properties ...
    # ... constructor ...
    # ... methods ...

user = User("철수", 500, 0)            # 유저의 생성자로 instance 생성
merchant = Merchant("영희", 1000, 20)  # 사과장수의 생성자로 instance 생성

여기서 instance 를 생성한다는 이야기를 했는데, 인스턴스란 클래스가 실제로 사용되어서 그 존재가 나타난 것을 말해.
위의 User 라는 클래스와 Merchant 라는 클래스를 선언했는데, 클래스로 선언만 해놓는 건 아무런 효과가 없어. 그건 단지 "나는 이런 클래스를 만들었어요!" 하고 선언만 했을 뿐, 사용은 하지 않은 상태야. 변수, 함수, 클래스 모두 만들어놓고 사용하지 않으면 의미가 없는것과 똑같아. (추후 static 과 관련된 접근을 하면 조금 달라지긴 하지만, 이 책에서 설명할 깊이는 아니니 넘어가도록 할게.)
결론적으로 instance 란, 선언한 클래스를 이용해서 프로그램 내에서 실체화 시킨 거야.

게임의 캐릭터 로 예를 들면, 회원가입만 하고 캐릭터 를 만들기 전에는 캐릭터 class 만 존재하는 상태이고, 캐릭터 생성화면에서 닉네임을 입력한 다음 '캐릭터 생성' 버튼을 클릭하면 캐릭터 constructor 가 실행되면서, 캐릭터 instance 가 등장하는거야!
어떤건지 이해하겠지?

User("철수", 500, 0) 라는 코드가 바로 User 클래스를 실제로 사용해서 instance 를 만들어내는 생성자(constructor) 역할을 해. function 과 사용하는 형태가 비슷하지? 생성자 또한 function 이야.

자 그러면 이제 생성자(Constructor) 에 대한 이야기를 해보자.

생성자(Constructor) 함수

생성자는 이름에서 풍겨오는 느낌처럼, instance 를 생성하는 역할을 해.
이름이 있어보인다고 뭐 특별한건 없어. 그냥 function 일 뿐이야. instance 를 생성해서 return 해주는 function 이지. '생성자 함수' 라고 해.

생성자 함수는 Python 에서는 __init__(): 이라는 이름으로 정의할 수 있고,
JavaScript 에서는 constructor() { ... } 으로,
Java 에서는 클래스와똑같은이름() { ... } 으로 정의해.
언어마다 정의하는 방법은 조금씩 달라. 하지만 생성자로서 모두 instance 를 만드는 동일한 역할을 하지.

이렇게 정의한 생성자 함수를 실행하여 instance 를 만드는 방법은,
Python 에서는 클래스이름(초기값)
JavaScript 에서는 new 클래스이름(초기값)
Java 에서는 new 클래스이름(초기값)
방식으로 실행해. Java 와 JavaScript 는 사용법이 똑같아.

위 파이썬코드의 User("철수", 500, 0) 처럼 클래스이름으로 생성자함수를 실행하면, User class 의 __init__() 메소드가 실행되면서 인스턴스를 초기화(initialize)해줄 수 있어. 파라미터 값으로 생성할 인스턴스의 이름, , 사과갯수 를 설정해 주는거지.
__init__ 메소드에서 꼭 모든 프로퍼티(상태값)들을 초기화 시켜줘야 하는것은 아니야. 인스턴스를 생성할때 필요하다고 생각되는 작업들을 원하는대로 해주면 돼.

상태값과 행동 (Properties & Methods)

우리는 이제 class 내에 선언된 상태값 변수들은 'property' 라고 부를거고, class 내에 선언된 함수들은 'method' 라고 부를거야.
property 는 '자산' 이라는 의미로, class(객체) 가 소유한 자산(상태값)을 의미하고,
method 는 '방법', '방식' 이라는 의미로, class 가 행동하는 방법들을 정의해놓은 거라고 생각하면 이해가 편할거야.

근데 왜 이렇게 불러야만 하냐고?
그냥 변수, 함수라고 부르면 안되냐고?
당연히 되긴 돼. 그렇지만 수많은 개발자들과 의사소통을 원활히 하기 위해서는, 일반적인 변수와 클래스 내의 변수를 구분해줄 필요가 있고, 일반적인 함수와 클래스 내에 선언된 함수를 구분해줄 필요가 있지. 만약 이 룰을 따르지 않는다면 의사소통에 오해가 생길 수 있어서 그래.
그래서 우리는 그것을 'property' 와 'method' 로 부르기로 약속했어.

여담이지만, 'property' 와 혼용해서 사용되는 단어들이 여러개가 있어.
대표적으로는 'member변수', 'field', 'attribute' 라고 하기도 해.
이런 단어들을 듣게되면, 모두 클래스 내에 선언된 변수들을 나타내는 말로 이해해도 될거야. (물론 아주 미세하게 어감과 내포된 의미가 조금씩 다르긴 해)
이렇게 다양한 이유는 프로그래밍 언어들이 아주 다양하기 때문에, 동일한 것을 놓고 다른 이름으로 부르기도 하기 때문이야. 어쨌든 표준(?)이라고 하긴 뭐하지만 대부분의 사람들은 'property' 라는 단어를 가장 많이 사용해.
보통은 자신이 처음으로 배운 프로그래밍 언어에서 사용하는 룰을 따라서, 본인도 그 언어의 방식에 익숙해지기 마련이지.
method 는 모두 method 라고 하니 문제 없을거야! :-)

profile
🔥 from Abstraction to Realization

0개의 댓글