Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

자바에서의 Generic Programing #4

Open
masiljangajji opened this issue Sep 25, 2023 · 0 comments
Open

자바에서의 Generic Programing #4

masiljangajji opened this issue Sep 25, 2023 · 0 comments

Comments

@masiljangajji
Copy link
Member

masiljangajji commented Sep 25, 2023

1. Type Check In Java

Smalltalk 라는 초기의 객체지향 언어가 있습니다.

Smalltalk의 특징은 변수의 type이 존재하지 않습니다.

모든 변수는 모든 type의 데이터를 보유할 수 있으며

매개변수에도 type이 없음으로 모든 type의 매개변수 값에 서브루틴을
적용할 수 있습니다.

이러한 작동방식은 매우 편리하고 간단해보입니다.

실제로 이러한 방식은 프로그램 작성을 더 쉽게 만들어 주지만

안정적인 프로그램을 작성하는 것은 어렵게 만듭니다

내가 원하는 데이터 type만 갖고있는 구조를 만든다고 할 떄

원하지 않는 type에 대한 처리를 따로 해줘야 하기 때문입니다.

이러한 이유로 자바는 C와 비슷하게 매우 엄격하게 type checking 을 하며

변수는 하나의 type만을 가질 수 있습니다.

또한 모든 변수에 대해서 type을 지정해 줘야만 사용 가능합니다.




2. Parameterized Type

다음은 사용자 정의 Stack Class 입니다.

 class Stack {

        List<Integer> list;

        Stack() {
            list = new ArrayList<>();
        }

        public void push(Integer value) {
            list.add(0, value);
        }

        public Integer pop() {
            return list.remove(0);
        }

        public boolean isEmpty() {
            return list.isEmpty();
        }

    }

간단한 형식으로 push , pop , isEmpty 3가지 연산이 구현돼있습니다.

그런데 만약 Integer Type이 아닌

Double , Character , Boolean Type 에 대한 Stack을 정의하고 싶으면 어떨까요??

정의하고 싶은 Type의 개수 만큼 똑같은 로직의 클래스를 작성해야 할 것입니다.

이는 매우 비효율적일 것입니다.

여기서 나온 개념이 Parameterized Type < T > 입니다.

Type을 매개변수화 하여 위에서 설명한 Smalltalk 와 같이

어느 Type이든 올 수 있도록 만드는 것입니다.

코드를 다시 작성해 보겠습니다.

class Stack<T> {

    List<T> list;


    Stack() {
        list = new ArrayList<>();
    }

    public void push(T value) {
        list.add(0, value);
    }

    public T pop() {
        return list.remove(0);
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

}

이렇게 Type을 T 로 지정함으로써 어느 Type이든 올 수 있게 만들어

Double , Character , Boolean Type 등등의 Type 에 대한

연산또한 가능해 졌습니다.

같은 이유로 우리가 쓰는 Collection 은 Collection< T >로 정의되어 있습니다.

또 이러한 행위를 Generic Programing 이라 지칭합니다.



여기서 한가지 의문점이 생깁니다.

이러면 Smalltalk 와 똑같지 않나?

자바는 엄격하게 Type Check를 한다며??

어느 Type이든 올 수 있다면 안정적인 프로그램을 짜기 힘든것 아닌가?

이러한 issuu를 컨트롤 하는 테크닉을 배워보겠습니다.



Bounded Type

기본적인 사용법은 다음과 같습니다 < T extends Number>

뒤에 extends 받는 것은 굳이 Number가 아니여도 문제없습니다.

또한 여러개의 extends 또한 가능합니다.

public static <T extends Number
            & Comparable<T>> T maximum(T x, T y, T z) {
        T max = x;
        if (y.compareTo(max) > 0) {
            max = y;
        }

        if (z.compareTo(max) > 0) {
            max = z;
        }
        return max;
    }

이 extends의 의미는 T 에 들어갈수 있는 Type을 제한하겠다는 의미입니다.

기존에는 무엇이든 T 의 Type으로 올 수 있었다면

이제는 T 가 extends 하는 Type만 올 수 있게됩니다.

예를 들어

class Stack<T extends Number> {

    List<T> list;


    Stack() {
        list = new ArrayList<>();
    }

    public void push(T value) {
        list.add(0, value);
    }

    public T pop() {
        return list.remove(0);
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

}

다음과 같이 Class를 변경한다면

T 에는 Number의 SubType만 올 수 있습니다.

Stack<Integer>stkInt = new Stack<>(); // 정상
Stack<Double>stkDouble = new Stack<>(); // 정상 
            
Stack<Character>stkChar= new Stack<>(); / Error

이런식으로 Parameterized Type을 사용하돼

올 수있는 Type에 제한을 둠으로써 안정성을 올리는 것입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant