abstract class AbstractClass{
//변수 선언
int age;
//구현된 메소드
void generalMethod() {
System.out.println("일반 메소드");
}
//추상 메소드
abstract void abstractMethod(); //추상 메소드는 {} 실행부분이 있으면 안 됨
}
class AbstractChildClass extends AbstractClass{ //상속
@Override
void abstractMethod() {
System.out.println("추상 메소드 구현");
}
}
public class AbstractTest1 {
public static void main(String[] args) {
//추상 클래스로 객체 생성
//AbstractClass ac = new AbstractClass();
//오류가 뜨는 이유 : 아래에는 똑같이 객체 생성을 했는데
//얘는 상속을 해줬던 부모 클래스에서 직접 받으려고 해서..
//자식을 거쳐서 받아야 됨
//자식클래스로 객체 생성
AbstractClass acc = new AbstractChildClass(); //다형성
//상속을 다 받았으니 자식을 거쳐서 받아야해서 설정함
acc.abstractMethod();
System.out.println(acc.age);
acc.generalMethod();
}
}
위에서 추상메소드를 선언했고, 아래에서 그것을 상속 받았다면 반드시 구현을 해줘야한다. ( 재정의 ) 오직 추상메소드에서만 정의를 할 수 있다. 그것이 인터페이스와 큰 차이다. 추상클래스는 상속을 받을 때 부모 한 군데에서 밖에 상속을 받을 수 밖에 없다. 그러나 인터페이스에서는 여러개에서 상속을 받을 수 있다.
abstract class AbstractClass{
//변수 선언
int age;
//구현된 메소드
void generalMethod() {
System.out.println("일반 메소드");
}
//추상 메소드
abstract void abstractMethod(); //추상 메소드는 {} 실행부분이 있으면 안 됨
}
위쪽은 일반 변수와 일반 메소드이다. 세 번째는 추상메소드이다. 추상 메소드에는 { } 실행부분이 있으면 안 된다. 여기서는 계획(설계)만 해둠
class AbstractChildClass extends AbstractClass{ //상속
@Override
void abstractMethod() {
System.out.println("추상 메소드 구현");
}
}
구현하는 부분으로 위에서 쓴 추상메소드를 반드시 오버라이드 해줘야해서 재정의를 해줬다.
abstract class AbClass1{
abstract void abMethod1();
}
abstract class AbClass2 extends AbClass1{
abstract void abMethod2();
}
class GeneralClass extends AbClass2{
@Override
void abMethod1() {
System.out.println("abMethod1 메소드 구현");
}
@Override
void abMethod2() {
System.out.println("abMethod2 메소드 구현");
}
}
public class AbstractTest2 {
public static void main(String[] args) {
GeneralClass gc = new GeneralClass();
gc.abMethod1();
gc.abMethod2();
}
}
오버라이드는 쓰지 않아도 됨
abstract class AbClass1{
abstract void abMethod1();
}
구현을 하지 않고 설계/정의만 해둠
abstract class AbClass2 extends AbClass1{
abstract void abMethod2();
}
상속을 받음
class GeneralClass extends AbClass2{
@Override
void abMethod1() {
System.out.println("abMethod1 메소드 구현");
}
@Override
void abMethod2() {
System.out.println("abMethod2 메소드 구현");
}
}
두 개를 상속 받았다. 추상클래스의 경우 상속을 받았을 때 반드시 구현(재정의)을 해줘야한다. 추상클래스는 무조건이다. 그렇지 않으면 사용을 할 수 없다.
추상클래스와 오버라이딩은 비슷하다.
abstract class Vehicle{
abstract void transfer();
}
class Car extends Vehicle{
@Override
void transfer() {
System.out.println("차도로 나른다.");
}
}
class Ship extends Vehicle{
@Override
void transfer() {
System.out.println("수로로 나른다.");
}
}
class Plane extends Vehicle{
@Override
void transfer() {
System.out.println("하늘로 나른다.");
}
}
class VehicleUse{
void showTransferStyle(Vehicle vehicle) {
vehicle.transfer();
}
}
public class AbstractTest3 {
public static void main(String[] args) {
Car car = new Car();
Ship ship = new Ship();
Plane plane = new Plane();
VehicleUse vUse = new VehicleUse();
vUse.showTransferStyle(car);
vUse.showTransferStyle(ship);
vUse.showTransferStyle(plane);
}
}
abstract class AirPlane{
abstract String getPrice();
abstract String getBrand();
abstract String getName();
}
class CombatPlane extends AirPlane{
@Override
String getBrand() {
return "브리티시 에어로스페이스사";
}
@Override
String getName() {
return "유로파이터 타이푼";
}
@Override
String getPrice() {
return "2,185억 9,200만 원";
}
}
class AirLiner extends AirPlane {
@Override
String getBrand() {
return "에어버스사";
}
@Override
String getName() {
return "A380";
}
@Override
String getPrice() {
return "4,100억 원";
}
}
class PlaneInfo{
//각각해도 되지만 두 개의 기능을 여기서 사용해 보려고 한다. 첨자를 이용해서
//이렇게도 사용할 수 있다고 알아두자!
public static void showPlaneInfo(AirPlane airPlane) {
System.out.println("이름 : " + airPlane.getName());
System.out.println("제조사 : " + airPlane.getBrand());
System.out.println("가격 : " + airPlane.getPrice());
}
}
public class PlaneMain{
public static void main(String[] args) {
CombatPlane combatPlane = new CombatPlane();
AirLiner airLiner = new AirLiner();
PlaneInfo.showPlaneInfo(combatPlane);
PlaneInfo.showPlaneInfo(airLiner);
}
}
'개발일지 > Java + Spring' 카테고리의 다른 글
[Java] File 만들기/읽기 (0) | 2021.09.30 |
---|---|
[Java] 거스름 돈 출력 - 예제 (0) | 2021.09.30 |
[Java] 다형성 정의 (0) | 2021.09.29 |
[Java] 접근 제한자, final 예약어 (0) | 2021.09.29 |
[Java] 상속(extends)의 정의 - overriding, Super() (0) | 2021.09.29 |