-
다형성 및 관련
함수 이름을 다루는데 있어서 오버로딩과 아주 비슷한 개념으로 자동 형전환 및 다형 성이 있다. 세 가지 모두 하나의 이름을 가지는 루틴이 여러 가지 타입의 매개변 수를 받을 수 있다. 구문적인 유사성에도 불구하고 이들의 의미와 용도는 큰 차이가 있다.
두 값의 최소값을 계산하고자 할 때 정수와 실수를 모두 지원할 수 있게 하려고 한다.
함수의 오버로딩을 이용하면 다음과 같이 작성할 수 있다.int min(int a, int b) { ... } double min(double x, double y) { ... }
다른 컨텍스트에서 불려진 경우 만약 정수가 주어진다면 컴파일러는 자동으로 정수 매개변수를 소수점 수로 변환한다.
min(j,k)를 호출하면, j나 k를 double타입으로 변환한 후 계산을 하게 된다.
소수점이 정보다 더 많은 유효비트를 가지므로 수치적으로 올바르다.자동형 전환(묵시적 형변환)은 기본타입에 대해 언어에서 타입을 자동으로 변환해주는 규칙을 정하고, '컴파일러’가 주어진 타입의 값을 문맥에 따라 필요로 하는 다른 타입으로 변환하는 것을 의미한다.
자동형전환 방식
더 큰타입으로 자동 형전환은 항상 허용된다.
(int -> double)
int타입이 double문맥에 오면 컴파일러가 자동으로 double로 자동 변환된다.값 절삭에 의한 형 전환이 있다
(double -> int)
더 작은 타입에 대하여 값을 절삭하여 형전환을 시킨다.강제 형 변환
자동 형 전환이 허용되지 않는 경우 타입 오류Obj..setBOund(x,y,(int)w*0.9, (int)h*0.9);
setBounds는 int를 요구한다. 그러나 매개변수는 (int)w가 우선순위에 의하여 w가 int형으로 강제캐스팅 되고, 0.9를 곱하여 double형이 되므로 타입 오류가 발생한다.
따라서 int(w*0.9) 형식으로 변환시켜야 한다.형 전환은 하나의 서브루틴에 맞게 매개변수를 수정하고, 오버로딩은 여러가지의 함수중에서 타입이 맞는 것을 선택하는 것이다.
다형성
하나의 서브루틴이 변환 없이 여러 타입의 매개변수에 대해 동작할 수 있는 것.
여러 타입의 값에 대해 동작할 수 있는 코드를 작성해야 한다.
(이들 타입이 공통된 성질을 가지고 있어야 한다.)매개변수 다형성
코드가 타입을 매개변수로 받게된다. 여러 타입에 대해 모두 적용될 수 있는 코드로 구성된다.public <T extends Number> static void someMethod(ArrayList<T> numberList, T number){ ... }
위와같이 대표적인 예시로 자바의 제네릭이 있다.
제네릭의 코드를 사용할 때 어떤 타입을 쓸지 매개변수로 명시하게 된다.파이썬처럼 동일한 함수코드에 대해 그냥 호출할 때 매개변수를 주면 그 타입으로 실행하게 된다.
서브타입 다형성
객체지향 언어의 기본성질인 상속을 이용한다. 실제 객체가 어떤 타입이냐에 따라서 호출되는 함수가 달라진다.메소드 오버라이딩: 동일한 이름의 메소드가 상속 클래스에서 다른 일을 함.
서브타입 다형성: 동일한 코드가 여러 타입에 대해 적용컴파일 시간 타입검사를 하는 객체지향 언어는, 일반적으로 매개변수 다형성과 서브타입 다형성을 모두 지원한다.
즉, 하나의 코드로 여러가지 것들을 수행하는 것이 가능하다.728x90