백지부터 시작하는 이세계 코딩 생활
추상클래스 (Abstract Class) & Interface 본문
// <추상클래스와 인터페이스>
// 추상클래스를 상속하는 방법.(정의하고 사용하는 방법)
// 인터페이스를 사용한 다중 상속.(정의하고 사용하는 방법)
// <추상클래스 & 추상매서드>
// 추상 : 뚜렷하게 드러나지 않는 것들. 형태가 없는 것들을 매서드만 지정해 둠. 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();
}
}//