jiseongkimu / java_test_1330

0 stars 0 forks source link

2020/09/25 new / generic #25

Open jiseongkimu opened 3 years ago

jiseongkimu commented 3 years ago

new

new 는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당한다. new 연산자를 통해 메모리(Heap)에 데이터를 저장할 공간을 할당받고, 그 공간의 참조값을 객체에게 반환해주고 이어서 생성자를 호출한다. 인스턴스를 핸들하기 위해서는 new 연산자를 통해 참조값을 저장한 객체로만 접근이 가능하다.

String a = new String("aaa");
String a new String("aaa");
클래스 객체 변수 메모리(Heap) 할당 클래스();
자료형 인스턴스 핸들 인스턴스 생성 / 참조값 리턴(-> 객체) 생성자 호출(객체 초기화)

객체 생성 과정

  1. new 연산자가 a 객체에 저장될 메모리 공간 할당

  2. 생성자가 a 객체를 초기화

  3. new 연산자가 새로 생성된 객체의 주소(reference) a 변수에 저장

  4. a를 통해 String에 접근 가능

Generic

클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법이다.

class Person<*T*>{
    public *T* info;
}
Person<*String*> p1 = new Person<*String*>();
Person<*StringBuilder*> p2 = new Person<*StringBuilder*>();

*로 표시한 것이 모두 제네릭을 사용한 것이다. 위의 코드를 간략하게 설명하자면 클래스를 정의할 때는 info의 데이터 타입을 확정하지 않고 인스턴스를 생성할 때 데이터 타입을 지정하는 기능이 제네릭이다.

제네릭을 사용해야 하는 이유

제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있다. 실행 시 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지하는 것이 좋다. 또한 타입을 국한하기 때문에 요소를 찾아올 때 타입 변환을 할 필요가 없어 프로그램 성능이 향상되는 효과를 얻을 수 있다.

ArrayList list = new ArrayList(); //제네릭을 사용하지 않을경우
list.add("test");
String temp = (String) list.get(0); //타입변환이 필요함

ArrayList<String> list2 = new ArrayList(); //제네릭을 사용할 경우
list2.add("test");
temp = list2.get(0); //타입변환이 필요없음

자주 사용하는 ArrayList 에도 적용할 수 있다.

ArrayList list = new ArrayList();//타입 미설정 Object로 선언된다.
ArrayList<Student> members = new ArrayList<Student>();//타입설정 Student객체만 사용가능
ArrayList<Integer> num = new ArrayList<Integer>();//타입설정 int타입만 사용가능
ArrayList<Integer> num2 = new ArrayList<>();//new에서 타입 파라미터 생략가능
ArrayList<Integer> num3 = new ArrayList<Integer>(10);//초기 용량(capacity)지정
ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1,2,3));//생성시 값추가

ArrayList 선언시 1L 처럼 선언 후 내부에 임의의 값을 넣고 사용할 수도 있지만, 값을 뽑아내기 위해서 Casting 연산이 필요하고, 잘못된 타입으로 캐스팅하면 에러가 발생할 수 있다. 그래서 위 처럼 타입을 명시해주는 것이 좋다. JDK 5.0 이후부터 자료형의 안정성을 위해 제네릭이 도입되었다.

만약 ArrayLIst list = new ArrayList(); 이라고 선언한다면 String 객체들만 add할 수 있고, 다른 타입의 객체는 사용이 불가능하다.