1. Java 기초 다지기 (7-2)
class Payment{
public void pay() {
System.out.println("메서드 pay() 실행");
}
}
class CreditCard extends Payment{
public void pay() {
System.out.println("CreditCard pay() 실행");
}
}
class CashCard extends Payment{
public void pay() {
System.out.println("Cash pay() 실행");
}
}
class PointCard extends Payment{
public void pay() {
System.out.println("PointCard pay() 실행");
}
}
public class Day7_b_1 {
public static void main(String[] args) {
Payment p1 = new CreditCard();
Payment p2 = new CashCard();
p1.pay(); // 추상클래스가 아니여도 상속은 통일된 인터페이스를 제공함
p2.pay();
}
}
2. 추상클래스
abstract class Payment2{
// 추상클래스 => 추상적인 개념을 만들고 그 아래로 구체적으로 파생
public abstract void pay();
// * 추상클래스는 하나이상의 추상메서드를 가짐
// * 메서드 선언만 있음. 추상메서드임.
// 추상메서드를 가지는 클래스는 반드시 추상클래스
// 추상메서드는 public 없어도 public
// 문법적으로는 추상메서드 없어도 추상클래스가 될 수는 있음(문법적 허용)
// but 통일된 인터페이스를 제공.
// 정의부가 없음.자식클래스에서 구현됌.
// 하위클래스에서 재정의 아님. 애초에 정의부가 없음.
}
class CreditCard2 extends Payment2{
public CreditCard2() {
super();
System.out.println("CreditCard 생성자 호출");
}
public void pay() {
System.out.println("CreditCard pay() 실행");
}
}
class CashCard2 extends Payment2{
public CashCard2() {
super();
System.out.println("CashCard 생성자 호출");
}
public void pay() {
System.out.println("Cash pay() 실행");
}
}
class PointCard2 extends Payment2{
public PointCard2() {
super();
System.out.println("PointCard 생성자 호출");
}
public void pay() {
System.out.println("PointCard pay() 실행");
}
}
public class Day7_b_2 {
public static void main(String[] args) {
// Payment2 p1 = new CreditCard(); // 추상클래스는 객체 못만듬
// Payment2 p2 = new CashCard();
CreditCard2 credit1 = new CreditCard2();
CashCard2 cash1 = new CashCard2();
credit1.pay();
cash1.pay();
}
}
3. 추상클래스의 활용
class PizzaStore{
public Pizza sale(String type) {
switch(type.toUpperCase()) {
case "BACON":
return new BaconPizza();
default:
return new CheezePizza();
}
}
}
abstract class Pizza{ // 피자라는 추상적 개념을 클래스로 => 추상 클래스
public abstract void sale(); // sale() 보고 승인
}
class BaconPizza extends Pizza{
public BaconPizza() {
System.out.println("베이컨 피자 생성자 호출");
}
public void sale() { // 각기 다른 sale() 실행
System.out.println("베이컨 피자 sale() 메서드");
}
}
class CheezePizza extends Pizza{
public CheezePizza() {
System.out.println("치즈 피자 생성자 호출");
}
public void sale() { // 각기 다른 sale() 실행
System.out.println("치즈 피자 sale() 메서드");
}
}
public class Day7_b_3 {
public static void main(String[] args) {
PizzaStore store1 = new PizzaStore();
Pizza Pizza1 = store1.sale("BACON");
Pizza Pizza2 = store1.sale("CHEeze");
Pizza1.sale();
Pizza2.sale();
}
}
4. 인터페이스
//*인터페이스
interface Fightable{
// 자바에서 인터페이스는 보통 가능형 clonable, Serializable, Comparable..
// 인터페이스 또한 Class의 일종임. 대문자로 시작
// 인터페이스가 가질수있는 멤버
// 1.public static final 멤버
// 2.public abstract 멤버 메서드
// 3.static inner 클래스 (나중에)
// 4.default 메서드
static final String weapon = "검"; // 1.public static final 멤버
public abstract void fight(); // 2.public abstract 멤버 메서드
// void fight(); 안써도 추상메서드임
// *추상클래스에 있는 추상메서드는 반드시 구현클래스에서 구현해야 함.
// *인터페이스에 있는 추상메서드 또한 구현클래스에서 구현해야함.
default void defaultFight() { // 4.default 메서드
System.out.println("맨손으로 싸웁니다.");
}
}
interface Movable{
static final String foot = "두 발";
public abstract void move();
default void defaultMove() {
System.out.println("기어다닙니다.");
}
}
//Fightable의 구현클래스이다.
// abstract
// ex) 추상클래스-구현클래스 관계
class Knight implements Fightable,Movable{
public void fight() { // 구현클래스에서 구현해주어야함.
System.out.println(Fightable.weapon + "으로 싸웁니다.");
}
public void move() {
System.out.println(Movable.foot + "로 걸어다닙니다.");
}
}
public interface Day7_b_4 {
public static void main(String[] args) {
Knight knight1 = new Knight(); // fight() , move() 둘 다 가지고 있음
Fightable knight2 = new Knight(); // Fightable 클래스, fight()만 가지고 있음
Movable knight3 = new Knight(); // move()만 가지고 있음
// 자바가 다중상속을 허용하지 않는 이유 : 다이아몬드 문제
// 다이아몬드 문제 해결방법: 멤버필드가 없으면 됌. 상속받을게 없으면 됌.
// 상속을 못받으면 다형성 구현이 불가능 -> 다이아몬드 문제를 일으킬만한 요소를 제외한 나머지만 상속할 수 있게 만들자
// =인터페이스
// 그림으로 표기한다면 상속은 실선, 인터페이스는 점선
knight1.fight();
knight1.move();
System.out.println();
System.out.println(Fightable.weapon);
knight2.fight();
knight2.defaultFight(); // default 메서드 사용해봄.
//knight.move(); Fightable 타입이기 때문에 move()가 없음. 승인 X
knight3.move();
knight3.defaultMove();
// 2 31 09
}
}
감사합니당🐷🐷🐷