Elice SW 2/TIL

DAY 24 - TIL (2)

자이구 2022. 5. 7. 17:38

객체 지향 프로그래밍

OOP는 컴퓨터 프로그램을 객체의 모임으로 파악하려는 프로그래밍 패러다임

객체들은 서로 메세지를 주고 받을 수 있으며 데이터를 처리할 수 있음

강한 응집력과 약한 결합력

 

   장점

  • 프로그램을 유연하고 변경이 용이
  • 프로그램의 개발과 보수를 간편하게 만듬
  • 직관적인 코드 분석을 가능하게 함

 

클래스

객체를 만들기 위한 설계도, 객체의 기능(메서드)과 속성(변수)을 구현한 것

 

클래스의 요소: 멤버/필드/생성자/메소드

인스턴스 : new 연산자에 의해서 생성된 객체

 

클래스 생성하기

  • new를 사용하여 클래스의 인스턴스를 생성 - 생성자사용
  • 클래스 안에서 this를 앞에 붙이면 클래스의 멤버를 의미
class Person {
	name: string;
	constructor(name: string) {
		this.name = name;
	}
	say() {
		return "Hello, My name is "+ this.name;
		}
}

let person = new Person("june");

 

접근 제어자

속성 또는 메소드로의 접근을 제한하기 위해 사용

  • public
  • protected
  • private

--Java와 다르게 package 개념이 없어 default 접근 제어자는 존재하지 않음

 

public

프로그램 내에서 선언된 멤버들이 자유롭게 접근할 수 있음

타입 스크립트에서 기본적으로 public으로 선언

 

private

멤버가 포함된 클래스 외부에서의 접근을 막음

 

protected

멤버가 포함된 클래스와 그 하위 클래스 외부에서의 접근을 막음

 

상속

  • 한 클래스가 다른 클래스에서 정의된 속성(자료,함수)를 이어받아 그대로 사용
  • 이미 정의된 클래스를 바탕으로 필요한 기능을 추가하여 정의
  • 파생된 클래스는 하위클래스
  • 기초 클래스는 상위클래스

상속을 하는 이유

  • 상속을 통하여 기존 클래스의 속성(자료,함수) 재사용
  • 기존 클래스의 일부 변경도 가능
  • 상속을 이용하게 되면 복잡한 GUI 프로그램을 순식간에 작성
  • 상속은 이미 작성된 검증된 소프트웨어를 재사용
  • 신뢰성 있는 소프트웨어를 손쉽게 개발, 유지 보수
  • 코드의 중복 감소

 

Getters & Setters / readonly / static

Getters & Setters

비공개로 설정하려는 속성은 private로 설정하고, 속성값을 읽고 수정하는 getter/setter 함수를 사용

readonly

읽기만 가능한 속성을 선언하기 위해 사용

static

전역 멤버를 선언할 때 사용

전역멤버 : 객체마다 할당되지 않고 클래스의 모든 객체가 공유하는 멤버

 

추상클래스

  • 추상 클래스는 다른 클래스들이 파생될 수 있는 기초 클래스
  • 직접 인스턴스화 할 수 없음
  • abstract 키워드는 추상 클래스나 추상 메소드를 정의하는데 사용
  • 추상 메소드는 클래스에는 구현되어 있지 않고, 파생된 클래스에서 구현

추상 클래스를 활용한 디자인 패턴

  • 프로그램 일부분을 서브 클래스로 캡슐화해 전체 구조를 바꾸지 않고 특정 단계의 기능을 바꾸는 것을 디자인 패턴
  • 전체적인 알고리즘은 상위 클래스에서 구현하고 다른 부분은 하위 클래스에서 구현
  • 전체 구조는 유사하지만 부분적으로 다른 구문으로 구성된 메소드의 코드 중복을 최소화 할 수 있음
abstract class Parent {
//템플릿 메소드: 자식에서 공통적으로 사용하는 부분(someMethod)
	public do() {
		console.log("Parent에서 실행 - 상");
		this.hook(); // 훅 메소드: Child에서 구현해야 할 부분
		console.log("Parent에서 실행 - 하");
	}
	abstract hook(): void
}

class Child extends Parent {
	hook(): void {
		console.log("Child");
	}
}

const child = new Child();
child.do();
// 실행 결과
// Parent에서 실행 - 상
// Child
// Parent에서 실행 - 하