백지부터 시작하는 이세계 코딩 생활

추상클래스 (Abstract Class) & Interface 본문

JAVA/Abstract Class(추상) & Interface

추상클래스 (Abstract Class) & Interface

조아덕 2020. 8. 10. 17:31

// <추상클래스와 인터페이스>

// 추상클래스를 상속하는 방법.(정의하고 사용하는 방법)

// 인터페이스를 사용한 다중 상속.(정의하고 사용하는 방법)

// <추상클래스 & 추상매서드>

// 추상 : 뚜렷하게 드러나지 않는 것들. 형태가 없는 것들을 매서드만 지정해 . body 없는 상태. 이름만 있는 상태를 뜻함.

// 구현된 일반 매서드가 없다는 .

// 추상 매서드가 하나라도 포함된다면 이를 "추상클래스"라고 .

// ? 추상클래스는 추상매서드를 반듯이 포함해야 한다? no! 하지만 추상매서드가 하나나도 포함되면 추상클래스로 해줘야 한다.

// abstract <= 클래스 앞여 추상 매서드선언을 있다.

// 추상클래스 : 객체생성은 불가. 참조변수는 만들 있음. 매서드가 존재 하지 않아도 . body 없는 상태. 다형성을 제공함.

// 클래스가 클래스를 상속할 extends 사용하지만 인터페이스를 상속받을 떄는 implement(구현)이라고 .

// 클래스끼리는 extends, 아니면 implement

// 추상매서드에서 확장 받으면 추상매서드를 구현해줘야함. 그래야 클래스가 . 구현을 안하면 확장 받은 클래스도 추상클래스가 .

// 상속의 개념이기 때문에 가능.

// 구현을 해줘야 추상클래스 상태를 벗어날 있다. 추상클래스를 상속받으면 추상클래스가 된다. 이를 파훼하기 위해 구현을 하는것임.

//


// <인터페이스>

// cf. C++ 순수추상클래스와 Java 인터페이스는 유사하다.

// 타입을 추가하기 위해 사용함.

// 다중상속을 하기 위해 존재함. 하나의 클래스가 여러개의 타입을 가질 있게 .

// 일반 매서드가 들어갈 없다.

// 위치에 따라 신분이 변경됨.(ie.요리사가 집에가서 코딩을 하면 프로그래머도 되는 이치.)

// 하나의 클래스에 인터페이스에 계속 상속시킬 있음.

// 인터페이스는 Adaptor 역활을 한다. 서로 타입이 다른 것들을 서로 사용할 있게 해줌.


package s0513;
abstract class Shape { // 추상매서드가 포함되었기 때문에 클래스 또한 abstract를 붙여 추상클래스로 만들어줘야함.
	abstract void area(); // <= 추상매서드. 바디가 구현되지 않음. abstract 붙이는것이 중요함.
}//
//서브 클래스 생성.
//abstract class Circle extends Shape{	//추상 클래스를 상속받았기에 추상클래스로 만들어줘야함 abstract 추가.
class Circle extends Shape {
	// 수퍼클래스의 추상 매서드를 구현(implement)해주면 일반클래스가 된다.
	void area() {
		double result = Math.PI * Math.pow(r, 2);
		System.out.println(result);
	}
	int r;
	Circle(int r) {// <=생성자
		this.r = r;
	}
}
public class Ch15Ex01 {
	public static void main(String[] args) {
		// 추상클래스는 객체생성을 할 수 없다.
		// 추상클래스는 참조변수 선언이 가능하다.
		Shape c;
//		Shape c = new Shape(); // 객체 생성이 안됨. 추상클래스라서.		
		// 추상클래스 참조 변수로 업캐스팅 가능함.
		c = new Circle(10);
		c.area();
	}// end main
}//



package s0513복습;
import java.util.Scanner;
abstract class Shape {
	abstract void area();
}//
class Circle extends Shape {
	int r;
	static double Scan() {
		double input = 0;
		Scanner sc = new Scanner(System.in);
		input = sc.nextInt();
		return input;
	}
	void Message1() {
		System.out.println("r값 입력: ");
	}
	void CircleEx1501(int r) {
		this.r = r;
	}
	void area() {
		Message1();
		int ClcArea = (int) (Math.PI * Math.pow(Scan(), 2));
		System.out.println("Circle area is: " + ClcArea);
	}
}//
class Rectangle extends Shape {
	int w, h;
	public Rectangle(int w, int h) {
//		super(); //수퍼 클래스 호출 안할시에는 쓰지 않는게 좋다.
		this.w = w;
		this.h = h;
	}
	@Override //자동화 구현. add unimplement method 자동처리.
	void area() {
		double result = w*h;
		System.out.println("Rectangle area is: "+result);
	}
}//
public class Ch15Ex01복습 {
	public static void main(String[] args) {
		Circle CArea = new Circle();
		CArea.area();
		System.out.println();
		
		Rectangle RArea = new Rectangle(5,5);
		RArea.area();
		System.out.println();
		
	}
}//

