Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Udemy/Ts/section5/78: 선택적 프로퍼티, 매개변수 #53

Open
wants to merge 65 commits into
base: UdemyTs
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
d105911
🌱: README을 수정
4BFC Aug 26, 2024
06270b7
🌱: README을 수정
4BFC Aug 26, 2024
5e69dee
🌱: README을 수정
4BFC Aug 29, 2024
d7c1360
🌱: README을 수정
4BFC Aug 29, 2024
978d932
🌱: README을 수정
4BFC Aug 29, 2024
859bffc
🌱: README을 수정
4BFC Aug 29, 2024
e09d95d
🌱: README을 수정
4BFC Aug 29, 2024
3255009
🌱: README을 수정
4BFC Aug 29, 2024
ab9b8db
🌱: README을 수정
4BFC Aug 29, 2024
5f0f9f9
🌱: README을 수정
4BFC Aug 29, 2024
daaeeed
🌱: README을 수정
4BFC Aug 29, 2024
c8ec455
🌱: README을 수정
4BFC Aug 30, 2024
e2a15fd
🌱: README을 수정
4BFC Aug 30, 2024
61dd842
🌱: README을 수정
4BFC Aug 30, 2024
bce5c89
🌱: README을 수정
4BFC Aug 30, 2024
ed8fa00
🌱: issue templates 생성
4BFC Aug 30, 2024
1559fa2
🌱: pr-template 생성
4BFC Aug 30, 2024
691897a
🌱: pr-template 수정
4BFC Aug 30, 2024
44ec035
🌱: pr-template 수정
4BFC Aug 30, 2024
3c3280b
🚩: udemy section2의 14번 강의를 듣고 실습을 했다.
4BFC Aug 31, 2024
cbf04eb
🔀: Merge branch 'UdemyTs'
4BFC Aug 31, 2024
0f07929
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Aug 31, 2024
757fb99
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Aug 31, 2024
7e8ac7d
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Aug 31, 2024
aa89074
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 1, 2024
79304fe
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 1, 2024
eb21a7f
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 1, 2024
cf56f00
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 1, 2024
7dec10d
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 1, 2024
28200e9
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 1, 2024
621e700
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 2, 2024
5f9833d
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 2, 2024
06d966b
Merge branch 'UdemyTs' of https://github.com/Programming-Contents-Lis…
4BFC Sep 20, 2024
6dbfd8c
🚩: interface를 학습하기 위해 클래스를 학습하고 실습해보았다.
4BFC Sep 20, 2024
a63622c
🚩: dist의 컴파일된 js를 확인하기 위해서 es5에서 es6로 ts.config 변경
4BFC Sep 20, 2024
e0853e1
🚩: es6에서 es5로 컴파일 target을 변경
4BFC Sep 20, 2024
fc69d9e
🚩: this를 사용해서 출력한 class 내 전역 name 프로퍼티 정상 출력
4BFC Sep 20, 2024
32a0146
🚩: this키워드를 다시 한번 객체로 감싼 복제 함수 할당 후 출력 undefined 결과 확인, this를 사용시 주의 사항
4BFC Sep 20, 2024
61ff6bf
🚩: undefined 재확인
4BFC Sep 20, 2024
8416f2b
🚩: 복제한 class의 함수를 사용 가능하게 하기 위한 방법과 에러 임시적인 해결 단, 똑같이 구현 불가능
4BFC Sep 20, 2024
cbdaa30
🚩: 배열 프로퍼티에 접근하는 두 가지 방식
4BFC Sep 21, 2024
24ebd7d
🚩: private 설정으로 employees[N]에 값을 할당할수 없다. error
4BFC Sep 21, 2024
c7ed403
🚩: 런타임과 컴파일 과정의 private 영향을 ts, js 파일에서 확인
4BFC Sep 21, 2024
01311f2
🚩: private를 일반적으로 constructor에서 사용하는 방법
4BFC Sep 21, 2024
263c777
🚩: constructor 생성자 내부에 따로 선언하지 않고 매개변수로 선언하는 간단한 방법
4BFC Sep 21, 2024
85531b3
🚩: readonly의 사용방법과 build된 app.js에서 확인할 수 있는 property 키워드 확인 및 실습
4BFC Sep 21, 2024
59c1851
🚩: 상속을 구현하고 실습해보았다.
4BFC Sep 23, 2024
eaa0d8b
🚩: getter와 setter 학습 및 실습
4BFC Sep 23, 2024
d430357
🚩: new키워드, 인스턴스를 사용하지 않고 바로 사용할 수 있는 class Math와 같이 코드를 구현해 볼 것
4BFC Sep 23, 2024
2fb018e
🚩: 정적인 static을 사용해서 new, 인스턴스를 사용하지 않고 바로 함수 호출 및 정적 변수 사용 예시
4BFC Sep 23, 2024
39a1432
🚩: 정적인 함수, 변수를 클래스, 생성자 내에서 정상적으로 동작하기 위한 조건과 한계 그리고 주의할 점
4BFC Sep 23, 2024
77cd24d
🚩: abstract 클래스로 변환 및 abstract에 필요한 요규 조건 확인
4BFC Sep 23, 2024
720b1c8
🚩: 추상클래스에 정의된 추상 함수들을 상속 받고 있는 모든 클래스들에게 적용 및 확인
4BFC Sep 23, 2024
5bedd17
🚩: singleton pattern 적용 및 실습
4BFC Sep 23, 2024
6aef2e0
🚩: interface를 생성하고 실습을 해보았다.
4BFC Sep 24, 2024
997b174
🚩: interface의 의문, type으로 정의해서 사용해도 되지 않느가? 결국 하나의 타입 덩어리로 묶여 있지 않은가?
4BFC Sep 24, 2024
8da68cd
🚩: interface와 type의 차이점 설명, interface로 구현한 class 실습
4BFC Sep 24, 2024
7412ea4
🚩: 객체로 새성된 Person의 정보다 잘 적용되고 동작하는지 확인 및 실습
4BFC Sep 24, 2024
3929e40
🚩: interface의 상속관계의 확장 방식을 실습했다.
4BFC Sep 25, 2024
f53557f
🚩: type으로 함수에 사용할 함수 type 커스텀 방식 예시
4BFC Sep 25, 2024
02352ff
🚩: interface를 사용한 함수 타입 정의 방식과 실습
4BFC Sep 25, 2024
d9d237d
🚩: 함수 타입 커스텀 방식과 인터페이스 함수 정의의 차이
4BFC Sep 25, 2024
749ed74
🚩: 주석 오타로인한 수정
4BFC Sep 25, 2024
965cf7c
🔥: 불필요한 코드 제거 및 수업을 위한 환경 세팅
4BFC Sep 25, 2024
f2fec09
🚩: 선택적 매개변수를 구현하고 실습해본다.
4BFC Sep 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 30 additions & 25 deletions dist/app.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,31 @@
"use strict";
// const ADMIN = 0;
// const READ_ONLY = 1;
// const AUTHOR = 2;
var Role;
(function (Role) {
Role[Role["ADMIN"] = 0] = "ADMIN";
Role[Role["READ_ONLY"] = 1] = "READ_ONLY";
Role[Role["AUTHOR"] = 2] = "AUTHOR";
})(Role || (Role = {}));
var person = {
name: 'Maximilian',
age: 30,
hobbies: ['Sports', 'Cooking'],
role: Role.ADMIN, //0
};
person.role = Role.READ_ONLY;
if (person.role === Role.ADMIN) {
console.log(person.role);
}
else if (person.role === Role.READ_ONLY) {
console.log(person.role);
}
else if (person.role === Role.AUTHOR) {
console.log(person.role);
}
var Department = /** @class */ (function () {
// readonly는 프로퍼티를 초기화한 후 수정할 수 없다. 즉, 한번 할당 되면 변경되면 안되는 고유 번호들을 설정할 때 readonly를 사용한다.
function Department(id, name) {
this.id = id;
this.name = name;
// private id: string;
// private name: string;
this.employees = [];
// this.id = id;
// this.name = n
}
Department.prototype.describe = function () {
console.log("Department (".concat(this.id, "): ").concat(this.name));
};
Department.prototype.addEmployee = function (employee) {
// this.id = '2'; // readonly이기 때문에 error가 발생한다.
this.employees.push(employee);
};
Department.prototype.printEmployeeInformation = function () {
console.log(this.employees.length);
console.log(this.employees);
};
return Department;
}());
var accounting = new Department('1', 'Accounting');
accounting.addEmployee('Max');
accounting.addEmployee('Manu');
// accounting.employees[2] = 'Anna';
accounting.describe();
accounting.printEmployeeInformation();
16 changes: 0 additions & 16 deletions dist/basics.js

