[1]배열의 타입이 다르면 ArryList 코드도 변경해서 계속 만들어야한다.
[2]만약 배열의 타입이 같다면? 코드변경을 최소화 할 수 있다.
?
[3]여러타입의 객체 주소를 받을 수 있는 배열은?
1)Object[] 의 배열을 선언하면된다. : Object 레퍼런스로 모든 타입의 객체 주소를 담을 수 있다.
2)형변환 필요
충전기 콘센트에 맞게 끼우듯이 자바의 객체를 생성할때도 타입이 맞아야한다.
아날로그방식을 디지털로 받으면 화질이 손실
HDMI - 음성과 영상 모두
dvi는 영상만 들어가므로, 음성은 따로 연결필요
**Contact 객체의 주소를 담기 위해서 Contact 레퍼런스가 있어야함.
객체의 타입에 상관없이 객체의 주소를 받아야할 경우가 있음 => Object 타입
Object obj = new Object();
Object obj = new Contact();
Object obj = new Todo();

-프로파일러에게 자세히보여달라고 함.
자바의 최상위 클래스 Object ( 따로지정하지않아도 모든 객체의 슈퍼클래스)
하위분류로 상위분류를 못가르킨다.
다형적 변수는 하위타입의 객체를 가리킬수 있는 주소를 저장할 수 있다.
상위타입은 하위타입의 객체를 가리킬 수 있다.
super Type - subtype = parent -child
계층도를 알아야한다.
삭제 - 배열을 당기는 개념을 알고 있느냐 - 손코딩해봐라.
// 기능:
// - 배열에서 지정한 항목을 삭제한다.
//
static Object remove(int index) { //리턴타입 하위클래스타입의 객체의 주소를 받을 수 있음 뭘줄지아직몰라
Object old = list[index];
for (int i = index + 1; i < size; i++) {
list[i - 1] = list[i]; // 배열을 당기는 개념
}
size--;
return old;
}
알고리즘 테스트 ( 손코딩으로 시험봄) - 프로그램 못짜면 퇴소처리
우리 스스로 짤 수 있어야함. 10 줄이내 링크드리스트나 배열 - 자기네도 채점하기 어려우므로
배열과 객체 주소를 잘다루는가..
머신러닝 딥러닝 - 행렬
자바( 1차원배열, 2차원배열로 표현)
ArrayList를 사용하는 건 ContactConroller
Arraylist 에서 indexof()는 todo에서는 쓸수없게 특화되어있음, 그래서 ContactController로 뺸다.
indexof() : 이메일을 가지고 배열의 항목을 찾는다.
즉 indexof() 메서드는 모든 타입에 대해 사용할 수 없고 Contact를 다룰 때만 사용 가능 .
그래서 그 역할을 수행하는 클래스로 옮긴것이다.
ArrayList에서
구) contact 특정 타입의 배열을 다뤘으나
뉴) 지금은 Object : 모든타입의 배열을 다룬다. ( 다양한타입을 다루도록 역할이 변경된 것.)
ArrayList는 Contact뿐만 아니라 다양한 타입의 목록을 다루도록 변경했기 때문에
indexOf()를 다른 클래스로 옮긴 것이다.
바뀐 역할에 따라 메서드가 바뀐다. 클래스의 역할이 바뀌면 메서드를 쪼개거나 바꾸는것이 객체지향프로그래밍.
클래스가 바뀌면 클래스에 따라 바꾸어야한다. 메서드 쪼개기도하고 통합시키기도 하고
컴파일러가 문법만 검사하므로 Object에 들어있는 주소가 contact라고 가정하고 담을 수없으므로
명시적으로 컴파일러(문법검사)에게 보여줘야함.
찾아가는건 자바버츄얼머신의 역할ㄴ
static int indexOf(String email) {
for (int i = 0; i < ArrayList.size; i++) {
Contact contact = (Contact) ArrayList.list[i]; // 형변환 ,
if (contact.email.equals(email)) {
return i;
}
}
return -1;
}

컴파일러는 문법만 따지므로
배열 안에 어떤 타입의 주소가 들어있는 건 중요하지않음.
그 배열자체의 타입의 중요
레퍼런스는 항상 같은타입이나 하위타입만을 가리킬 수 있음
안에 들어간것 따지기 전에 그 자체가 무슨타입이냐를 따짐
메모리자체가 무슨타입인지
형변환은 컴파일러에게 우기는것. 문법상 맞다고
나중에 자바버츄얼머신이 실행해보고 운을 띄울껀데 뭐 하고 넘겨줌


쓸데없이 임시변수 안만든다.
한번쓰고 안쓰는 변수를 만들어
호출될때마다 메모리형성하게 만드는건 메모리낭비이므로

다형적변수를 사용하면 예전보다 편해짐

동물객체나 그 하위객체의 주소를 저장할 수 있다.
동물 obj;
obj = *:동물객체 도는 그 하위분류의 객체의 주소를 저장할 수 있다.
B클래스의 obj
B obj = ? b객체 주소 또는 그 하위타입 객체의 주소를 저장할 수 있다라는 의미.
void m1(A obj){...}
m1(new A());
m1(new B());
파라미터 값으로 A의객체 뿐만 아니라 A의 하위타입객체의 주소도 담을 수 있다.
레퍼런스가 있으면 그 레퍼런스의 타입을 체크해서 그 안에 무얼 담을 수 있는지 볼것.
뉘앙스는 다다르지만 실무에서는 연관으로 다 처리 한다.
UML, 실전에서는 이것만 쓴다

게시판만들기 과제 -> 인스턴스변수와 인스턴스메소드