클래스 선언
package Animal;
public class Animal {
public void eat() {
System.out.println("동물은 음식을 먹습니다.");
}
public void sleep() {
System.out.println("동물은 잠을 잔다.");
}
}
토끼에게 상속
package Animal;
public class Rabbit extends Animal {
public void run() {
System.out.println("앵보 토끼가 깡총거립니다.");
}
public void eat() {
System.out.println("앵보 토끼가 양상추를 먹고 있습니다.");
}
public void sleep() {
System.out.println("앵보 토끼가 낮잠을 자고 있습니다.");
}
}
호랑이에게 상속
package Animal;
public class Tiger extends Animal {
public void hunt() {
System.out.println("앵보 호랑이가 사슴을 사냥합니다.");
}
public void eat() {
System.out.println("앵보 호랑이가 고기를 먹고 있습니다.");
}
public void sleep() {
System.out.println("앵보 호랑이가 낮잠을 자고 있습니다.");
}
}
객체 생성
package Animal;
public class AnimalExam {
public static void main(String[] args) {
Rabbit mycat = new Rabbit();
mycat.run();
mycat.eat();
mycat.sleep();
Tiger mytiger = new Tiger();
mytiger.hunt();
mytiger.eat();
mytiger.sleep();
}
}
앵보 토끼가 양상추를 먹고 있습니다.
앵보 토끼가 낮잠을 자고 있습니다.
앵보 호랑이가 사슴을 사냥합니다.
앵보 호랑이가 고기를 먹고 있습니다.
앵보 호랑이가 낮잠을 자고 있습니다.
클래스 선언
package Animal;
public abstract class Animal {
public abstract void sing();
public abstract void eat();
public void run() {
System.out.println("동물이 달립니다.");
}
}
토끼에게 상속
package Animal;
public class Rabbit extends Animal {
@Override
public void sing() {
System.out.println("앵보 토끼가 주인에게 앙탈을 부리고 있습니다.");
}
@Override
public void eat() {
System.out.println("앵보 토끼가 들판에서 풀을 먹고 있습니다.");
}
public void run() {
System.out.println("앵보 토끼가 들판에서 뛰어다니고 있습니다.");
}
}
사자에게 상속
package Animal;
public class Lion extends Animal {
@Override
public void sing() {
System.out.println("앵보 사자가 곰에게 으르렁거립니다.");
}
@Override
public void eat() {
System.out.println("앵보 사자가 물소고기를 먹고 있습니다.");
}
public void run() {
System.out.println("앵보 사자가 들판을 뛰어다니고 있습니다.");
}
}
객체 생성
package Animal;
public class AnimalExam {
public static void main(String[] args) {
Rabbit rabbit = new Rabbit();
rabbit.sing();
rabbit.eat();
rabbit.run();
Lion lion = new Lion();
lion.sing();
lion.eat();
lion.run();
}
}
앵보 토끼가 들판에서 풀을 먹고 있습니다.
앵보 토끼가 들판에서 뛰어다니고 있습니다.
앵보 사자가 곰에게 으르렁거립니다.
앵보 사자가 물소고기를 먹고 있습니다.
앵보 사자가 들판을 뛰어다니고 있습니다.
클래스 선언
package Food;
public class food {
String size;
String name;
int price;
public food(String name, int price) {
this.name = name;
this.price = price;
}
public void run() {
System.out.println(name + price);
}
}
피자에게 상속
package Food;
public class Pizza extends food {
String size;
public Pizza(String name, int price, String x) {
super(name, price);
this.size = x;
}
public void info() {
System.out.println("피자종류 : " + name);
System.out.println("피자가격 : " + price);
System.out.println("피자크기 : " + size);
}
}
객체 생성
ackage Food;
public class PizzaExam {
public static void main(String[] args) {
Pizza pizza = new Pizza("고구마피자", 20000, "large");
pizza.info();
}
}
피자종류 : 고구마피자
피자가격 : 20000
피자크기 : large
클래스 선언
package Plane;
public class Plane {
String type;
String color;
public Plane(String type, String color) {
this.type = type;
this.color = color;
}
public void run() {
System.out.println(type + color);
}
}
전투기에게 상속
package Plane;
public class FighterPlane extends Plane {
int speed;
int quantity;
public FighterPlane(String type, String color, int speed, int quantity) {
super(type, color);
this.speed = speed;
this.quantity = quantity;
}
public void info() {
System.out.println("비행기의 기종 : " + type);
System.out.println("배행기의 색상 : " + color);
System.out.println("비행기의 속도 : " + speed + "마하");
System.out.println("비행기의 미사일적재량 : " + quantity + "톤");
}
}
객체 생성
package Plane;
public class FighterPlaneExam {
public static void main(String[] args) {
FighterPlane plane = new FighterPlane("앵보비행기", "파랑색", 2, 500);
plane.info();
}
}
비행기의 기종 : 앵보비행기
배행기의 색상 : 파랑색
비행기의 속도 : 2마하
비행기의 미사일적재량 : 500톤
클레스 선언
package Pear;
class Pear {
String name;
public Pear(String name) {
this.name = name;
}
public void Pear() {
System.out.println("THE" + name + "is growing.");
}
}
딸기에게 상속
package Pear;
public class Strawberry extends Pear {
Strawberry(String name) {
super(name);
}
@Override
public void pear() {
System.out.println("THE" + name + "strawberry is growing.");
}
public void strawberry() {
System.out.println(name + "strawberries have a sweet taste");
}
}
사과에게 상속
package Pear;
public class Apple extends Pear {
Apple(String name) {
super(name);
}
@Override
public void Pear() {
System.out.println("THE" + name + "apple is growing.");
}
void apple() {
System.out.println(name + "apples have a sweet taste");
}
}
객체 생성
package Pear;
public class PearExam {
public static void main(String[] args) {
Strawberry mystrawberry = new Strawberry("딸기 : ");
mystrawberry.strawberry();
Apple myapple = new Apple("사과 : ");
myapple.apple();
}
}
딸기 : strawberries have a sweet taste
사과 : apples have a sweet taste
상속(inheritance)이란?
상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미합니다. 이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다. 상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있습니다. 이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고도합니다. 그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 합니다.
상속의 장점
자바에서 클래스의 상속은 다음과 같은 장점을 가집니다.
1. 기존에 작성된 클래스를 재활용할 수 있습니다.
2. 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 됩니다.
3. 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련합니다.
자식 클래스(child class)
자식 클래스(child class)란 부모 클래스의 모든 특성을 물려받아 새롭게 작성된 클래스를 의미합니다. 자바에서 자식 클래스는 다음과 같은 문법을 통해 선언합니다.
문법
class 자식클래스이름 extend 부모클래스이름 { ... }
다음 그림은 부모 클래스와 자식 클래스 간의 포함 관계를 나타낸 그림입니다.
이처럼 부모 클래스는 자식 클래스에 포함된 것으로 볼 수 있습니다. 따라서 부모 클래스에 새로운 필드를 하나 추가하면, 자식 클래스에도 자동으로 해당 필드가 추가된 것처럼 동작합니다. 자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않습니다.
Object 클래스
자바에서 Object 클래스는 모든 클래스의 부모 클래스가 되는 클래스입니다. 따라서 자바의 모든 클래스는 자동으로 Object 클래스의 모든 필드와 메소드를 상속받게 됩니다. 즉, 자바의 모든 클래스는 별도로 extends 키워드를 사용하여 Object 클래스의 상속을 명시하지 않아도 Object 클래스의 모든 멤버를 자유롭게 사용할 수 있습니다. 자바의 모든 객체에서 toString()이나 clone()과 같은 메소드를 바로 사용할 수 있는 이유가 해당 메소드들이 Object 클래스의 메소드이기 때문입니다. Object 클래스에 대한 더 자세한 사항은 자바 Object 클래스 수업에서 확인할 수 있습니다.
super 키워드
super 키워드는 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수입니다. 인스턴스 변수의 이름과 지역 변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있었습니다. 이와 마찬가지로 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있습니다. 이렇게 자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있습니다. this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없습니다.
super() 메소드
this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면, super() 메소드는 부모 클래스의 생성자를 호출할 때 사용됩니다. 자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 모든 멤버까지도 포함되어 있습니다. 따라서 부모 클래스의 멤버를 초기화하기 위해서는 자식 클래스의 생성자에서 부모 클래스의 생성자까지 호출해야만 합니다.
메소드 오버라이딩(method overriding)
앞서 배운 오버로딩(overloading)이란 서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것이었습니다. 오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있습니다. 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받습니다. 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있습니다. 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미합니다.
오버라이딩의 조건
자바에서 메소드를 오버라이딩하기 위한 조건은 다음과 같습니다.
1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 합니다. 하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있습니다.
2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없습니다
3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없습니다.
오버로딩과 오버라이딩
오버로딩과 오버라이딩은 그 단어의 유사함으로 인해 혼동하기 쉽습니다. 하지만 그 개념은 확실히 다르며, 그 차이점을 아는 것이 중요합니다. 간단히 정의하면 오버로딩(overloading)은 새로운 메소드를 정의하는 것입니다. 하지만 오버라이딩(overriding)은 상속받은 기존의 메소드를 재정의하는 것입니다.
https://www.tcpschool.com/java/java_inheritance_overriding
'JAVA' 카테고리의 다른 글
JAVA(카페주문관리 프로그램)_2024-05-31 (2) | 2024.06.03 |
---|---|
JAVA(인터페이스와 다른 형식의 클래스)_2024-05-30 (0) | 2024.05.30 |
JAVA(클래스 다듬기)_2024-05-28 (0) | 2024.05.28 |
JAVA(열거형)_2024-05-27 (0) | 2024.05.27 |
JAVA(클래스와 객체)_2024-05-24 (0) | 2024.05.27 |