This file was deleted.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"watch": "tsc -w",
"start": "ts-node src/app.ts",
"build": "tsc --build",
"clean": "tsc --build --clean"
Expand All @@ -15,4 +16,4 @@
"ts-node": "^10.9.2",
"typescript": "^5.5.4"
}
}
}
24 changes: 0 additions & 24 deletions src/app.js

This file was deleted.

59 changes: 44 additions & 15 deletions src/app.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,50 @@
let userInput: unknown;
interface Named {
readonly name?: string;
outputName?: string; //선택적 프로퍼티 만들기 이렇게 선택적 프로퍼티를 생성하면 undefined로 정의된다.
}

let userName: string;
userInput = 5;
userInput = 'Max';
interface AddFn {
(a: number, b: number): number;
}

console.log(typeof userInput);
interface GreetAble extends Named {
greet(phrase: string): void;
}

if (typeof userInput === 'string') {
userName = userInput;
class Person implements GreetAble {
name?: string;
age: number;
constructor(N: number, n?: string) {
// 선택적 매개변수는 필수 요소인 매개변수 뒤에 있을 수 없다.
//뿐만아니라 선택적 매개변수 n이 name과 직결되는 매개변수이기에 해당 매개변수가 선택적 매개변수로 변경된다면 error가 발생할 것이다. 이유는 앞서 말했듯 n은 name과 직결되기에 필수 객체인 name또한 선택적 객체 죽, 선택적 프로퍼티로 변경해줘야 정상적으로 동작한다.
if (n) {
this.name = n;
}
this.age = N;
}
greet(phrase: string): void {
//앞서말했지만 선택 프로퍼티로 설정되면 기본 undefined로 설정이 되기 때문에 해당 갓이 존재할 경우(즉, undefined가 아닌경우) 해당 log가 동작하게 검수할 수 있는 조건문을 생성해야한다.
if (this.name) {
console.log(phrase + ' ' + this.name);
}
else {
console.log('Hi!');
}
}
}

function generateError(message: string, code: number): never { //:never
throw { message: message, errorCode: code };
} //generateError는 never타입을 반환한다. 이유는 throw 때문인데 절대적으로 값이 변하면 안되기 때문이다. 따라서 never타입은 다음과 같다.
//never 타입은 어떠한 값도 반환하지 않는 함수의 반환 타입을 나타낸다. 이 타입은 함수가 정상적으로 완료되지 않고 항상 예외를 던지거나 무한 루프에 빠져 끝나지 않는 경우에 사용된다. 오해하지 말아야할 것은 literal type으로 확인을 하면 void로 선언이 되어있지만 throw를 사용하면 무조건으로 never가 반환된다. 따라서 암묵적으로 never를 반환은 하지만 never타입임을 코드에 명시해주는 것이 좋다.
let user1: GreetAble;

user1 = new Person(26, 'Mike');

// user1 = {
// name: "Mike",
// age: 26,
// greet(phrase: string) {
// console.log(phrase + ' ' + this.name);
// }
// };

user1.greet('Hi there - I am');

const resultError = generateError('An error occurred!', 500);
console.log('resultError: ', resultError); //본래 일반적인 함수라면 undefined를 반환해야한다.
//하지만 아무것도 반환되는 것이 없다. 이유는 generateError는 never 타입으로 반환이 되기 때문에 컴파일이 중도 정지가 되는 것이다.
//참고로 throw는 try,catch를 사용해도 무시하지 않고 중도 정지가 된다.
console.log(user1);
41 changes: 0 additions & 41 deletions src/basics.ts

This file was deleted.

123 changes: 123 additions & 0 deletions src/classes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
abstract class Department {
// private id: string;
// private name: string;
//현재 Department는 추상클래스로 id가 다른 클래스에서도 사용 되어야해서 private에서 protected로 접근제한자를 변경
protected employees: string[] = []; // employees 변경
static fiscalYear = 2020;
// id 변경
constructor(protected readonly id: string, public name: string) {
// this.id = id;
// this.name = n
// console.log(this.fiscalYear);
console.log(Department.fiscalYear); //정상동작
}
static createEmployee(name: string) {
return { name: name };
}

//abstract인 추상 함수를 사용하라면 해당 class 또한 abstract로 정의 되어야 한다.
abstract describe(this: Department): void; //또한 해당 추상 함수에 어떠한 것도 정의되어 있으면 안된다.
//이제 Department와 연관된 모든 클래스들은 Error가 발생할 것이다.
// {
// console.log(`Department (${this.id}): ${this.name}`);
// }

addEmployee(employee: string) {
// this.id = '2'; // readonly이기 때문에 error가 발생한다.
this.employees.push(employee);
}

printEmployeeInformation() {
console.log(this.employees.length);
console.log(this.employees);
}
}
class ITDepartment extends Department {
admins: string[];
constructor(id: string, admins: string[]) {
super(id, 'IT');
this.admins = admins;
}
//추상함수 정의
describe() {
console.log(`Department (${this.id}): ${this.name}`);
};
}

//현재 상황에서 회계관련 문서가 하나밖에 없다고 가정
//따라서 private를 활용해야 한다.
class AccountingDepartment extends Department {
private lastReport: string;
private static instance: AccountingDepartment;

get mostRecentReport() {
if (this.lastReport) {
return this.lastReport;
}
throw new Error('No report found.');
}

set setMostRecentReport(value: string) {
if (!value) {
throw new Error('Please pass in a valid value!')
}
this.addReport(value);
this.lastReport = value;
}
//접근제한자: private 부여
private constructor(id: string, private reports: string[]) {
super(id, 'Account');
this.lastReport = reports[0] || "";
}

static getInstance() {
//this.instance 또는 직접적으로 접근
if (AccountingDepartment.instance) { //인스턴스가 없다면 new키워드로 새로운 인스턴스를 생성한다. 이를 통해 하나의 인스턴스로만 동작
return this.instance;
}

this.instance = new AccountingDepartment('d2', []);
return this.instance;
}

describe() {
console.log(`Department (${this.id}): ${this.name}`);
};

addReport(text: string) {
this.reports.push(text);
}

printReports() {
console.log(this.reports);
}
}

// const accounting = new Department('1', 'Accounting'); //추상 클래스는 인스턴스할 수 없다.
const ITaccounting = new ITDepartment('2', ['Max']);

Math.pow(1, 2);
const employees1 = Department.createEmployee('Max'); //정적 메소드 불러오는 방식
console.log(employees1, Department.fiscalYear);

ITaccounting.addEmployee('Max');
ITaccounting.addEmployee('Manu');

// accounting.employees[2] = 'Anna';
ITaccounting.describe();
ITaccounting.printEmployeeInformation();

// const NewAccounting = new AccountingDepartment('d2', []); //이제 AccountingDepartment를 사용하려면 생성자가 static이기에 직접 접근방식으로 사용해야한다.

const NewAccounting = AccountingDepartment.getInstance();
const NewAccounting2 = AccountingDepartment.getInstance();
//이제 이둘의 클래스 변수는 하나의 인스턴스로만 접근해서 동작하고 구현된다.
console.log(NewAccounting, NewAccounting2);

// console.log(NewAccounting.mostRecentReport);
NewAccounting.setMostRecentReport = 'Year End Report';
NewAccounting.addReport('Something went wrong...');

console.log(NewAccounting.mostRecentReport);

NewAccounting.printReports();
24 changes: 0 additions & 24 deletions src/functions.ts

This file was deleted.

Loading