[오늘의 코딩테스트]
추후 추가예정
[오늘의 한일]
● 객체 지향
- 객체 지향 이란?
객체 지향은 소프트웨어 개발에서 주요 구성 요소를 기능(Function)이 아닌 객체(Object)로 삼으며 “어떤 객체가 어떤 일을 할 것인가”에 초점을 맞춥니다.
즉, 객체를 도출하고 각각의 역할을 명확하게 정의하는 것에 초점을 맞추는 방법론입니다.
- 객체 지향의 4원칙
1. 캡슐화
객체 내부의 세부적인 사항을 감추는 것, 즉 중요한 정보를 외부로 노출시키지 않도록 만드는 것을 캡슐화(Encapsulation)라고 합니다.
/** Encapsulation **/
class User {
private name: string; // name 변수를 외부에서 접근을 할 수 없게 만듭니다.
private age: number; // age 변수를 외부에서 접근을 할 수 없게 만듭니다.
setName(name: string) { // Private 속성을 가진 name 변수의 값을 변경합니다.
this.name = name;
}
getName() { // Private 속성을 가진 name 변수의 값을 조회합니다.
return this.name;
}
setAge(age: number) { // Private 속성을 가진 age 변수의 값을 변경합니다.
this.age = age;
}
getAge() { // Private 속성을 가진 age 변수의 값을 조회합니다.
return this.age;
}
}
const user = new User(); // user 인스턴스 생성
user.setName('이용우');
user.setAge(30);
console.log(user.getName()); // 이용우
console.log(user.getAge()); // 30
console.log(user.name); // Error: User 클래스의 name 변수는 private로 설정되어 있어 바로 접근할 수 없습니다.
위의 예제에서 private의 경우 클래스 내에서만 접근이 가능하게 구현하였습니다. 위와 같은 기능을 캡슐화라고 합니다.
2. 상속
상속(Inheritance)은 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려 받는 것을 말합니다.
이미 정의된 상위 클래스의 특징을 하위 클래스에서 물려받아 코드의 중복을 제거하고 코드 재사용성을 증대시킵니다.
/** Inheritance **/
class Mother { // Mother 부모 클래스
constructor(name, age, tech) { // 부모 클래스 생성자
this.name = name;
this.age = age;
this.tech = tech;
}
getTech(){ return this.tech; } // 부모 클래스 getTech 메서드
}
class Child extends Mother{ // Mother 클래스를 상속받은 Child 자식 클래스
constructor(name, age, tech) { // 자식 클래스 생성자
super(name, age, tech); // 부모 클래스의 생성자를 호출
}
}
const child = new Child("이용우", "28", "Node.js");
console.log(child.name); // 이용우
console.log(child.age); // 28
console.log(child.getTech()); // 부모 클래스의 getTech 메서드 호출: Node.js
위의 예제에서 getTech라는 함수를 child가 그냥 사용하여서 현재 기술이 뭔지 알 수 있는 방법이 상속을 의미합니다.
3. 추상화
객체에서 공통된 부분을 모아 상위 개념으로 새롭게 정의하는 것을 추상화(Abstraction)라고 합니다. 즉, 불필요한 세부 사항을 생략하고, 중요한 특징만을 강조함으로써 코드를 더욱 간결하고 관리하기 쉽게 만드는 원칙입니다.
/** Abstraction **/
interface Human {
name: string;
setName(name);
getName();
}
// 인터페이스에서 상속받은 프로퍼티와 메소드는 구현하지 않을 경우 에러가 발생합니다.
class Employee implements Human {
constructor(public name: string) { }
// Human 인터페이스에서 상속받은 메소드
setName(name) { this.name = name; }
// Human 인터페이스에서 상속받은 메소드
getName() { return this.name; }
}
const employee = new Employee("");
employee.setName("이용우"); // Employee 클래스의 name을 변경하는 setter
console.log(employee.getName()); // Employee 클래스의 name을 조회하는 getter
Employee 클래스는 Human 인터페이스에서 정의한 name 프로퍼티와 setName, getName 메서드를 강제로 구현하게 되었습니다.
따라서, 동일한 인터페이스인 Human 인터페이스를 구현하는 모든 클래스는 해당 인터페이스에 선언된 프로퍼티와 메서드를 구현해야 함을 보장하게 되었습니다. 이로 인해 코드의 일관성을 유지할 수 있게하는 것이 추상화입니다.
4. 다형성
다형성(Polymorphism)은 하나의 객체(클래스)가 다양한 형태로 동작하는것을 의미합니다. 이는 객체가 가진 특성에 따라 같은 기능이 다르게 재구성되는 것을 의미합니다.
즉, 동일한 메서드나 함수 명을 사용하더라도, 클래스마다 그 메서드가 다르게 동작하는 것이 다형성의 핵심입니다.
/** Polymorphism **/
class Person {
constructor(name) { this.name = name; }
buy() {}
}
class Employee extends Person {
buy() { console.log(`${this.constructor.name} 클래스의 ${this.name}님이 물건을 구매하였습니다.`); }
}
class User extends Person {
buy() { console.log(`${this.constructor.name} 클래스의 ${this.name}님이 물건을 구매하였습니다.`); }
}
const employee1 = new Employee("이용우");
const employee2 = new Employee("김창환");
const user1 = new User("이태강");
const user2 = new User("김민수");
const personsArray = [employee1, employee2, user1, user2];
// personsArray에 저장되어 있는 Employee, User 인스턴스들의 buy 메소드를 호출합니다.
personsArray.forEach((person) => person.buy());
// Employee 클래스의 이용우님이 물건을 구매하였습니다.
// Employee 클래스의 김창환님이 물건을 구매하였습니다.
// User 클래스의 이태강님이 물건을 구매하였습니다.
// User 클래스의 김민수님이 물건을 구매하였습니다.
위의 클래스의 경우 같은 Person이라는 클래스를 상속받은 두개의 클래스가 다른 역할을 수행하는 것을 알 수 있습니다.
위와같이 하나의 클래스를 상속받더라도 서로 다른 역할을 할 수 있게끔 하는 것을 다형성이라고 합니다.
● 아키텍쳐패턴
- 계층형 아키텍처 패턴이란?
계층형 아키텍처 패턴(Layered Architecture Pattern)은 시스템을 여러 계층으로 분리하여 관리하는 아키텍처 패턴입니다. 현재 가장 널리 채택되고 있는 아키텍처 패턴 중 하나입니다.
- 계층형 아키텍처 패턴의 장점
- 관심사를 분리하여 현재 구현하려하는 코드를 명확하게 인지할 수 있습니다.
- 각 계층은 서로 독립적이며, 의존성이 낮아 모듈을 교체하더라도 코드 수정이 용이합니다.
- 각 계층별로 단위 테스트를 작성할 수 있어 테스트 코드를 조금 더 용이하게 구성할 수 있습니다.
- 3계층 아키텍처 (3-Layered Architecture)의 구성
- 컨트롤러(Controller) : 어플리케이션의 가장 바깥 부분, 요청/응답을 처리
- 클라이언트의 요청(Request)을 수신 한 후 서버에서 처리된 결과를 반환(Response)해주는 역할을 담당합니다.
- 서비스(Service) : 어플리케이션의 중간 부분, API의 핵심적인 동작이 많이 일어나는 부분
- 아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분입니다.
- 저장소(Repository) : 어플리케이션의 가장 안쪽 부분, 데이터베이스와 맞닿아 있음.
- 실제 데이터베이스와 통신하는 계층입니다.
[한줄평]
오늘은 심화 개인과제를 위한 학습을 진행하였다. 내일까진 다 마무리하고 개인과제를 시작해야겠다!
'코딩 > TIL' 카테고리의 다른 글
[TIL/30일차] 프로젝트 시작 (0) | 2024.06.13 |
---|---|
[TIL/29일차] 테스트 코드(JEST), 게임서버의 이해 (1) | 2024.06.11 |
[TIL/27일차] 프로젝트 마무리 (0) | 2024.06.10 |
[TIL/26일차] 팀 프로젝트 진행 - 2 (1) | 2024.06.03 |
[TIL/25일차] 새로운 팀 프로젝트 시작 (0) | 2024.06.03 |