JAVA

리터럴과 제네릭

lys4321 2024. 2. 19. 23:03

- 리터럴( Literal ) 이란?

  1. 사전적인 의미로 '문자 그대로' 라는 의미

  2. 프로그램에서 사용하는 의미로는 숫자, 문자, 논리 값(Char, Int, Double 등)

  => 프로그램에서 사용하는 문자 그대로의 값

 

- JAVA에서 타입은 2가지로 나뉘는데 하나는 원시(기본) 타입(Primitive Type)과 참조 타입(Reference Type)이다.

1. 원시(기본) 타입(Primitive Type) 은 실제 데이터를 가지는 타입이다.

 - 문자형

  - char : 1 byte

 - 정수형

  - byte : 1 byte

  - short : 2 byte

  - int : 4 byte

  - long : 8 byte

 - 실수형

  - float  : 4 byte

  - double  : 8 byte

 - 논리형

  - boolen : 1 byte 

 

2. 참조 타입(Reference Type) 은 참조를 위한 타입, 직접적으로 지정하는 것이 아닌 간접적(주소)으로 가리키는 타입이다.

    주소를 가리키기 때문에 크기는 4 byte 를 가진다.

- 배열

  - 크기 : 4 byte

  - 특징

    - 같은 타입만을 가짐

    - 순서를 가짐

- 열거

  - 크기 : 4 byte

  - 특징

    - 같은 타입만을 가짐

    - 순서를 가지지 않음

- 클래스

  - 크기 : 4 byte

  - 특징

    - 객체를 생성하는 객체

- 인터페이스

  - 크기 : 4 byte

  - 특징

    - 추상 메소드만을 가지고 있고 상속을 당할 시, 그 메소드 작성을 강제함

 

 

- 원시 타입과 참조 타입의 차이점

  1. 참조 타입은 객체이지만, 원시 타입은 객체가 아니다. ( 하지만 원시 타입의 Wrapper 클래스는 객체이다.)

  2. 참조 타입은 Heap 메모리에 할당되지만, 원시 타입은 Stack 메모리에 할당된다.

  3. 참조 타입은 시작 주소를 저장하지만, 원시 타입은 실제 값을 가진다.

 

 

- 제네릭( General ) 이란?

  1. 사전적인 의미로 '일반적인'이란 뜻을 가짐

  2. 프로그램에서 사용하는 의미로는 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 하는 것( 다형성 )

  => 일반적인 타입형식을 가지고 있다가 외부에서 타입을 받으면 그 타입에 대해 유연하게(해당 타입으로) 대처한다.

 

- 제네릭을 사용하는 이유?

 - 타입에 따라 여러 코드를 작성하여 사용할 필요 없이 1개의 코드 작성으로 여러 타입의 표현이 가능(다형성)

 - 타입을 미리 지정하여 제한하기 때문에 컴파일 시 컴파일러가 이를 검사하는 비용이 줄어듬

 

- 제네릭 사용 시 유의사항

 - 클래스

   - 제네릭 타입의 배열은 생성이 불가하다.(선언은 가능하지만, 생성이 불가 또한 Object[]에서 형변환하여 사용은 가능)

   - static 변수/메소드는 생성이 불가하다. (이유는 static은 전역변수로 선언한다는 것이므로 인스턴스 생성 전에 생성됨)

 - 메소드

   - 제네릭 클래스 내부에서도 정의가 가능하다 (제네릭 클래스의 타입과 제네릭 메소드의 타입은 별개로 인식된다.) 

 

- 제네릭 와일드카드

 - 사용하는 이유

   - 제네릭은 하나의 타입만 허용하기 때문에 관계가 전혀 없는 다른 타입을 허용할 수 없음

      => 이를 해결하기 위해 '?'를 사용하여 모든 타입에 대해 대비하도록 함(<?>)

 - 사용방법 종류

   - <?> : 모든 타입을 받을 수 있다.

   - <? extends T> : T와 그 하위 타입만을 받을 수 있다.(T를 상속한 하위 타입 + T)

   - <? super T> : T와 그 상위 타입만을 받을 수 있다.(T에게 상속당한 타입 + T)

'JAVA' 카테고리의 다른 글

[Spring] Security, JWT, Redis 이론 정리  (0) 2024.02.21