[JAVA] # 09. 상속
<<<< 상속 >>>>> extends
+ 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것
+ 모든 클래스에 상속은 반드시 하나만 됨 (중복X)
+ 자손은 조상의 모든 멤버를 상속받음 (private, 생성자, 초기화블럭 제외) / 생성자는 별도로 필요
+ 자손의 멤버의 개수는 조상보다 같거나 많아야 한다.
+ 공통 부분은 조상에서 관리하고 개별부분은 자손이 관리
+ 조상의 변경은 자손에게 영향을 미치지만 반대는 아님
# 클래스의 관계
상속 관계 : ~은 ~이다. (is – a) 원은 도형이다. circle is a shape
포함 관계 : ~은 ~을 갖고 있다. (has – a) 원은 점을 가지고 있다. circle has a point / 상속이 안어울리는 관계
<<<<object >>>>
- 모든 클래스의 최고 조상
모든 클래스는 Object의 11개의 메서드를 상속 받음
<<<< 오버라이딩 >>>>
+ 조상클래스로부터 상속벋은 메서드의 내용을 상속받는 클래스에 맞게 재정의 하는 것
+++++메서드 이름, 매개변수 , 리턴타입이 같아야 한다. (정의된 내용만 다를 것)
오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩 :상속받은 메서드의 내용을 변경하는 것
<<<super>>>>>
상속받은 멤버와 자신의 멤버를 구별하는데 사용
# super() / 조상의 생성자
자손 클래스의 인스턴스를 생성하면 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성됨
자손의 생성자 첫 문장에서 조상의 생성자를 호출하여 조상의 멤버들을 초기화
Object클래스 제외 모든 클래스의 생성자 첫줄에는 조상의 생성자 혹은 같은 클래스의 다른 생성자(this())를 꼭 호출
호출이 없으면 자동으로 super() 삽입됨
<<<<배열>>>>>
배열에 대한 레퍼런스 변수 선언 > 배열 생성 – 배열의 저장공간 할당
int I [] = new int [10];
# 레퍼런스 치환과 배열 공유
int arr[] = new int [5];
int arrcpy[] = arr; //이러면 arr 랑 arrcpy랑 같은 배열을 참조 한다.같은 것을 가리킨다고 앞에서 생성자 그거 한거는 값이 똑같은 서로다른 객체가 두 개 있는거고 이건 배열 하나를 가리키는 변수가 2개 되는 거임
<<< 다차원 배열 >>>
+ 2차원 배열의 length
- I.length > 2차원 배열의 행의 개수
- I[0].length > 0변째 행에 있는 열의 개수
+ 비정방형 배열 : 행마다 열의 개수가 서로 다른 배열
int I [][]; //2차원 배열의 레퍼런스 변수 선언
i = new int [4][]; //4개의 행을 가진 레퍼런스 배열 생성
i[0] = new int [1]; //첫째 행에 1개 크기의 배열 생성
등등등등ㄷㅇ등
or int arr[][] = { {0}, {1,2}, {3,4,5} };
+ 메서드에서 배열을 리턴하면 배열에 대한 레퍼런스 (주소)값만 반환된다.
<<< 객체 배열 >>>
Circle [] c ; //Circle 배열에 대한 레퍼런스 변수 c선언
c = new Circle[5]; //레퍼런스 배열 생성
for (int i=0; i<5; i++) c[i] = new Circle(i); //배열에 각 원소 객체 생성
+ 배열의 원소 객체 접근 > c[i].getArea()
다형성 // 자바의 주요 특성 : 캡슐화(데이터 은닉), 상속(based 다형성), 다형성
<<<< 다형성 >>>>
+ 여러가지 능력을 가질 수 있는 능력
+ 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것
+ 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것
: 다형성은 같은 이름의 메서드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 말한다.
ᅟᅧᆼ러가지 형태를 가질 수 있는 능력 / 하나의 참조변수로 여러타입의 객체를 참조할 수 있는 것
/ 조상 타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것
<<< 멤버 접근 방식 / 클래스 형변환 >>>
자손은 조상의 변수보다 같거나(같은 종류의 ) 많은 변수를 가진다.
부모로 레퍼런스 변수 선언하고 자손으로 객체 생성하면 자손에만 있는 변수에는 접근을 못해요
1. 참조변수 형변환 : 서로 상속 관계에 있는 참조변수 간의 형변환
- 자손을 조상타입으로 형변환 (업캐스팅) : 생략 가능
Person p; Student s = new Student(); p = s;//(여기가 업캐스팅) 원래는 p=(Person)s;
이러면 p는 조상 타입이므로 s일 때 가졌던 자손만의 변수는 접근 할 수 없음
Person p = new Student(); //업캐스팅 예제
- 조상을 자손타입으로 형변환 (다운캐스팅) : 생략 불가
Student s = (Student)p; 이제 s를 통해서 Student객체 모두에 접근 가능하다.
2. instanceof
: 업캐스팅 시 레퍼런스가 가리키는 객체의 진짜 클래스 타입을 구분하기가 힘들다.
Person p = new Student(); //업캐스팅 예제 이때 p가 가리키는 객체의 클래스타입을 알기 힘듬
>> p instanceof Student >>> true 반환
+ 참조변수와 인스턴스 멤버간의 관계
- 부모클래스(참조변수 타입)의 모든멤버는 접근가능
- 멤버변수가 자식클래스에서 같은 이름으로 중복정의된 경우, 참조변수의 타입에 따라 연결되는 멤버변수가 달라짐 (참조변수의 타입에 영향 받음)
- 메서드가 오버라이딩 된 경우, 참조변수의 타입에 관계없이 항상 실제 인스턴스에서 정의된 메서드가 호출됨 (참조변수타입에 영향받지 않음)
# 매개변수의 다형성
void buy (Product p){
money -= p.price;
}
////////////////////////
Buyer b = new Buyer();
Tv tv = new Tv();
Cimputer c = new Computer();
b.buy(tv);
b,buy(c); //업캐스팅