Class 간의 상속
package day10;
public class FruitMain {
FruitMain이라는 메인클래스가 있을때
class Fruit{
String name;
boolean isSeed;
public void removeSeed() {
isSeed = false;
}
}
class Fruit2 extends Fruit{ // == Fruit2가 Fruit 클래스를 상속받겠다
//String name;
//boolean isSeed; Fruit와 Fruit2는 다른 클래스지만 extends를 사용하여 메소드,변수를 같이 공유된다
String color;
public void removeSeed() {
isSeed = false;
}
public void colorChange(String color) {
this.color= color;
}
}
메인클래스 하위로 클래스들을 작성할 수가 있다.
하지만 Fruit 클래스의 필드 String name 이나 boolean isSeed 나 removeSeed 메소드를 다른 클래스에서
사용할 수가 없는데 이것을 가능하게 해주는 것이 상속 이다.
본문 class Fruit2가 Fruit 클래스를 상속받고싶어서 extends를 사용했다.
Fruit2 클래스의 필드 String color를 사용하면서 Fruit클래스의 removeSeed 메소드를 사용한 것을 볼 수 있다.
package day10;
public class TvMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tv2 tv2 = new Tv2();
tv2.power = true;
tv2.channel = 10;
tv2.volum = 20;
tv2.power();
tv2.channelUp();
tv2.channelUp();
tv2.volumDown();
tv2.volumDown();
System.out.println(tv2.power+" / "+tv2.channel+" / "+tv2.volum);
Tv tv = new Tv();
tv.power = false;
tv.channel = 10; // Tv 클래스는 Tv2 요소들을 사용할 수 없다.
// tv.volum = 9; 에러가 난다.
// 상속은 두군데에서 받을 수 없음.
}
}
TvMain 이라는 메인클래스에서 하위로 Tv , Tv2 클래스를 만들었다.
class Tv{
boolean power;
int channel;
public void power() {
this.power = !power;
}
public void channelUp() {
this.channel++;
}
public void channelDown() {
this.channel--;
}
}
class Tv2 extends Tv{ // tv2클래스들은 tv클래스 메소드를 사용할 수 있다.
int volum;
public void volumup() {
volum++;
}
public void volumDown() {
volum--;
}
}
여기서 Tv2는 Tv를 extends(상속)받았기 때문에 Tv에 있는 필드, 메소드를 사용가능하다.
volumup , volumDown 메소드는 Tv에 있지만 Tv2에서 사용가능한것을 확인할 수 있다.
다만 , 상속은 두군데 에서는 받을 수 없다.
class Person{
String name;
int age;
boolean isFull; // 배가 부른지 안 부른지
public Person() {
System.out.println("Person기본생성자");
}
public Person(String name) {
this.name = name;
System.out.println("Person기본생성자1");
}
public Person(String name,int age) {
this(name); // public Person(String name) 생성자 호출
this.age = age;
System.out.println("Person기본생성자2");
}
public Person(String name,int age,boolean isFull) {
this(name,age); // public Person(String name,int age) 생성자 호출
this.isFull = isFull;
System.out.println("Person기본생성자3");
}
}
Class Person이라는 클래스를 만들었는데,
Person() : 매개변수 X , 출력(Person기본생성자)
Person(String name) : 매개변수를 name만 받는것. 출력(Person기본생성자1)
Person(String name,int age) : 매개변수를 name,age만 받는것. 출력(Person기본생성자2)
Person(String name,int age,boolean isFull) : 매개변수를 name,age,isFull 을 받는것. 출력(Person기본생성자3)
으로 만들어 보았다.
다만 Person기본생성자3에 this(name,age)로 묶어놓았는데 이러면
Person(String name,int age) : 매개변수를 name,age만 받는것. 출력(Person기본생성자2) 생성자를 호출하게 된다.
Person기본생성자2에도 this(name)이 있으니
Person(String name) : 매개변수를 name만 받는것. 출력(Person기본생성자1) 생성자를 호출하게 된다.
class Student extends Person{
String sno;
public Student() {
//super(); 모든 생성자에는 부모의 기본생성자가 숨겨져있다. 무조건 자식생성자의 첫줄에는 부모의 기본생성자가 있어야 한다
System.out.println("Student기본생성자");
}
// this와 super의 차이 this는 자기자신, super는 부모
public Student(String name,int age) {
System.out.println("Student기본생성자1");
}
public Student(String name,int age, boolean isFull,String sno) {
super(name,age,isFull); // super == 자기의 부모
this.sno = sno;
System.out.println("Student기본생성자2");
}
Class Student에 Person 을 상속받게 해놓았다.
기본적으로 생성자에는 맨위 줄에 super()문구가 숨겨져있는데 , 이것이 없으면 에러가 나게 된다.
super()란 Person의 생성자를 가져온다는 뜻이다.
this 와 super의 차이가 있다
this = 자기자신의 필드 , super는 부모의 필드라고 생각하면 된다.
Public Student(Sting name,int age, boolean isFull,String sno){
의 생성자에서 , Super(name , int age , boolean isFull , String sno) 는 부모의 생성자를 끌어쓰게되고
this.sno는 Student의 필드 sno를 받게 된다.
부모 생성자 호출
자색 객체를 생성하면 부모객체가 먼저 생성되고 자식 객체가 생성된다.
부모 생성자는 자식 생성자 맨 첫줄에서 호출되어야 한다.
부모 생성자는 super(매개값, ... ) 으로 호출할 수 있다.
/super는 부모를 의미한다.
오버라이딩에 대한 이해
class Car{
String color;
String tire;
int speed;
public void run() {
this.speed++;
System.out.println("Car Run 메소드");
}
public void run2() {
this.speed += 4;
System.out.println("Car Run2 메소드");
}
}
Class Car의 필드에 Color , tire , Speed 값을 받도록 했고 ,
Run 메소드에는 실행하면 스피드를 1씩 올리는 메소드 ,
Run2 메소드는 실행하면 스피드를 4씩 올리는 메소드를 만들었다.
class SportCar extends Car{
String engine;
public void run() {
this.speed+= 2;
System.out.println("Sport"
+ "Car Run 메소드");
}
public void run1() {
this.speed+= 4;
System.out.println("Sport Car Run1 메소드");
}
}
Class Car를 상속받는 Class car를 만들었고 , 이 클래스 안에는 필드 engine을 받도록 했고 ,
실행하면 스피드를 2씩올리는 메소드,
실행하면 스피드를 4씩 올리는 메소드를 만들었다.
하지만 같은 메소드 이름을 쓸수 없는데 , 사용한 것을 볼 수 있다.
이같은 것을 오버라이딩 이라고 정의한다.
! 오버라이딩 자식개체에서 부모개체 메소드를 재정의하는것을 오버라이딩이라고 한다.
! 오버라이딩하려면 선언부가 같아야한다.(안에 있는 실행문구만 달라질 수 있다.)
! 메소드명이 다르면 오버라이딩이 아닌 다른 메소드
package day10;
public class CarMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
SportCar scar = new SportCar();
scar.run();
System.out.println(scar.speed);
}
}
메인 클래스를 실행시키면 scar.speed 값은 2가 나오게 된다.
상속 , 오버라이딩 사용 예
class Animal {
public void eat() {
System.out.println("동물이 먹다");
}
public void cry() {
System.out.println("동물이 운다");
}
}
class Dog extends Animal {
public void cry() {
System.out.println("멍멍"); // 오버라이딩
}
public void drink() {
System.out.println("강아지가 마신다");
}
}
class Cat extends Animal {
public void cry() {
System.out.println("야옹"); // 오버라이딩
}
public void drink() {
System.out.println("고양이가 마신다");
}
}
Class Animal을 만들고 각각 dog클래스,cat클래스를 extends로 상속시켰다.
Class Animal에 있는 cry 메소드를 각 하위 클래스에서 오버라이드하여 출력을 따로 만들었다.
'Java > Java icia 10일차' 카테고리의 다른 글
상속 , 오버라이드 , 클래스를 이용하여 학교시스템 만들기 (0) | 2023.03.07 |
---|---|
오버라이딩 , 상속을 이용한 예제 (0) | 2023.03.07 |
오버라이딩 , 상속 , 추상화 (0) | 2023.03.07 |