객체지향 프로그래밍(OOP)의 개념

sunn·2022년 4월 12일
0

Source: https://youtu.be/cg1xvFy1JQQ

객체 지향 프로그래밍은 코드를 정리하는 방법 중의 하나로 데이터의 구조 방식이라고 볼 수 있다.

C#, Java등의 언어가 객체지향 언어이고 자바스크립트, 파이썬도 객체지향 언어 방식을 지원한다.

OOP를 배우면 그 기술을 많은 언어에 이동해 적용시킬 수 있다.

인간은 이미 객체지향적으로 생각하고 있기 때문에 이해하기 쉽다.

비디오게임을 만든다고 상상해보자.

이 경우 플레이어 객체(object)가 필요하고 각각의 플레이어 객체는 다른 데이터들을 가질 것이다.

JS로 표현한 플레이어 객체JS로 표현해본 플레이어 객체

단 한명의 플레이어만 만든다면, 이렇게 코딩을 해도 된다.

하지만 숫자가 늘어나면 문제가 생긴다!

  • 모두 같은 속성을 가진 플레이어 객체들이 늘어나고 → 플레이어의 구조에 대한 고민이 없음 → 객체 중에 찾기 어려운 철자 오류가 있을 경우 찾기 어려움
  • 새로운 속성을 추가해야 할 경우, 각 객체마나 하나하나씩 추가해야 하는 일이 발생한다.

→ 더 좋은 방법은 데이터만 넣으면 적용시켜주는 일종의 플레이어 팩토리를 만드는 것이다.

바로 이것이 OOP의 초석을 사용할 때이고, 이게 바로 Class의 개념이다!

Class는 일종의 구조, 설계도를 만들어준다. 플레이어 객체가 어떻게 보여야 할지에 대한 도면을 정의해준다.

JS로 만든 클래스

이러면 더이상 새로운 플레이어를 만들때 코드를 복사할 필요가 없고, 속성에 접근하기 쉽다.

클래스는 일종의 금형 설계도라고 생각할 수 있다. 동일한 속성이지만 각기 다른 데이터를 가지고 있는 많은 플레이어 객체들을 생산할 수 있다.

일론이라는 플레이어를 생성한다고 해보자

const elon = new Player("Elon Musk", 90, "Legend")

여기서 elon을 인스턴스 혹은 객체라고 할 수 있다.

constructor는 정상적인 함수지만 클래스 내에 있기 때문에 함수라 부르지 않고 메서드라고 부른다.

클래스에서 새 객체를 만들 때 JS의 컨스트럭터와 Python의 init 메서드는 모두 JS와 Python에 의해 자동으로 호출된다.

constructor 메서드에서 어떻게 클래스를 구성할 지 정할 수 있고, 모든 플레이어의 초기값을 정할 수도 있다.

따라서 함수처럼 인수를 받을 수 있다. new Player("Elon Musk", 90, "Legend") 부분을 떠올려보자

this(JS) 또는 self(파이썬)는 플레이어 클래스 내의 속성 및 메서드를 지칭하는 방법이다.

클래스는 컨스트럭터를 제외하고도 많은 종류의 메서드를 가질 수도 있다.

다양한 메서드를 가진 플레이어 클래스

이전엔 클래스로 데이터를 정리하기만 했다면 이젠 메서드 덕분에 데이터에 엑세스하고, 조작할 수 있는 인터페이스를 만들 수 있게 되었다.


상속

상속은 코드 중복을 줄이고 코드를 재사용 가능한 조각으로 나눌 수 있다.

기본적으로 자녀 클래스가 부모 클래스의 속성을 갖게 되는 것을 의미한다.

여기 사람을 정의한 클래스들이 있다.

이 모든 클래스들이 조금씩 다 다르지만, 이들은 모두 인간에 속한다.

이때 상속의 개념이 필요하다.

모든 클래스에 this.name, this.arms, this.legs를 적는 대신

this.name, this.arms, this.legs 를 가진 클래스(Human)에서 확장하면 된다.

Baby, Teenager 클래스가 Human의 속성을 다 갖고 추가적으로 그들만의 속성을 추가할 수 있다.

하지만 위 코드는 아직 작동하지 않는데, Human class의 constructor가 인수에 따라 Human의 Type을 정하기 때문이다.

→ 따라서 Baby, Teenager의 constructor에 super(name) 메서드를 추가하면 정상작동한다.

profile
:-)

2개의 댓글

comment-user-thumbnail
2022년 4월 14일

예제를 통한 OOP! 재밌게 잘봤습니다~
다음엔 다형성에 대해서도 소개해주세요 ㅎㅎ
그리고 앞으로 예제코드는 코드블럭을 통해서 삽입하시는 걸 추천드려요!

1개의 답글