Java_기초_Day7_2

임정민·2022년 10월 27일
0

언어공부

목록 보기
9/10
post-thumbnail

1. Java 기초 다지기 (7-2)

  1. 오버라이딩
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
		
	}
}

감사합니당🐷🐷🐷

profile
https://github.com/min731

0개의 댓글