관리 메뉴

CASSIE'S BLOG

[슈퍼코딩] 45-2강 자바 제너릭과 Wrapper 본문

PROGRAMMING/슈퍼코딩 강의 정리

[슈퍼코딩] 45-2강 자바 제너릭과 Wrapper

ITSCASSIE1107 2023. 12. 15. 12:05
반응형

 

 

원시타입을 안 좋아하는 사람때문에 Wrapper 클래스 컨셉이 사용되게 되었다. 

 

모든 타입이 다 객체여야한다 그래서 Wrapper 클래스가 생긴 거임. 

 

남이 만든 코드를 라이브러리라고 하는데 그런 라이브러리를 사용할 때 integer 타입이나 long타입이나 그런 Wrapper 클래스로 지원을 하고 있다. 

 

세번째가 제일 중요하다고 함. 
Generic 프로그래밍 지원 
Generic 프로그래밍에서 Wrapper 클래스만 지원하기 떄문이다. 

 

제네릭을 사용하지 않는 경우:

// Object 타입을 사용하므로 형 변환 필요
ArrayList list = new ArrayList();
list.add("Hello");
String greeting = (String) list.get(0); // 형 변환 필요

 

 

제네릭을 사용하는 경우:

 


// 제네릭을 사용하면 형 변환이 필요하지 않다.
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
String greeting = list.get(0); // 형 변환이 필요하지 않음

 

 

제네릭을 사용하면 코드에서 형 변환을 할 필요가 없어지므로 코드가 더 간결해집니다. 또한, 컴파일러가 타입을 강제하므로 코드의 안전성이 향상됩니다. 이것이 제네릭을 사용하는 주요 이점 중 하나입니다. 이로써 코드가 더 간결하면서도 타입 안전성을 확보할 수 있습니다.

 

// Object 타입을 사용하므로 형 변환 필요 이거라고 말해줬는데 모든 부모는 Object 타입이라 형변환을 해줘야한다는 말이지?

 

맞습니다. Object는 Java에서 모든 클래스의 최상위 부모 클래스이기 때문에, 모든 객체는 Object 타입으로 다룰 수 있습니다. 따라서 ArrayList와 같이 Object 타입을 사용하는 경우, 저장된 모든 객체를 Object로 다루게 됩니다.

그러나 Object로 다룬다는 것은 컴파일러에게 실제 객체의 타입 정보를 잃게 되는 것을 의미합니다. 따라서 컴파일러는 컴파일 시에는 어떤 타입의 객체가 저장되었는지 알지 못하고, 런타임 시에 형 변환을 통해 실제 타입을 알아내어 사용해야 합니다.

예를 들어:

 

 

이러한 형 변환은 런타임에 타입 안전성을 확인하지 않고, 프로그래머가 명시적으로 형 변환을 수행하여야 합니다. 이는 실수로 인한 런타임 오류의 가능성을 내포하고 있습니다.

제네릭을 사용하면 컴파일러가 타입 정보를 유지하면서 컴파일 시에 타입 검사를 수행합니다. 따라서 제네릭을 사용하면 런타임에 발생할 수 있는 형 변환 관련 오류를 사전에 방지할 수 있습니다.

 

 

 

 

 

 

문득 생각이 들었네 이거 이렇게 하는게 맞나?

 

 

이거 장점이 Object로 만들면 Integer도 넣어도 되고 Boolean도 넣어도 되고 

 

다운캐스팅은 런타임에러가 많이 날 수 있어서 보통 if문으로 감싸고 그렇게 많이 한다함 

 

불안해서 막 내가 instanceOf 함수를 추가해야하나 이런 생각이 든다고함. 

 

Java에서 instanceof 연산자는 객체가 특정 클래스의 인스턴스인지 여부를 확인하는데 사용됩니다. 이 연산자는 런타임에 객체의 실제 타입을 확인하고, 해당 타입에 맞는지 여부를 불리언(boolean) 값으로 반환합니다.

instanceof 연산자는 다음과 같은 문법을 갖습니다:

 

object instanceof ClassType

 

여기서 object는 검사하고자 하는 객체이고, ClassType은 검사하려는 클래스나 인터페이스 타입입니다.

아래는 간단한 예제입니다:

 

class Animal {}

class Dog extends Animal {}

public class InstanceOfExample {
    public static void main(String[] args) {
        Animal animal = new Dog();

        if (animal instanceof Animal) {
            System.out.println("animal is an instance of Animal");
        }

        if (animal instanceof Dog) {
            System.out.println("animal is an instance of Dog");
        }
    }
}

 

이 예제에서 Dog 클래스는 Animal 클래스를 상속하고 있습니다. 따라서 new Dog()로 생성된 객체는 Animal 타입이기도 합니다. instanceof 연산자를 사용하여 객체가 특정 타입에 속하는지 여부를 확인할 수 있습니다. (보통 if문이랑 같이 쓰네 instanceof 함수가) 

instanceof를 사용할 때는 주의해야 합니다. 객체의 타입을 확인하는 것은 때때로 필요하지만, 이는 보통 객체 지향 프로그래밍의 원칙을 위배할 수 있으며 코드의 설계를 개선할 필요가 있는 시점이 될 수 있습니다. 가능하면 다형성을 활용하고, 필요한 경우에만 instanceof를 사용하는 것이 좋습니다.

 

 

 

 

클래스와 인터페이스를 제네릭으로 쓸 수 있다고함. (메소드도 가능하긴 한데 일단 넘어간다고함) 

 

사용방법은 너무 쉽다고함
Object가 너무 상위라서 불안한 경우 
그냥 Object 처럼 쓰려고 하는건데 

 

1. 그냥 <T> 이렇게 적어주기만 하면 된다는 거임. 

 

2. Object 대신에 그냥 T 넣으면 된다. 

 

 

 

 

 

제네릭을 해주면 
인스턴스가 로딩될떄마다 타입이 바뀌는 "카멜레온:처럼 변하는 친구가 됐다. 

 

 

오른쪽 사진에 왼쪽부분에  
GenericPrint<String> print =
이렇게했잖아 그러면 StringPrint가 된거다 

 

원래 다운캐스팅을 해야하는데 그런게 없어짐 

반응형