자바에서 상속을 정의할 때 extends라는 키워드를 사용한다.
extend는 확장하다라는 의미로 부모에게 물려받는 것 외에 추가로 확장할 수 있다라고 이해하면 된다.
class 자식클래스 extends 부모클래스{ ... }
상속의 특징
- 단일 상속만 가능 - 자식 클래스는 하나의 부모 클래스에서만 상속 받을 수 있다.
- 자식 클래스를 객체로 생성할 때 , 부모 클래스가 먼저 객체화 된다.
- 모든 클래스는 Object 클래스로 부터 시작하는 상속관계 하위 객체이다. (모든 클래스의 가장 상위 클래스는 Object 클래스이다.)
상속 예제
Phone.java
public class Phone {
String name;
String color;
String company;
void call() {
System.out.println("전화를 건다.");
}
void receive() {
System.out.println("전화를 받다.");
}
}
SmartPhone.java
public class SmartPhone extends Phone {
public void installApp() {
System.out.println("앱 설치");
}
}
SmartPhoneMain.java
public class SmartPhoneMain {
public static void main(String[] args) {
Phone p = new Phone();
p.name = "전화기";
p.company = "현대";
p.color = "화이트";
System.out.println("Phone 출력");
System.out.println(p.name);
System.out.println(p.company);
System.out.println(p.color);
p.call();
p.receive();
SmartPhone sp = new SmartPhone();
sp.name = "갤럭시";
sp.company = "삼성";
sp.color = "블랙";
System.out.println("SmartPhone 출력");
System.out.println(sp.name);
System.out.println(sp.company);
System.out.println(sp.color);
sp.call();
sp.receive();
sp.installApp();
}
}
// Phone 출력
// 전화기
// 현대
// 화이트
// 전화를 건다.
// 전화를 받다.
// SmartPhone 출력
// 갤럭시
// 삼성
// 블랙
// 전화를 건다.
// 전화를 받다.
// 앱 설치
super
super 는 자식 객체에서 부모 객체를 가리키는 참조변수이다.
public class SuperEx {
public static void main(String[] args) {
Child child = new Child();
child.print();
}
}
class Parent{
int number = 3;
Parent(){
System.out.println("부모 객체 생성");
}
}
class Child extends Parent{
int number = 2;
Child(){
System.out.println("자식 객체 생성");
}
void print(){
int number = 1;
System.out.println(number);
System.out.println(this.number);
System.out.println(super.number);
}
}
// 부모 객체 생성
// 자식 객체 생성
// 1
// 2
// 3
부모 -> 자식 순서로 객체가 생성되는 것을 확인할 수 있다.
매서드의 지역 변수 number
자신 객체의 number
부모 객체의 number
순서로 1,2,3이 print된 것을 확인할 수 있다.
public class SuperEx {
public static void main(String[] args) {
Child child = new Child();
child.print();
}
}
class Parent{
int number = 3;
Parent(){
System.out.println("부모 객체 생성");
}
}
class Child extends Parent{
// int number = 2;
Child(){
System.out.println("자식 객체 생성");
}
void print(){
int number = 1;
System.out.println(number);
System.out.println(this.number);
System.out.println(super.number);
}
}
// 부모 객체 생성
// 자식 객체 생성
// 1
// 3
// 3
자식 객체에서 number가 존재하지 않는 경우를 확인할 수 있다.
이때 자식 객체는 부모 객체에 존재하는 number를 상속받고 있기 때문에 this.number 결과는 부모 객체의 number와 동일한 3을 print 하는 것을 확인할 수 있다.
public class SuperEx2 {
}
class Parent2{
String name;
Parent2(String name){
this.name = name;
}
}
class Child2 extends Parent2{
Child2(){
super("child");
}
}
부모 클래스인 parent2를 살펴보면 매개변수 생성자만 존재하고 기본생성자는 없는 상태이다. 이런경우에 child2가 parent2를 상속받게 되면 기본적으로 에러가 발생한다.
이 에러를 해결하기 위해서는 위와 같이 child2 생성자에서 super를 이용하여 부모 클래스의 매개변수 생성자를 반드시 실행해주어야 한다.
'공부방 > JAVA' 카테고리의 다른 글
mysql (0) | 2022.07.07 |
---|---|
Map, Hash table (0) | 2022.06.19 |
일급 컬렉션 (0) | 2021.08.15 |
예외처리 (0) | 2021.07.14 |
[JAVA] enum 이란? (0) | 2021.07.14 |