[python]Ducktyping

임정환·2023년 12월 28일
0

요즘들어 , Go와 python에 굉장히 관심이 많아졌다.
처음에는 '멀티 스레딩도 원활하지 않고 이걸 왜 쓰지?'란 생각이 들었으나
python만의 재미가 있는 것 같다. 오랜만에 포스팅하면서 , 동적타입 언어인 python의 장점을 극대화 시켜주는 ducktyping에 대해 알아보자

그래서 Duck Typing이 뭔데?

많은 개발자들이 JAVA로 프로그래밍을 입문하고 , 공부를 한다 ( 나는 개인적으로 별로 안 좋아 하지만 ) . 흔히 , JAVA를 공부하면 처음으로 OOP 관련해서 다음과 같이 배우게 된다.

interface Bird {
	public abstract void fly();
}

class Owl implements Bird {
	public void fly() {
    	System.out.println("부엉부엉");
     }
}

class Crawl implements Bird {
	public void fly() {
    	System.out.println("까악까악");
    }
}

polymorphism 을 사용하여 다음과 같이 정의된 클래스를 다음과 같이 사용할 수 있다.

public class Main{

    public static void main(String[] args) {

        Bird b = new Crawl();
        b.fly(); // 까악까악 

    }

}

이와 같은 업캐스팅은 다음과 같이 요약 가능하다.
너는 '새'로서 정의되었으니까 '새'처럼 날 수 있어
하지만 , 동적 타입인 python에서는 compile time이 존재하지 않고 얘가 '새'로서 정의 되었는지는 하느님도 알 수 없다. 그렇기때문에 , duck typing이 존재한다.
너가 '새'처럼 날 수 있다면 너는 '새'인거다.
위의 문장이 duck typing을 한 문장으로 요약해준다.

그래서 어떻게 사용하는데?

이미 생각없이 사용해 왔겠지만 , python의 많은 부분에 duck typing이 숨어있다.

magic method

class TestIter:
	def __init__(self):
    	self.maximum = 10
        self.current = 0
    def __iter__(self):
    	return self
    def __next__(self):
    	if current <= 10:
        	current += 1
        	return current-1
        else:
        	raise StopIteration 
    def __str__(self):
    	return "this is power of magic method!"

위와 같은 클래스는 다음과 같이 사용될 수 있다.

mytest = TestIter()
for i in mytest:
	print(i) # 1,2,3, ... ,10
 
 print(mytest) # this is power of magic method! 

class에 __str____iter__ 그리고 __next__가 정의되어있기에 for , in , print 등의 함수에 instance가 정상적으로 작동할 수 있다.
오리처럼 걷고 , 오리처럼 날 수 있다면 오리인것이다!

결론

사실 이 걸로 얘기하자면 끝도 없지만 , 나중에 조금 더 자세하게 적어야겠다.
요즘 바뻐서 잘 못 적고 있었는데 , python과 go에 흥미를 많이 붙이게 되어서 아마 당분간은 이 두 언어 중심으로 포스팅이 되지 않을까 싶다..?

profile
CS 박제

0개의 댓글

관련 채용 정보