4월 18일 내용정리
1.상속이란?? 부모로 부터 자식이 부모의 속성을 물려 받는 형태
부모는 가장 일반적인 속성을 표현하고 싶을때, 자식은 부모의 일반적인 속성을 가져다가 좀더 구체적인 속성을 가질수 있도록 하는것.
단,자바에서는 다중 상속을 허용하지 않는다.
예) class 자식클래스명 extends 부모클래스1,부모클래스2{ }
super():부모클래스의 생성자를 호출하는 것
안됨안됨!!
부모클래스=슈퍼클래스=기본클래스
자식클래스=서브클래스=파생클래스
class SuperClass{ //부모 클래스
필드
메서드
}
->
class subClass extends SuperClass{ //상속받은 자식클래스
필드
메서드
}
2.상속의 필요성
(1)코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 쉽다.
(2)코드의 재사용성을 높이고 코드의 중복을 제거 하기위함
class 자식클래스명 extends 부모클래스{ }
(3)super(매개값1, 매개값2...);
자식클래스의 생성자를 호출하면 먼저 부모클래스의 생성자가 실행된다.
자식클래스의 생성자가 가장 처음에 super(매개값1, 매개값2...); ->부모클래스 생성자 호출을 넣는다.
3.자식생성자를 초기화 할때
자식 클래스에서 하는게 아니라 거슬러 올라가
(1)부모의 생성자를 먼저 생성자 설정해주고
(2)자식클래스는 부모의 생성자를 호출함
super(부모생성자,부모생성자)를 부르고
(3)그다음 자식 생성자부분을 생성한다.
부모클래스 선언
package study_0418;
//package 는 폴더같은 개념으로 하나의 묶음
//패키지이름.하위폴더이름.클래스이름 ->이게 보통은 클래스이름 만드는 형식
public class Animal {
//부모클래스, 설계도
//필드 선언
String eye;
String mounth;
//생성자 선언
//생성자는 상속이 안됨
Animal(){};
Animal(String eye,String mounth){
this.eye=eye;
this.mounth=mounth;
};
//메서드 선언
void eat() {
System.out.println(this.mounth+"음식을 먹는다.");
}
void sleep() {
System.out.print(this.eye+"을 감고");
System.out.println("잠을잔다.");
}
}
자식 클래스_1
package study_0418;
public class Eagle{
//포함 관계
Animal ani =new Animal(); //부모클래스의 객체를 여기서 생성하면 포함관계가 됨.
//필드 선언
String wing;
//생성자 선언
//메서드 선언
void fly() {
System.out.println("난다");
}
}
자식 클래스_2
package study_0418;
public class Tiger extends Animal{
//필드 선언
String leg;
//생성자 선언
Tiger(){
super();//부모 생성자 호출
};
Tiger(String eye,String mounth,String leg){
super(eye,mounth); //부모 생성자 호출,부모 생성자는 부모클래스에서 수정
this.leg=leg;
};
//메서드 선언
void run() {
System.out.println("달린다.");
}
void showTigerInfo() {
System.out.println("호랑이는");
run(); //본인자식메서드 가져다쓰기
eat(); //부모메서드 가져다쓰기
sleep(); //부모메서드 가져다쓰기
}
}
실행 클래스
package study_0418;
public class AnimalTest {
public static void main(String[] args) {
Animal ani =new Animal();
Tiger tig=new Tiger();
Eagle eag=new Eagle();
ani.eat(); //부모클래스 메서드호출
ani.sleep();//부모클래스 메서드호출
tig.eat(); //부모클래스 상속받은 자식클래스 메서드호출
tig.sleep(); //부모클래스 상속받은 자식클래스 메서드호출
tig.run(); //자식클래스 메서드호출
Tiger tig01=new Tiger("매서운눈","호랑이입","다리는4개");
System.out.println(tig01.eye+","+tig01.mounth+","+tig01.leg);
tig01.showTigerInfo();
}
}
Eagle eag=new Eagle();
생성할때 아래와 같이 생성됨.
먼저 자식클래스 생성자에서 부모클래스의 멤버를 끌어다가 준비시키고 자식클래스의 멤버를 준비시킴
부모클래스의 멤버+자식클래스의 멤버=새로운 객체가 생성되고 주소값을 넘겨줌
4.is-a(예:원은 도형이다.) ->상속관계
has-a(예:자동차는 엔진을 가지고 있다.)->포함관계
상속이나 포함은 내가선택하여 효율적인것으로 선택하여 쓴다.
포함 관계일때는 아래와 같이 포함을 시키고자 하는 클래스에
포함하고픈 객체를 선언.
다시말해,부모클래스의 객체를 포함시키고자 하는 자식클래스안에 생성하면 포함관계가 됨.
상속은 받기 싫은데 부모클래스의 내용을 끌어다가 쓰고 싶을때 포함관계를 쓰기도 한다.
package study_0418;
public class Eagle{
//포함 관계
Animal ani =new Animal(); //부모클래스의 객체를 여기서 생성하면 포함관계가 됨.
5.오버라이딩
부모메서드를 상속을 받아서 자식에 맞춰서 자식메서드를 수정할수 있는데, 이거를 '오버라이딩' 이라고 하며, 자식이 우선권을 갖는다.즉 수정된 자식클래스기준으로 계산됨. 그전에 부모가 어떻게 선언 되었던간에 수정된자식클래스가 먼저!!
*조건은 부모하고 메서드의 선언부가 똑같아야 하고 안에 내용만 다르다.
부모 클래스
package study_0418;
public class Circle {
private void secret() {
System.out.println("비밀이다.");
}
protected void findRadius() {
System.out.println("반지름이 10.0센티이다.");
}
public void findArea() {
System.out.println("넓이는 (파이*반지름*반지름)이다.");
}
}
상속받은 자식클래스
package study_0418;
public class Ball extends Circle{
private String color;
public Ball(String color) {
this.color=color;
}
//super(매개값,매개값); //부모 생성자 호출
public void findColor() {
System.out.println(color+"공이다.");
findArea(); //오버라이딩된 자식의 메서드 호출
super.findArea();//부모 메서드를 호출
}
public void findVolume() {
System.out.println("부피는 4/3*(파이*반지름*반지름)이다.");
}
@Override //어노테이션 일종의 컴파일러에게 알려주는 알림기능 및 사용자에게 주석같은 알림기능
public void findArea() { //자식의 오버라이딩
System.out.println("넓이는 4*(파이*반지름*반지름)이다.");
}
}
실행클래스
package study_0418;
public class CircleTest {
public static void main(String[] args) {
Circle c1 =new Circle();
Ball c2 =new Ball("빨간색");
System.out.println("원:");
c1.findRadius();
c1.findArea();
System.out.println("\n공:");
c2.findRadius();
c2.findColor();
c2.findArea();
c2.findVolume();
}
}