부모 클래스의 필드와 메서드를 물려 받는다. 즉 자식 클래스에서는 상속 받은거 +@가 가능하므로 개발 시간을 절약할 수 있다.
단!! 부모클래스의 private는 상속 대상에서 제외 됨 default 또한 부모 클래스와 자식 클래스가 -> 다른 패키지에 존재할 경우 제외 됨
※상속의 장점
반복된 코드를 줄임
유지 보수 편리성 (클래스의 수정을 최소화 시킬 수 있다. -> 부모 클래스의 수정으로 모든 자식 클래스 들의 수정 효과를 가져오기 때문임)
객체 다형성 구현 가능
일대다 관계 가능
※접근 제어자 (접근 제한자)
- private : 같은 클래스 내에서만 접근이 가능하다. - default : 같은 패키지 내에서만 접근이 가능하다. (default는 생략 가능) - protected : 같은 패키지와 다른 패키지의 상속관계에서 접근이 가능하다. - public : 접근 제한이 없어 어디서든 접근이 가능하다.
※상속 방법
class <자식클래스 명> extends <부모 클래스 명> {
// 필드
// 생성자
// 메소드
}
cf. 주의!~! 중복 상속은 안 된다. extends <부모클래스 명1>, <부모클래스 명2>
package com.javastudy.ch05.inheritance;
public class Tv {
protected String name;
protected boolean power =true;
protected int channel;
public Tv(String name) {
this.name = name;
}
// TV 전원을 ON/OFF 하는 메서드
public void power() {
power = !power;
}
// TV 채널을 1씩 증가하는 메서드
public int channelUp() {
return ++channel;
}
// TV 채널을 1씩 감소하는 메서드
public int channelDown() {
return --channel;
}
}
package com.javastudy.ch05.inheritance;
/* 자바에서 다른 클래스를 상속 받기 위해서는 클래스 이름 뒤에 extends를 이용해
* 상속 받을 클래스를 명시하면 된다.
* 아래와 같이 Tv 클래스를 상속받게 되면
* Tv 클래스가 정의한 모든 속성(필드)과 모든 기능(메서드)을 상속받아
* 자기 자신의 것과 마찬가지로 자유롭게 사용할 수 있게 된다.
*
* 클래스 간의 관계는 크게 상속과 포함이라는 관계가 존재 한다.
* 상속 관계는-> 기존에 존재하는 것에 더하여 새로운 기능을 추가 할 경우에 적합하다고
* 할 수 있다.
* SmartTv는 기존의 Tv 기능을 포함하여 웹 서핑 기능과 현재 방송 중인 영화 정보 검색 기능을
* 추가로 구현해 SmartTv를 제작해야 한다면 상속 관계가 적절하다고 볼 수 있다.
* 두 클래스 간의 관계는 "~는 ~ 이다."로 풀 수 있다. (SmartTv는 Tv이다.)
*
*
* 두 클래스 간에 관계에서 본질적으로 동일한 속성과 기능을 갖지 않는 경우가 있을 경우에는
* 상속 관계 보다는 포함 관계를 유지하는 편이 더 효율적이라 할 수 있다.
* 이는 클래스 간에 연관성을 가질 수는 있지만
* 본질적으로 같은 속성과 기능을 갖지 않는다고 볼 수 있으며 이런 경우 클래스 간에
* "has ~ a" 관계로 풀어서 "~는 ~를 가지고 있다." 즉 포함 관계를 유지하는 것이 보다 효율적이다.
*
* 예를 들어 삼각형과 점의 관계를 살펴보면 "has ~ a" 관계로 풀 수 있다.
* "삼각형은 3개의 꼭지 점을 가지고 있다."라고 할 수 있으므로 두 클래스 간에는
* 상속 관계보다는 포함 관계를 맺는 것이 보다 효율적인 방법이라 할 수 있다.
**/
// SmartTv는 TV 이다. - TV를 상속 받아서 스마트 TV의 속성과 동작을 정의한 클래스
public class SmartTv extends Tv {
boolean isInternet;
// 상속 받은 power() 메서드를 자신에 맞게 재정의 하는 것을 메서드 오버라이딩이라고 함
@Override
public void power() {
power = !power;
if(power) {
isInternet = true;
}else {
isInternet=false;
}
}
public SmartTv() {
/* Object 클래스를 제외하고 자바의 모든 클래스의 생성자는 맨 첫 줄에
* 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다.
* super();를 안 적을 경우 보이지는 않지만 컴파일러에 의해 있음
**/
//super("기본생성자 TV");
this("기본 생성자 TV"); // 자신의 다른 생성자를 호출
}
public SmartTv(String name) {
super(name);
}
// 새로운 메서드를 추가
public void internet() {
if(isInternet) {
System.out.println("요청 사이트로 이동 중...");
} else {
System.out.println("인터넷 연결을 확인해주세요");
}
}
public void movieInfo() {
System.out.println("요청한 영화정보 검색 중...");
}
}
package com.javastudy.ch05.inheritance;
//클래스간 관계설정(상속관계) - 스마트 TV는 TV 이다
public class SmartTvTest {
public static void main(String[] args) {
SmartTv tv = new SmartTv("우리집 TV");
tv.power();
tv.channel = 11;
System.out.println("현재 채널 : " + tv.channelDown());
tv.internet();
System.out.println(tv.name);
System.out.println();
tv.power();
tv.channel = 12;
System.out.println("현재 채널 : " + tv.channelDown());
tv.internet();
System.out.println(tv.name);
}
}
★규칙!★ 부모 클래스에 기본 생성자가 없고 -> 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모생성자 호출을 위해서는 super(매개값, .....)를 명시적으로 호출 해야 함!! ★super(매개값, .....)는 반드시!! 자식 생성자의 첫 줄에 있어야 함!!★
package com.mytest;
public class People {
public String name;
public String ssn;
public People(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
package com.mytest;
public class Student extends People {
public int studentNo;
public Student(String name, String ssn, int studentNo) {
super(name, ssn); // 부모 생성자 호출!~ 없으면 에러남
// 왜냐하면 부모 클래스에 기본생성자가 없기 때문임!!!
this.studentNo = studentNo;
}
}
package com.mytest;
public class StudentExample {
public static void main(String[] args) {
Student st = new Student("홍길동", "12345-67890", 1);
// 부모에서 물려받은 필드사용하기
System.out.println("name : "+ st.name);
System.out.println("ssn : "+ st.ssn);
System.out.println("StudentNo : "+ st.studentNo);
}
}