객체지향프로그래밍과 public, protected, private, static

younoah·2022년 2월 25일
0

[My 자바스크립트]

목록 보기
17/17
post-thumbnail

객체지향 프로그래밍이란?

  • 객체를 기반으로 하는 프로그래밍 패러다임

  • 객체들끼리 서로 의사소통하는 방식

  • 객체는 어떤 대상을 추상화 해논것을 의미하며 관련된 프로퍼티와 메서드들로 구성되어있다.

  • 생상성, 높은 퀄리티, 빠른 속도라는 장점이 있다.

클래스(붕어빵틀) → 객체(붕어빵)


객체지향 원칙 4가지

캡슐화

서로 관련되어있는 프로퍼티와 함수를 하나의 클래스로 모으는 것을 캡슐화라고 한다.

캡슐화에 속한 개념으로 정보 은닉이라는것이 있는데, 캡슐 내부의 로직이나 변수들을 감추고 외부에서는 기능(api)만을 제공하는 것을 의미한다.

상속

상속이란 클래스를 재사용하는 것이다. 상위 클래스를 하위 클래스에서 상속 받게 되면 상위 클래스의 프로퍼티나 메서드를 그대로 물려받을수 있다.

상속이 있기 때문에 코드를 재활용할 수 있고 그렇기 때문에 생산성이 높고 유지보수 하기가 좋다.

추상화

추상화란, 어떤 실체로부터 공통적인 부분이나 특성들만 한곳에 모으는것을 의미한다.

예를들어 지구를 본따 지구본을 만들 때 지구로부터 특성들(대륙의 위치, 위도, 경도)만 뽑아서 만든것이다.

객체지향에서의 추상화는 어떤 하위 클래스들에 존재하는 공통적인 메소드를 인터페이스로 정의하는것을 예로 들 수 있다.

다형성

다형성은 같은 모양의 함수가 상황에 따라 다르게 동작하는것을 의미한다.

오버로딩 : 함수의 이름은 같으나 함수의 매개변수를 달리하여 다르게 사용하는것을 의미한다.

오버라이딩 : 상위 클래스의 메소드를 하위 클래스에서 똑같은 이름으로 재정하는 것을 의마한다. (덮어씌우기)



클래스 정보 은닉화

public (기본값)

private이나 protected를 따로 작성하지 않으면 기본으로 public이다.

외부(클래스 인스턴스), 자식 클래스 내부, 클래스 내부 어디서든 참조가 가능하다.

protected

외부(클래스 인스턴스)에서 접근 할 수없지만 클래스 내부와 자식 클래스에서는 접근이 가능하다.

private

오직 자기 자신 클래스 내부에서만 사용이 가능하다.


접근 가능성publicprotectedprivate
클래스 내부OOO
자식 클래스 내부OOX
클래스 인스턴스OXX


정적 프로퍼티와 정적 메서드

클래스 함수 자체의 메서드와 프로퍼티

클래스에서 일반적으로 선언된 프로퍼티와 메서드는 인스턴스에서 접근할 수 있고 인스턴스가 생성될 때마다 생성된다.

하지만 static 키워드를 앞에 붙여주면 정적 프로퍼티 혹은 정적 메서드가 되는데

정적 프로퍼티와 정적 메서드는 클래스에서만 접근 할 수 있는 프로퍼티와 메서드이다. 즉 인스턴스에서는 접근 할 수 없다.

또한 인스턴스가 생성될 때마다 생성되는게 아닌 클래스가 생성될 때 단 한번만 생성된다.

반대로 일반 프로퍼티와 일반 메서드는 클래스에서 접근할 수 없다.


private vs static

private과 static은 굉장히 비슷해 보인다. 이 둘은 어떤 차이가 있을까?

목적성

private은 정보 은닉화의 목적들 두고 있고 static은 클래스로 메서드, 프로퍼티의 사용을 목적을 갖는다.

타입스크립트에서만?

public, protected, private은 타입스크립트에서만 사용이 가능하다.

반면에 static은 자바스크립트에서도 사용이 가능하다.

사용방식의 차이

또 다른 차이점은 클래스 내부에서 사용방식이 다른다.

// private
class Animal1 {
  private age = 10;

  show() {
    console.log(Animal1.age); // 에러
    console.log(this.age);
  }
}

const animal1 = new Animal1();
animal1.show();

// static
class Animal2 {
  static age = 10;

  show() {
    console.log(Animal2.age); 
    console.log(this.age); // 에러
  }
}

const animal2 = new Animal1();
animal2.show();

private으로 선언된 프로퍼티는 클래스 내부에서 this로 접근이 가능하다.

반면에 static으로 선언된 프로퍼티는 클래스 내부여도 클래스 자체로만 접근이 가능하다.

profile
console.log(noah(🍕 , 🍺)); // true

0개의 댓글