참고 도서
Do it 자바 완전정복
클래스의 상속은 무보 클래스의 멤버(필드, 메서드, 이너 클래스)를 내려받아 자식 클래스 내부에 포함시키는 자바의 문법 요소다.
클래스를 상속할 때는 extends 키워드를 사용한다
class 자식클래스 extends 부모클래스{
}
자바의 클래스는 다중 상속이 불가능하다
다중 상속을 허용하면 모호성이 발생하기 때문에 다중 상속을 허용하지 않는다.
생성자는 자식 클래스로 상속 되지 않는다. 좀 더 말하면 절대 상속돼서는 안 된다. 그 이유는
class A{
A(){
}
}
class B extends A{
A() {} // 생성자? 메서드?
}
클래스 내부에는 필드, 메서드, 생성자, 이너 클래스 이외에는 아무것도 올 수 없다
클래스 B 속에 있는 A() {}는 무엇일까?
소괄호와 중괄호가 있으므로 필드와 이너클래스는 아니고
생성자라고 보기에는 클래스B와 이름이 달라 될 수 없고
남은 것은 메서드인데 리턴 타입이 없어 메서드도 될 수 없다
이것이 바로 생성자가 상속되지 않는 이유다.
자바 프로그램은 등호(=)를 중심으로 항상 왼쪽과 오른쪽의 자료형이 일치해야 한다
만약 서로 다르다면 컴파일러가 자동으로 타입을 변환해 주거나 개발자가 직접 명시적으로
타입을 변환해 줘야 한다. 객체에서도 이러한 타입 변환이 일어난다.
이를 각각 업캐스팅, 다운캐스팅 이라 한다
기본 자료형
업캐스팅 : 범위가 좁은 쪽에서 넓은 쪽으로
다운캐스팅 : 범위가 넓은 쪽에서 좁은 쪽으로
객체
업캐스팅 : 자식 클래스에서 부모 클래스 쪽으로 변환
다운캐스팅 : 부모 클래스에서 자식 클래스 쪽으로 변환
캐스팅 가능 여부를 불리언 타입으로 확인할 수 있는 문법 요소를 제공하고 있는데
이것이 바로 instanceof이다.
참조 변수 instanceof 타입
참조 변수가 해당 타입으로 캐스팅할 수 있을때 true, 그러지 않을 때 false를 리턴한다.
A
↑
B
↑
C
C c = new C();
System.out.println(c instanceof A); // true
System.out.println(c instanceof B); // true
부모 클래스에게 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것으로
부모의 메서드를 자신이 만든 메서드로 덮어쓰는 개념이다.
오버라이딩이 수행되기 위해서는 2가지 조건을 만족해야 한다.
Class A{
void save(){
System.out.println("a클래스 save메서드");
}
}
Class B{
void save(){
System.out.println("b클래스 save메서드");
}
}
super는 부모의 객체, super()는 부모의 생성자를 의미한다, 상속관계에서만 사용할 수 있다.
super키워드는 부모의 객체를 가리키는 것으로, 필드명의 중복 또는 메서드 오버라이딩으로 가려진
부모의 필드 또는 메서드를 호출하기 위해 사용한다.
Class A{
void abc(){
System.out.println("a클래스의 abc()");
}
}
Class B extends A{
void abc(){
System.out.println("b클래스의 abc()");
}
void bcd(){
super.abc(); // 부모 클래스(a) 객체의 abc() 메서드 호출
// abc() // this.abc();
}
}
public class test{
public static void main(String[] args){
B b = new B();
b.bcd(); // a 클래스의 abc()
}
}
자바의 모든 클래스는 Object 클래스를 상속 받는다
컴파일러는 아무런 클래스로 상속하지 않으면 자동으로 extends를 삽입해 Object클래스를 상속한다.
toString() 메서드는 객체 정보를 문자열로 리턴하는 메서드다.
객체 정보는 '패키지명.클래스명@해시코드'로 나타난다.
해시코드는 객체가 저장된 위치와 관련된 값이다
equals는 입력매게변수로 넘어온 객체와 자기 객체의 스택 메모리 변숫값을 비교해 그 결과를
true 또는 false로 리턴하는 메서드다. 기본 자료형이 아닌 객체의 스택 메모리 값을 비교하므로
실제 데이터 값이 아닌 실제 데이터의 위치(번지)를 비교하는 것이다.
hashCode() 메서드는 객체의 위치와 관련된 값으로, 실제 위치를 나타내는 값은 아니다.