JAVA 공부중
System.out.println(str.charAt(0)+ str.charAt(str.length()-1));
// 134
// 158
// 131
알고리즘을 푸는 중 문자열.charAt(0)을 출력했을때는 무리없이 문자가 출력이 되었는데 문자열.charAt(0) + 문자열.charAt(문자열.length()-1)와 같은 값을 출력하려고 보니 아스키코드값으로반환이 되었다.
문자열.charAt의 경우 char형으로 반환이 되는데 그걸 더하면 아스키값이 된다고 한다.
나와야하는 값 앞에 빈 문자열을 추가해서 문자열끼리의 연산임을 표시해주니 원하던 대로 출력이 되었다.
System.out.println(""+ str.charAt(0)+ str.charAt(str.length()-1));
//AE
//OO
//AB
다형성을 이용하여 코드의 중복성을 제거하고 코드를 재사용할 수 있게되었으나 입력시 실수로 원하는 타입이 들어갈 수 있음. (타입 안전성 떨어짐)
=> 제네릭을 사용하면 코드 재사용과 타입 안전성을 잡을 수 있음.
제네릭 클래스 : <>(다이아몬드)를 이용한 클래스.
제네릭 클래스를 사용할 때는 타입을 미리 결정하지 않음.
클래스 오른쪽에 와 같이 선언하면 제네릭 클래스가 됨.
T는 타입 매개변수라고 함. 나중에 이게 다른 타입으로 변할 수 있음.
생성 시점에 원하는 타입 지정
public class GenericBox<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
package generic.ex1;
public class BoxMain3 {
public static void main(String[] args) {
GenericBox<Integer> integerBox = new GenericBox<Integer>();// 타입 직접 입력 -> 타입 추론으로 new 다음에 오는 Integer를 생략할 수 있다.
integerBox.set(10);
// integerBox.set("열"); // Integer타입만 허용
Integer integer = integerBox.get();
System.out.println("integer = " + integer);
GenericBox<String> stringBox = new GenericBox<>(); //타입 추론 : 생성하는 제네릭 타입 생략 가능
stringBox.set("hello");
// stringBox.set(111); // String타입만 허용
String str = stringBox.get();
System.out.println("str = " + str);
}
}
용어
제네릭 : 일반적인, 범용적인 일나느 뜻. 특정타입에 속한 것이 아닌 범용적으로 사용할 수 있다는 뜻
제네릭 타입: 틀래스나 인터페이스를 정의할 때 타입 매개변수를 사용하는 것. (제네릭 클래스, 제네릭 인터페이스 포함)
타입: 클래스, 인터페이스, 기본형을 모두 합쳐서 부르는 말
타입 매개변수 : 제네릭타입이나 메서드에서 사용되는 변수로 실제 타입으로 대체됨.
타입 인자: 제네릭 타입을 사용할 때 제공되는 실제 타임 (GenericBox 에서 Integer)
제네릭 관례
- E : Element
- K : Key
- N : Number
- T : Type
- V : Value
- S,U,V etc : 2nd, 3rd, 4tht types
GenericBox itegerBox = new GenericBox(); // 아래와 같지만 추후 문제가 생길 수 있음.
GenericBox<Object> itegerBox = new GenericBox<>(); //권장