Java는 단일 상속만(하나의 조상만을 상속)을 허용한다.(C++은 다중상속 허용)
Ex) class TvDVD extends Tv, DVD { // 에러. 조상은 하나만 허용된다. //....... }
- 조상이 2개가 되면, 각각의 조상에 같은 이름의 변수가 존재하면 충돌 가능성이 있다.
- 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
- Tv는 상속관계로 처리하고, DVD는 포함관계로 처리한다.
- 여기서 포함은, DVD가 가질 객체들을 작성하고 DVD안의 메서드를 호출해서 사용하게끔 만든 것이다.
부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
- Tv 클래스는 부모가 없고, SmartTv는 Tv가 부모 클래스다.
- 컴파일 하게 되면, Tv에 extends Object를 컴파일러가 자동으로 추가해준다.
**모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다. toString(), equals(Object obj), hashCode(),....- 상속계층도 : SmartTv -> Tv -> Object
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
Ex) class Point { int x; int y; String getLocation() { return "x :" + x + "y :" + y; } }
- Point는 2차원 좌표 / x와 y의 위치 값을 문자열로 표현
Ex2) class Point3D extends Point { int z; String getLocation() { // 오버라이딩 return "x :" + x + ", y :"+ y + ", z:" + z; } }
- Point3D는 3차원 좌표상의 점 / Point를 완전히 똑같이 가지고 오면 Point3D의 형식과 다르므로 오버라이딩을 통해 Point3D에 맞게 변경하였다. (선언 변경X, 내용만 변경)
- 오버라이딩 = 선언부 변경 불가 / 내용(구현부)만 변경 가능
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 선언부 = String getLocation / 선언부(반환타입, 메서드이름, 매개변수 목록) 다 일치해야 한다.
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 접근 제어자 = public / protected / default / private
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- throws ~~Exception이 예외 / 조상 클래스보다 많이 선언할 수 X
오버로딩(overloading) : 기존에 없는 (이름이 같은) 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
- 오버로딩은 상속과 관계 X / 오버라이딩은 상속과 관계O
- void parentMethod() {} = 오버라이딩
- void parentMethod(int i) {} = 오버로딩
- void childMethod() {} = 메서드 정의
- void childMethod(int i) {} = 오버로딩
- void childMethod() {} = 중복정의 // 에러 발생