덕 타이핑 ( Duck typing)
오리처럼 생겨서 오리처럼 걷고 오리처럼 꽥꽥 소리를 낸다면 그것은 오리이다
이런 문구를 개발을 하는 동안 자주 만날 수 있을 것이다.
하지만 난 저 문장을 제대로 이해를 못했다!
좀 더 문장을 간결하게 만들어 보면
오리가 아니더라도 오리의 행동을 하면 오리라고 한다
이 문장을 이제 개발과 관련지어 보자.
객체 자신이 어떤 타입인지 중요하지 않고 특정 메소드나 속성의 존재로 타입을 판단한다.
특정 타입을 정의함으로써 그 타입을 특정하게 된다.
사실 이 문장도 잘 이해되지 않는다.
좀 더 쉽게 풀이해보자.
해당 인터페이스에서 정의한 프로퍼티나 메소드를 가지고 있다면 그 인터페이스를 구현한 것으로 인정한다.
이제는 좀 알겠다!!
그렇다면 이제 코드를 봐보자
var duck = {
quack: function () {
alert('꽥꽥!')
}
}
var person = {
quack: function () {
alert('이 사람이 오리를 흉내냅니다.')
}
}
var dog = {
growl: function () {
alert('그르르릉 멍멍')
}
}
function do_it_quack (duck) {
duck.quack()
}
do_it_quack(duck) // 꽥꽥!
do_it_quack(person) // 이 사람이 오리를 흉내냅니다.
do_it_quack(dog) // Uncaught TypeError: duck.quack is not a function
오리는 당연히 되고 사람 객체는 오리가 아니지만 quack 메서드를 통해 흉내낼 수 있어서 함수 실행
강아지는 quack을 몰라서 런타임 에러 발생
사람은 duck의 quack() 를 가지고 있기 때문에 오리가 아니더라도 에러가 나지 않는다.
사실 덕타이핑이란건 js를 하면서 크게 필요성을 느낄 수 없다.
왜냐하면 자바스크립트는 타입체크를 하지 않기 때문이다!!
타입체크를 해야하는 타입스크립트에선 덕 타이핑이 중요하게 쓰이는 것 같다
타입스트립트 코드를 봐보자.
interface People {
talk(): void;
whoAmI: string;
}
class Human implements People {
whoAmI = "human"
talk = () => {
console.log(`say ${this.whoAmI} : 말할 수 있어요`);
}
}
class Robot {
whoAmI = "robot"
talk = () => {
console.log(`say ${this.whoAmI} : 말할 수 있어요`);
}
}
const humanInstance = new Human();
const robotInstance = new Robot();
function startTalk(people: People): void {
people.talk();
}
startTalk(humanInstance); // --- 1) "say human : 말할 수 있어요"
startTalk(robotInstance); // --- 2) "say robot : 말할 수 있어요"
startTalk 함수를 보면 매개변수에서 타입체크를 하는데 매개변수로 들어오는 값은 People 객체의 형태를 띄어야한다.
그렇다면 startTalk(robotInstace)가 실행될때 에러가 날것같다!
하지만 에러나 가지 않는다
왜????
Class Robot은 Interface People이 정의한 whoAmI 와 talk 함수를 두개다 갖고 있기 때문이다!!
고로
Interface people은 아니지만 People이 가지고 있는 프로퍼티를 모두 가지고 있으므로 타입 체크를 통과하게 된다
타입스크립트의 Interface 문서를 보면
One of TypeScript’s core principles is that type checking focuses on the
shape that values have. This is sometimes called “duck typing” or “structural subtyping”. In TypeScript, interfaces fill the role of naming these types, and are a powerful way of defining contracts within your code as well as contracts with code outside of your project.
타입체크는 shape에 포커스를 맞춘다고 한다 한마디로 갖고 있는 프로퍼티가 같다면 같은 타입으로 인정해준다는 의미다!!
자바스크립트는 동적 타입의 언어이고 타입스크립트는 정적타입의 언어인데 덕타이핑은 동적인 성향이 더 강하게 느껴진다.
이 부분에 대해 다른 분들이 정리를 잘해주셨다!!
https://mygumi.tistory.com/367
덕 타이핑(Duck typing) 이란? :: 마이구미
이 글은 덕 타이핑에 대해 다룬다. 타입스크립트를 통해 다루지만, 덕 타이핑에 관련된 용어는 어느 언어라도 같은 맥락을 가진다. 참고한 글에는 정말 많은 레퍼런스가 있다. 모두 읽어보면 좋
mygumi.tistory.com
나도 이해한대로 정리를 해보겠다!
- 타입 검사 측면
- 다형성 측면
으로 동적, 정적 타입을 이해해야한다
타입 검사 측면
타입을 컴파일 단계에서 결정 -> 정적 타이핑
타입을 런타임 단계에서 결정 -> 동적 타이핑
타입스크립트는 컴파일 단계에서 타입검사를 해서
타입 검사 측면에서 보면 정적 타이핑이다.
다형성 측면
opp의 다형성의 정의를 보면
하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.
하나의 객체가 여러 개의 자료형 타입을 가질 수 있다.
정적 다형성은 컴파일 타임에서 바인딩을 의미하며 동적 다형성은 런타임 바인딩을 의미한다.
객체 지향 언어에서 정적 다형성을 overloading, 동적 다형성을 overriding이라고 한다.
overloading : 두 메서드가 같은 이름을 갖고 있으나 인자의 수나 자료형이 다른 경우
public double computeArea(Circle c) { ... }
public double computeArea(Circle c1, Circle c2) { ... }
public double computeArea(Square c) { ... }
overriding: 상위 클래스의 메서드와 이름과 signature가 같은 함수를 하위 클래스에서 재정의하는 것
public abstract class Shape {
public void printMe() { System.out.println("Shape"); }
public abstract double computeArea();
}
public class Circle extends Shape {
private double rad = 5;
@Override // 개발자의 실수를 방지하기 위해 @Override(annotation) 쓰는 것을 권장
public void printMe() { System.out.println("Circle"); }
public double computeArea() { return rad * rad * 3.15; }
}
public class Ambiguous extends Shape {
private double area = 10;
public double computeArea() { return area; }
}
다형성의 이런 동적 특성때문에 객체 지향 프로그래밍에서는 '동일한 인터페이스의 여러 객체, 동일한 객체의 여러 인터페이스'를 갖는것이 가능하다.
타입스크립트는 컴파일 단계에서 실제로 지정된 type인지 아니지 판단하지 않는다
런타입 단계에서 지정된 type이 가지고 있는 변수와 method가 있는지 판단하고 없다면 에러가 발생한다.
다형성 측면에서 보면 런타임 단계에서 객체가 어떤 형태 지니고 있는지 판단하는 동적 타이핑이다.
그렇다면 덕 타이핑을 쓰는 이유는 무엇인가?
인터넷을 좀 더 찾아보면 java라든지 c# 등등.. 이 언어들도 덕 타이핑을 쓴다고 한다.
인터페이스 상속을 이용하면 되는데 왜 굳이 덕타이핑을 쓰냐?? 라는 질문이 많은가보다.
인터페이스를 잘못 설계했다간 이 인터페이스를 쓰는 나중에 파생 클래스를 줄줄히 수정해야하는 일이 생긴다고 한다.
이런 문제를 만났을때 좀 더 유연하게 해결할 수 있도록 덕 타이핑을 쓴다고 한다.
그럼 이제 퇴근하러 가야겠다
뿅!
'웹' 카테고리의 다른 글
갤럭시 태블릿에서 VS Code Studio 설치하기 (0) | 2022.11.13 |
---|