소개

객체지향이란 무엇일까 왜 배워야하는것인지
전 글
필요성을 느끼게해주는글을 작성했습니다.

무엇을 학습하던지 저는 그 내용이 왜 필요한건지 왜 배워야하고

배워서 어디서 써야하는지가 제일 중요하다는게 저의 지론입니다.

프로그래밍을 하면서 생긴 지론이에요

저만 그런걸수도있지만 그걸 왜 배우고 어디서 쓰는지 정확히알고 학습을하면

이해가 더 잘되고 덜 지루해요 머릿속에서 뭘 할수있을 정도로만

배워야한다고 정해져있으니까 자기만의 커리큘럼이 생기는 그런느낌?

제가 강사도아니고 그렇다고 프로그래밍을 뛰어나게 잘하는사람이 아니기때문에

객체지향을 getter setter 접근제한을 통한 정보은닉 등

이게 뭔지설명하는거보다 왜 배우는지 어떻게 쓰이는지를 설명할겁니다.

사용할 기본 코드

export default class {
  private fuel: number = 0;

  constructor(
    private wheel: number,
    private color: string,
    private kinds: string
  ) {}

  //배터리가 0퍼인지 체크
  private lowBettery(): boolean {
    if (this.fuel <= 0) return true;
    return false;
  }

  //배터리 충전
  private incBettery() {
    this.fuel += 1;
  }

  //배터리 사용(감소)
  private decBettery() {
    this.fuel -= 1;
  }

	//충전
  charging() {
    this.incBettery();
  }

	//주행
  driving() {
    if (this.lowBettery()) throw new Error("배터리가 부족해서 주행할수없어..");
   console.log("주행");
  this.decBettery();
  }
}

처음 class를 통해 객체지향을 접하는 사람이라면 저 코드를 보면서

굉장히 많은 의문이 생길겁니다 private이 무엇이고 private이 없다고해도

왜 별것도아닌걸 다시 함수를 통해 실행하는걸까 등등이요

이해가 안가는게 당연한겁니다 저건 그냥 설명하려고 제가 만든

예제일 뿐이라서 일부로 조잡하게 만든 부분도있습니다.

대충 흐름만 알정도로 읽고나서 아래 내용을 보시면될거같습니다.

실행시켜보기

import Transportation from "./Transportation";

const car = new Transportation(4, "red", "Car");

car.intro();

try {
  car.driving();
} catch {
  console.log("배터리 부족으로 인해 충전");
  car.charging();
}

알고가야 하는 개념

캡슐화

캡슐화란 일관성있는 변수,함수들을 클래스를 통해 묶어두는거라고 보면됩니다.

접근 제한자

private 클래스 내부에서만 접근이 가능합니다.
public 인스턴스에서도 접근이 가능합니다.
protected인스턴스에선 접근이 불가능하지만 상속받은
자식클래스는 접근이가능합니다.

추상화

추상화라고하면

  • 추상화
    는 다음과 같은 의미로 쓰이는 말이다. 미술에서 추상화
    (抽象畫)는 대상의 구체적인 형상을 나타낸 것이 아니라 점, 선, 면, 색과 같은 순수한 조형 요소로 표현한 미술의 한가지 흐름이다.

라고 나옵니다. 미술의 추상화라 당연하게도 아무런 감이 잡히지않습니다.

그럼 컴퓨터 과학에서 추상화는?

추상화
복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.

전보다 훨씬 나은거같긴하지만 그래도 감이 잡히지않습니다.

저 사전적 의미로 뭔지 알겠다! 하시는분은 대단하신분입니다 리스펙합니다 정말로

저 코드에서 추상화는

  charging() {
    this.incBettery();
  }
  driving() {
    if (this.lowBettery()) throw new Error("배터리가 부족해서 주행할수없어..");
    console.log("주행");
    this.decBettery();
  }

이런것들이되겠죠 저게 단순한 코드라 그렇지

상상력을 발휘해서 엄청나게 복잡한 코드인데

내부로직을 이해하지않고도 주행,충전을하죠 이런것들이 추상화입니다.

상속

상속이라는 단어는 좀 많이 들어보셨을겁니다. 재산상속 등등..

교통수단이 필수적으로 가져야하는것들이있죠

공통점

교통수단이 필수적으로 가져야하는것들이있죠
바퀴는 무조건 가지고있어야하고..
전기든 기름이든 에너지(이하 연료)가 필요하고
자동차는 문이있고
킥보드는 문이없죠
근데 둘다 교통수단이라는 공통점이있고
그것은 transportation의 property를 가진다는 공통점이있네요

이런 상황에서 쓰이는겁니다.

제가 강조한 필요성을 느끼기 위해 상속을 사용하지않아보겠습니다.

class Car {
  private fuel: number = 0;
  private isDoorOpen = false;
  constructor(
    private wheel: number,
    private color: string,
    private kinds: string,
    private name: string
  ) {}
  //주행을 하려면 연료를 충전하고가야함

  private lowBettery(): boolean {
    if (this.fuel <= 0) return true;
    return false;
  }

  private incBettery() {
    this.fuel += 1;
  }
  private decBettery() {
    this.fuel -= 1;
  }

  charging() {
    this.incBettery();
  }

  driving() {
    if (this.lowBettery()) throw new Error("배터리가 부족해서 주행할수없어..");
    console.log("주행");
    this.decBettery();
  }

  //문 열렸는지 닫혔는지 추가 위에 내용은 같음
  openTheDoor() {
    // console.log("문 열림");
    this.isDoorOpen = true;
  }

  closeTheDoor() {
    // console.log("문 닫힘");
    this.isDoorOpen = false;
  }

  CheckDoor() {
    return this.isDoorOpen;
  }
}

const car = new Car(4, "red", "자동차", "람보르기니");

const Driving = () => {
  if (car.CheckDoor()) return console.log("문열려있는데 왜 출발을하세요");
  return car.driving();
};

car.charging();
car.openTheDoor();
Driving();

전에있던 코드에서 문열고닫힘 property추가했습니다.

그리고 문이 열려있을때는 출발을하지못하게 제한을거는식으로 짯습니다.

분명 transportation이랑 겹치는 부분이있는데

저걸 재사용하면 정말 좋겠죠 재사용해보겠습니다.

정말로 상속 사용해보기

import Transportation from "./Transportation";

class Car extends Transportation {
  private isDoorOpen:boolean = false;
  constructor(
    wheel: number,
    color: string,
    kinds: string,
    public name: string
  ) {
    super(wheel, color, kinds);
  }
  openTheDoor() {
    // console.log("문 열림");
    this.isDoorOpen = true;
  }

  closeTheDoor() {
    // console.log("문 닫힘");
    this.isDoorOpen = false;
  }

  CheckDoor() {
    return this.isDoorOpen;
  }

}

이젠 상속을 통해서 훨씬 쉽고 간편하게 사용할수있게되었습니다.

재사용을 할수있으니 비슷한것들(킥보드,오토바이) 클래스도
상속을 통해서 간편하게 만들수있겠죠

import Transportation from "./Transportation";

class KickBoard extends Transportation {
  private isHelmet: boolean = false;
  constructor(
    wheel: number,
    color: string,
    kinds: string,
    public name: string
  ) {
    super(wheel, color, kinds);
  }

  TakeHelmet() {
    this.isHelmet = true;
  }

  TakeOffHelmet() {
    this.isHelmet = false;
  }

  CheceHelmet() {
    return this.isHelmet;
  }
}
profile
배운거 정리해요

0개의 댓글