서비스 관점으로 코드를 설계? 프로그램의 핵심 기능, 요구사항에 집중하여 가독성, 유지보수, 재사용성 등을 고려하여 설계하는 것이다.
제네릭을 다양하게 사용? 추후 JASON을 통한 데이터 교환 시 용이하게 사용된다.
제네릭에 원시형 타입은 오지 못 함 (Elements (=Object가 들어가기 때문)
public class AMain {
//왜 <int>는 못오나? 원시형타입은 제네릭에 오지 못 하니 int의 wrapper 클래스 integer가 옴
List<Integer> nums = new ArrayList<>();
public static void main(String[] args) {
}
메소드
생성자(메소드 오버로딩 가능, 호출하는 생성자에 따라 값이 다름)
class B{
//왜 <int>는 못오나? 원시형타입은 제네릭에 오지 못 하니 int의 wrapper 클래스 integer가 옴
/*선언부 - 생성자가 호출할 때 생성됨 */
List<Integer> nums = new ArrayList<>();
int ival;
String s = null;
String s1 = new String();
/*생성자 메소드 오버로딩 - 파라미터 타입이나 갯수가 다르다. */
public B() {
}
public B(int ival) {
s = new String("나초보");
}
}
/*메인메소드*/
public class BMain {
public static void main(String[] args) {
System.out.println("main 호출"); //A클래스의 전변은 읽혀졌을까? -> A클래스를 인스턴스화(선언)해야 사용 가능
B b = new B();
try {
System.out.println(b.s.length()); //null에러
} catch (Exception e) {
System.out.println("NullPointerException 발생, 디폴트 생성자에서 s값을 초기화해주지 않아서 값이 없음 ");
}
b = new B(1);
System.out.println(b.s.length()); //3
}
}
제네릭<>을 사용한다는 건 주소 번지를 두 번 접근해야 값에 도달한다. 제네릭은 직관적 사용을 위해 반드시 정한다.
type parameter(개발자 자유도 높이기 위해 제네릭 값 변천)
제네릭 자료형 매개변수 T : 이 클래스를 사용되는 시점에서 실제 사용할 자료형이 결정된다. (컴파일 타임에 JVM이 바꿔치기를 해준다.
단, Static 변수는 사용 불가능함 - 약속 - 컨벤션
public class GenericMaterial<T> {
/*선언부*/
private T material;
/*정의메소드*/
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
}
UI 솔루션을 사용하여 자바 연동시 인터페이스 되는 부분을 toString() 재정의(오버라이딩)하여 사용할 수 있음.
public class Plastic extends Object{
@Override
public String toString() {
return "나는 플라스틱입니다.";
}
}
public class MaterialTest {
public static void main(String[] args) {
Plastic p = new Plastic();
//(오버라이딩 전)원래는 주소번지를 출력하던 toStirn()메소드
//플라스틱 클래스에서 메소드 오버라이딩으로 재정의되어서 그곳에서 정해진 출력값이 나오는 메소드가 됨.
//UI 솔루션을 사용하여 자바 연동시 인터페이스 되는 부분을 toString()재정의하여 사용할 수 있음.
System.out.println(p);
System.out.println(p.toString()); //정해진 값 "나는 플라스특입니다."로 출력
MaterialTest mt = new MaterialTest();
System.out.println(mt); //주소번지로 출력
}
}