뭔가 말이 굉장히 이론적이고 어려울거 같은데 실제로도 그런거같다.
객체지향이 핵심적으로 다루려는 부분은 기능이 아닌 객체로 삼는데,
객체를 도출하고 각각의 역할을 정의하는 것에 초점을 맞춘다.
라고 하는데 일단은 객체 자체를 중점적으로 그안에서 틀을 만들고 할일을 부여한다?
그런 느낌을 받았다.
시스템이 크고 복잡할수록 효과적으로 분해(구조분해할당?) 하고 구성할 수 있고
손쉽게 이해하고 효율적으로 다룰수 있게(가독성 및 유지보수 ?) 도와주는 방법으로
지금까지 가장 인기가 많다고 한다.
그만큼 도움이 되고 이유가 있을테니 꼭 이해하고 넘어가야할 부분인것 같다.
소프트웨어 프로그래밍 방식은 크게 두가지로 나뉘는데
캡슐화, 다형성, 클래스상속과 데이터 접근제한이 가능하면 객체지향적인 방식이고
가능하지 않는다면 절차지향적인 소프트 웨어라고 한다.
절차지향적인 소프트웨어 프로그래밍 언어는 C를 가리키는건가 ?
캡슐화 (Encapsulation)는 물리적으로 객체 내부의 세부적인 사항을 감추는 것을
칭한다고 하는데, typescipt에서 private와 같은 개념인건지..?
주워 듣기론 클로저라는 것도 있던데 그것과도 관련이 있는건지 ..?
목적은 변경하기 쉬운 객체를 만드는 것이라고 한다.
객체 내부의 접근을 제한하면 객체와 객체사이의 결합도를 낮출 수 있기 때문에
설계를 좀 더 쉽게 변경할수 있게 된다고 한다.
솔직히 이부분이 많이 헷갈린다. 굳이 가릴거면 왜만든건가 싶기도 하지만
다른 접근 방법이 있어서 그런거 같기도 하다. 실제로 typescript에서는 추상화 클래스
내부의 private를 인스턴스로는 접근하지 못하지만 extends하면 접근이 가능했던걸로
기억한다. (맞나?)
/** Encapsulation **/
class User {
private name: string;
private age: number;
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(28);
console.log(user.getName()); // 이용우
console.log(user.getAge()); // 28
console.log(user.name); // Error: User클래스의 name 변수는 private로 설정되어 있어 바로 접근할 수 없습니다.
typescript 예제이다. name과 age는 private 속성을 가지게 되어 외부에서 직접적으로 접근하지 못하지만,
getname이나 setname같이 메소드를 통하여 접근이 가능하다.
private는 접근 제한자(Access modifier)라고 불리며, public, protected(맞나) 종류가 있다.. (기억나는대로 적었는데 더있을 수도 있다)
상속 (Inheritance)이란 이미 정의된 상위 클래스의 특징을 하위 클래스에서 물려받아
코드의 중복을 제거하고 코드 재사용성을 증대 시킨다고 한다.
이것은 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려받는 것을
말한다고 하는데, 이 상속이라는 특성을 이용하여 layered architecture pattun을 구현하는 것같다.
개별클래스를 상속관계로 묶고 클래스 간 체계화된 구조를 파악하기 쉽다고 한다.
데이터와 메소드를 변경할때 상위에 있는 것만 수정하고 전체적으로 일관성을 유지 할수 있다고 한다.
기존에 작성된 클래스를 물려 받아 재활용하여 사용하기 때문에 객체지향 프로그래밍의
중요한 기능중 하나라고 한다.
이해하고 잘쓰면 코드 재사용성이 증가할수 있다는데, 그렇게 되면 코드가 복잡해지는 것을
사전에 어느정도 막아주고 테스드 코드를 작성하기 수월할거 같다는 생각이 든다.
/** 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
constructor는 한 클래스당 하나만 가질수 있는건가 ?
일단 Child 클래스가 Mother로 부터 super로 상속 받고 child라는 변수에 인스턴스를 선언하면서
해당하는 값을 호출시 인스턴스에 선언했던 인자들이 호출된다고 이해중이다.
추상화 (Abstraction)
'항해99 > 공부' 카테고리의 다른 글
RESTful API ? (0) | 2022.10.09 |
---|---|
주특기 주차 11조 (Node.js) 토론 (0) | 2022.10.04 |
TCP Socket ? (0) | 2022.10.04 |
HTTP / Web Server (0) | 2022.09.30 |
2022년 9월 17일 밤새도록 스파르톤 !! (1) | 2022.09.17 |