ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다형성 및 관련
    프로그래밍언어론 2023. 4. 12. 17:16

     

    다형성 및 관련

    함수 이름을 다루는데 있어서 오버로딩과 아주 비슷한 개념으로 자동 형전환 및 다형 성이 있다. 세 가지 모두 하나의 이름을 가지는 루틴이 여러 가지 타입의 매개변 수를 받을 수 있다. 구문적인 유사성에도 불구하고 이들의 의미와 용도는 큰 차이가 있다.

     

    두 값의 최소값을 계산하고자 할 때 정수와 실수를 모두 지원할 수 있게 하려고 한다.
    함수의 오버로딩을 이용하면 다음과 같이 작성할 수 있다.

     

    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

    '프로그래밍언어론' 카테고리의 다른 글

    명령문구조  (0) 2023.04.14
    아키텍쳐 - 1  (2) 2023.04.14
    범위내 바인딩  (0) 2023.04.12
    모듈  (0) 2023.04.10
    선언과 정의  (0) 2023.04.09

    댓글

Designed by Tistory.