본문 바로가기

프로그래밍/Java

정적 언어와 동적언어 그리고 덕 타이핑

반응형

학습목표

멘토링 시간에 정적타입 언어와 동적타입 언어에 대해서 답변하지 못했다... 분명 한번 봤던거 같은데.... 머릿속에서는 컴파일 언어와 인터프리터 언어일까?... 하고 생각이 들긴 했다. 깊게 파고들지는 않아도 된다고 하니, 개념정도만 훑어 봐야 겠다.

정적타입 언어와 동적타입 언어

쉽게 말해 정적타입 언어는 컴파일시 데이터타입을 정하는 언어이고, 동적타입 언어는 런타임시 데이터타입을 정하는 언어이다.

정적타입에는 흔히 C,C++,Java등이 있으며, 동적타입에는 'var'키워드를 사용하는 python,Javascript, Perl등이 있다.

정적타입 언어의 장점은, 데이터타입을 컴파일러가 검사하기 때문에, 사소한 버그들에 대해서 훨씬 잘 캐치할수 있다는 점(General의 장점이 여기서도!... 정확히 말하면, 이 장점을 극대화 한게 General 같다.)이다. 이에 반해 동적타입 언어는 런타임 중에 데이터타입을 결정하게 되므로, 오류가 실제 실행환경에서 발생한다. 즉, 발생했을때의 손해도 훨씬 크며, 식별하기 상대적으로 힘들다.

덕 타이핑

동적타입 언어의 데이터 타입 추론 방법중 하나로, 데이터타입이 아직 결정되지 않은 객체가 특정객체의 양상에 맞으면 그 특정객체로 추론하겠다는 소리이다.

즉 어떤 새가 있는데, 만약 그 새가 오리처럼 뒤뚱거리면서 걷고, 꽥꽥 거리는 소리를 낸다면, 이는 '오리' 라는 새의 양상과 부합함으로, 그 어떤 새를 '오리'로 추정하겠다는 소리이며, 이런 예시로 인해 덕 타이핑 이라는 이름이 붙게 되었다. 만약 정적타입의 언어였다면, 저 새는 '오리' 이므로, 걸을때 뒤뚱거려야 하고, 소리를 지를땐 꽥꽥거려야 한다. 라고 생각할수 있겠다.

아래의 두가지 코드(Java와 python) 예제를 보면서 정적타입과 동적타입의 구현방식의 차이와, 덕타이핑이 어떻게 적용되는지 생각해보자.

interface IEngine {
    void turnOn();
}
public class EngineV1 implements IEngine {
    public void turnOn() {
        // do something here
    }
}
///////////////////////////////////////////////////////////////
public class Car {
    public Car(IEngine engine) {
       this.engine = engine;
    }
public void run() {
        this.engine.turnOn();
    }
}
class Car:
   def __init__(self, engine):
      self.engine = engine
     def run():
      self.engine.turn_on()

한눈에 봐도 정적타입의 언어는 데이터타입을 미리 정의해야 하기 때문에, engine 타입을 미리 정의하고 호출하는 것을 볼수있다. → 코드량이 많아지고 복잡해 진다.

그러나 동적타입 언어는 engine 타입이 뭔지도 모르지만 일단 호출하고 보는 것이다. 만약 오류없이 수행이 된다면, python은 호출 된 객체를 engine 타입의 객체로 판단 한다. 이것이 덕 타이핑이다.

때문에, 만일 engine 타입의 객체가 아니라, 다른 객체가 들어왔다면, 실행을 하고나서야 오류가 있음을 인지할수 있다.

Feedback

컴파일과 인터프리터!.... 약간.... 한 12.5%정도 맞춘 듯한 느낌의 생각이었다.

파이썬과 자바스크립트는 인터프리터고, C와 Java는 컴파일 언어니까... 그런데 반대로 생각했다. 뭔가 Java로 서블릿을 구현하다보니 당연히 동적타입의 언어가 Java가 아닐까.. 생각했었다.... 이런 ㅋㅋ.... 좀더 생각해보면, 내 생각이 어느정도 맞는말 일수도 있지 않을까 싶다. 애초에 인터프리터는 실행중에 구문을 해석한다. 그러기에 당연히 모든 오류는 런타임중에 발생할 수 밖에 없다. 조금 아쉬웠는데, 다음부터는 좀 에바?.. 같아도 일단 지르고 봐야겠다.

References

파이썬 객체지향 프로그래밍 - 09, DuckTyping

Python duck typing (or automatic interfaces) | Hacker Noon

 

Python duck typing (or automatic interfaces) | Hacker Noon

Python duck typing (or automatic interfaces) Working with python full-time now I, more often, have insights about its way of doing things (or Zen of python for some people). One thing that blows my mind every time I find out in my daily saga is the duck ty

hackernoon.com

덕 타이핑 - 위키백과, 우리 모두의 백과사전

 

덕 타이핑 - 위키백과, 우리 모두의 백과사전

컴퓨터 프로그래밍 분야에서 덕 타이핑(duck typing)은 동적 타이핑의 한 종류로, 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다. 클래스 상속이나 인터페이스 구현으로 타

ko.wikipedia.org

공부나 하자 : 네이버 블로그

 

정적 타입 언어 vs 동적 타입 언어

정적타입 언어 한 변수의 타입이 컴파일 시간에 결정 된다면, 이는 정적 타입 언어이다. Java, C, C++, ...

blog.naver.com

 

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Comparator의 동작방식  (0) 2021.07.27
Comparator VS Comparable  (0) 2021.07.26
서블릿  (1) 2021.07.12
Spring VS Spring Boot 의 배포차이  (0) 2021.07.03
Non-Blocking,Blocking VS Async,Sync  (0) 2021.06.19