객체지향타입
객체 단위
로 처리프로퍼티와 메소드
Property
: 객체의 속성을 나타내는 접근 가능한 이름과 활용 가능한 값을 가지는 특별한 형태Method
: 객체가 가지고 있는 동작클래스
틀
오브젝트
구현할 대상
인스턴스
구체적인 실체
public class Animal {} // Class
public class Main{
public static void main(String[] args) {
Animal cat; // Object
cat = new Animal(); // Instance
}
}
인스턴스화
클래스 코드 → 구체화
, 개별화
→ 객체 인스턴스
객체 인스턴스 → 일반화
, 추상화
→ 클래스 코드
캡슐화
추상화
다형성
class Animal {
public void animalMove() {
System.out.println("동물이 움직입니다");
}
}
class Human extends Animal {
public void animalMove() {
System.out.println("사람이 두발로 걷습니다");
}
}
class Tiger extends Animal{
public void animalMove() {
System.out.println("호랑이가 네발로 뜁니다");
}
}
class Eagle extends Animal{
public void animalMove() {
System.out.println("독수리가 하늘을 납니다");
}
}
public class AnimalMove {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Human();
AnimalMove test = new AnimalMove();
test.moveAnimal(hAnimal); // 사람이 두발로 걷습니다
test.moveAnimal(tAnimal); // 호랑이가 네발로 뜁니다
test.moveAnimal(eAnimal); // 사람이 두발로 걷습니다
}
public void moveAnimal(Animal animal) {
animal.animalMove();
// 같은 메서드에서 다른 출력
}
}
→ 동일한 메서드를 오버라이딩해 하나의 코드가 다양한 구현을 가질 수 있음
→ 유사한 클래스가 추가되는 경우 유지보수에 용이하고 if 문이 사라지는 장점
IS-A 관계
HAS-A 관계
new
키워드로 인스턴스를 생성할 수 있고 하위 클래스를 만들 수 있다class Human{
constructor(age){
this.age = age;
}
howoldareyou() {
console.log(`this man is ${this.age}years old`;
}
}
class Chulsoo extends Human {
howoldareyou(){
super.howoldareyou();
console.log(`this man called Chulsoo)`;
}
}
const chulsoo = new Chulsoo(12);
chulsoo.howoldareyou()
//this man is 12years old
//this man called Chulsoo
Prototype Chain
을 형성해서 상속function Human(age){
this.age = age;
}
Human.prototype.howoldareyou = function(){
console.log(`this man is ${this.age}years old`;
}
function Chulsoo(age){
Human.call(this, age);
}
Chulsoo.prototype = Object.create(Chulsoo.prototype);
Chulsoo.prototype.constructor = Chulsoo;
Chulsoo.prototype.howoldareyou = function(){
Human.prototype.howoldareyou.call(this);
console.log(`this man called Chulsoo)`;
}
const chulsoo = new Chulsoo(12);
chulsoo.howoldareyou()
//this man is 12years old
//this man called Chulsoo
함수가 정의될때는
constructor
자격 부여 → new
로 객체 생성 가능prototype Object
생성 및 연결Prototype Object
는 일반적인 객체와 같다constructor
(Prototype Object와 같이 생성된 함수를 가리킴)와 __proto__
(Prototype Link - 객체 생성 시 조상이었던 함수의 Prototype Object를 가리킴)를 가지고 있다프로토타입 체인 (상속)
Object
를 최상위로 전체적인 구조는 다음과 같다this
this()
super
super()
모듈화, 캡슐화, 확장용이성 등을 고려한 소프트웨어 구축을 위한 설계
S
: Single Responsibility Principle (단일 책임 원칙)O
: Open-Closed Principle (열린-닫힌 원칙)L
: Liskov Substitution Principle (리스코프 치환 원칙)I
: Interface Segregation Principle (인터페이스 분리 원칙)D
: Dependency Inversion Principle (의존성 역전 원칙)class Animal {
constructor(name: string){ }
getAnimalName() { } // Animal Property 관리
saveAnimal(a: Animal) { } // DB 관리
}
class Animal { // Property 다루는 역할
constructor(name: string){ }
getAnimalName() { }
}
class AnimalDB { // DB에 정보를 insert라거나 read하는 역할
getAnimal(a: Animal) { }
saveAnimal(a: Animal) { }
}
const animals: Array<Animal> = [
new Animal('lion'),
new Animal('mouse')
];
function AnimalSound(a: Array<Animal>) {
for(int i = 0; i <= a.length; i++) {
if(a[i].name == 'lion')
return 'roar';
if(a[i].name == 'mouse')
return 'squeak';
}
}
AnimalSound(animals);
makeSound
라는 메서드를 Animal
클래스에 생성하고 오버라이딩해서 Animal
이 추가되더라도 로직에 변화가 없도록 해야한다function AnimalLegCount(a: Array<Animal>) {
for(int i = 0; i <= a.length; i++) {
if(typeof a[i] == Lion)
return LionLegCount(a[i]);
if(typeof a[i] == Mouse)
return MouseLegCount(a[i]);
if(typeof a[i] == Snake)
return SnakeLegCount(a[i]);
}
}
AnimalLegCount(animals);
a
에 해당하는 타입을 하위 function
인 AnimalLegCount에서 모두 알아야하는게 문제!function AnimalLegCount(a: Array<Animal>) {
for(let i = 0; i <= a.length; i++) {
a[i].LegCount();
}
}
AnimalLegCount(animals);
type
에 관계없이 count
하는 데에만 신경쓰는것이 중요Animal
클래스에서는 LegCount
메서드를 오버라이딩해서 각각의 역할을 수행하도록 수정하는게 중요!interface Shape {
drawCircle();
drawSquare();
drawRectangle();
}
interface
에 구현 → 클라이언트에서 필요하지 않은 메서드를 의존하도록 강요하면 안된다interface Shape {
draw();
}
interface ICircle {
drawCircle();
}
interface ISquare {
drawSquare();
}
interface IRectangle {
drawRectangle();
}
interface ITriangle {
drawTriangle();
}
class XMLHttpService extends XMLHttpRequestService {}
class Http {
constructor(private xmlhttpService: XMLHttpService) { }
get(url: string , options: any) {
this.xmlhttpService.request(url,'GET');
}
post() {
this.xmlhttpService.request(url,'POST');
}
//...
}
Http
인스턴스를 고려해야한다참고자료
https://medium.com/@flqjsl/js-class-와-prototype-의-차이-7dc1d7531ae0
https://medium.com/@bluesh55/javascript-prototype-이해하기-f8e67c286b67
https://burning-camp.tistory.com/78