본문 바로가기

개발일지/Java + Spring

[Java] 추상클래스

 

 

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);
	}
}