package s0513;
//순서//
// 상속을 가능하게 해줄 추상클래스 생성.
// 추상클래스로는 움직이기, 무기 클래스가 있다.
// 공통으로 수행될 이벤트문 생성.
// 각 기능들을 수행할 서브 클래스들 생성.
// 
//템플릿 메서드 사용하는 방법.
abstract class Man {
	abstract void run();
	final void start() { // 뒤에서 고칠 수 없도록 고정해두기 위해 final을 사용.
		System.out.println("-Reday-");
		run();
		System.out.println("--complited--");
	}
}//
class Rambo extends Man {
	wepon w;
	Rambo(wepon w) {
		this.w = w;
	}
	@Override
	void run() {
		// TODO Auto-generated method stub
		System.out.println("Rambo runs!!");
		w.play();
	}
}//
abstract class wepon {
	abstract void play();
}//
//무기를 상속받아 총,칼로 구성한다.
class gun extends wepon {
	@Override
	void play() {
		// TODO Auto-generated method stub
		System.out.println("Rambo fire gun");
	}
}//
class knif extends wepon {
	@Override
	void play() {
		// TODO Auto-generated method stub
		System.out.println("Rambo Swings knif");
	}
}//
public class Ch15Ex02_템플릿매서드 {
	public static void main(String[] args) {
		// 익명:
		Rambo rambo = new Rambo(new wepon() {
			void play() {
				System.out.println("Bow Bow");
			}
		});
		rambo.start();
	}
}//


package s0513;
abstract class Player{
	abstract void run();
	abstract void jump();
	abstract void turn();	
	
	final void Play() {		
		System.out.println("-시작-");		
		run();
		jump();
		turn();
		System.out.println("-경험치 상승-");
	}
	
}//
class BeginnerLevel extends Player{
	@Override
	void run() {
		// TODO Auto-generated method stub
		System.out.println("Run Run Run");
	}
	@Override
	void jump() {
		// TODO Auto-generated method stub
		System.out.println("점프 불가");
	}
	@Override
	void turn() {
		// TODO Auto-generated method stub
		System.out.println("방향전환 불가");
	}
	
}//
class AdvancedLevel extends Player{
	@Override
	void run() {
		// TODO Auto-generated method stub
		System.out.println("Run Run Run");
	}
	@Override
	void jump() {
		// TODO Auto-generated method stub
		System.out.println("Jump Jump Jump");
	}
	@Override
	void turn() {
		// TODO Auto-generated method stub
		System.out.println("방향전환 불가");
	}
	
}//
class SuperLevel extends Player{
	@Override
	void run() {
		// TODO Auto-generated method stub
		System.out.println("Run Run Run");
	}
	@Override
	void jump() {
		// TODO Auto-generated method stub
		System.out.println("Jump Jump Jump");
	}
	@Override
	void turn() {
		// TODO Auto-generated method stub
		System.out.println("Turn Turn Turn");
	}
	
}
public class Ch15Ex03_책예제 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("게임을시작하지");
		Player gameStart = new BeginnerLevel();
		gameStart.Play();
		System.out.println();
		
		System.out.println("레벨이 오름");
		Player gameStart2 = new AdvancedLevel();
		gameStart2.Play();
		System.out.println();
		
		System.out.println("레벨이 오름");
		Player gameStart3 = new SuperLevel();
		gameStart3.Play();
		System.out.println("최고레벨 달성");
		
	}
}//


package s0513복습;
//순서//
//상속을 가능하게 해줄 추상클래스 생성.
//추상클래스로는 캐릭터, 움직이기, 무기 클래스가 있다.
//추상클래스 속 추상매서드도 생성해줘야 한다.
//공통으로 수행될 이벤트문 생성.
//각 기능들을 수행할 서브 클래스들 생성.
//
//템플릿 메서드 사용하는 방법.
abstract class Action {
	abstract void Go();
	final void Start() {
		System.out.println("Reday");
		Go();
		System.out.println("Clear");
	}
}//
class Hero extends Action {
	attact A;
	Hero(attact a) {
//		super();
		this.A = a;
	}
	@Override
	void Go() {
		// TODO Auto-generated method stub
		System.out.println("Hero Attacts !!");
		A.Play();
	}
}//
abstract class attact {
	abstract void Play();
//}
	class Z extends attact {
		void Play() {
			System.out.println("Z-Attact !!");
		}
	}//
	class X extends attact {
		void Play() {
			System.out.println("X-Jump !!");
		}
	}
}//
public class Ch15Ex02_복습 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Hero H = new Hero(new attact() {
			void Play() {
				System.out.println("HAHAHA!");
			}
		});		
		H.Start();
	}
}//


 

Comments