추상 클래스

    -추상 클래스는 완성되지 않은 설계도와 같다.

    -하여, 인스턴스를 생성할 수가 없다.

    -추상 메서드(선언부만 존재)를 최소 1개 이상 포함하고 있는 클래스이다.

    -일반 메서ㅓ드가 추상 메서드를 호출할 수 있다,(호출할때 필요한건 선언부임)

     

    추상 메서드

    메서드의 선언부만 있고, 구현부(정의부, 몸통)이 없는 메서드를 말한다.

    -필요하다면, 자손마다 다르게 구현될 것이라고 예상될 때 사용한다.

    -추상클래스를 상속받은 자손클래스는 조상의 추상 메서드의 구현부를 완성해야 

    인스턴스를 생성할 수 있다.

    -하지만, 일부만 구현하는 경우도 빈번하다.

     

    =다르게 구현할수 있는 소지가 있는 것을 정의부만 제공해서 만듬

     

    추상클래스의 작성

    상속받을 자손클래스에서 공통적으로 사용될 것이라고 예상되는 것을 모아서 하나의 추상클래스로

    만들거나, 이미 기존에 만들어 놓은 클래스라면 공통부분을 뽑아서 추상클래스로 만든다.

     

    1. 코드중복 제거된다.

    2. 한곳에서 관리가 된다.

    3. 오류가 줄어든다.

     

    =다형성이 적용된다. (부모타입으로 자식타입접근)

    공통부분은 추상클래스로 작성하는게 바람직하다.


    ContentSender.java

    package kr.co.kihd.abstractt;
    
    //추상클래스 : 1개 이상의 추상메서드를 포함하는 클래스
    //추상클래스는 인스턴스를 절대로 생성할 수 없다.
    //추상메서드 : 선언부만 존재하고 구현부가 없는 메서드.
    public abstract class ContentSender {
    	
    	private String title;
    	private String name;
    	
    	//생성자 
    	public ContentSender(String title, String name) {
    		this.title = title;
    		this.name = name;
    	}
    	
    	//getter
    	public String getTitle() {
    		return title;
    	}
    
    	public String getName() {
    		return name;
    	}
    	
    	//추상메서드 => 상속을 통해서 반드시 재정의(override)되어야 비로소
    	//인스턴스를 생성할수 있다.
    	public abstract void sendMessage(String content);
    	
    }
    

     

    KakaoSender.java

    package kr.co.kihd.abstractt;
    
    public class KakaoSender extends ContentSender {
    	
    	private String content;
    	
    	public KakaoSender(String title, String name, String content) {
    		super(title, name);
    		this.content = content;
    	}
    	
    	//getter
    	public String getContent() {
    		return this.content;
    	}
    	
    	//부모클래스의 추상메서드를 오버라이딩을 해주면 객체를 생성할수 있다.
    	@Override
    	public void sendMessage(String recipient) {
    		System.out.println("제목: " +this.getTitle());
    		System.out.println("이름: " +this.getName());
    		System.out.println("내용: " +this.getContent());
    		System.out.println("받는사람: " +recipient);
    	}
    	
    }
    

     

    SmsSender.java

    package kr.co.kihd.abstractt;
    
    public class SmsSender extends ContentSender {
    	
    	private String content;
    	
    	public SmsSender(String title, String name, String content) {
    		super(title, name);
    		this.content = content;
    	}
    	
    	//getter
    	public String getContent() {
    		return this.content;
    	}
    	
    	//부모클래스의 추상메서드를 오버라이딩을 해주면 객체를 생성할수 있다.
    	@Override
    	public void sendMessage(String recipient) {
    		System.out.println("제목2: " +this.getTitle());
    		System.out.println("이름2: " +this.getName());
    		System.out.println("내용2: " +this.getContent());
    		System.out.println("받는사람2: " +recipient);
    	}
    	
    }
    

     

    SenderTest.java

    package kr.co.kihd.abstractt;
    
    public class SenderTest {
    
    	public static void main(String[] args) {
    		
    		//추상클래스이기 떄문에 절대 인스턴스를 생성할수 없다.
    //		ContentSender contentSender = new ContentSender();
    		
    		//추상클래스도 조상이니까 필드의 다형성 적용됨. (업케스팅 : 자동형변환됨)
    		ContentSender contentSender1 = new KakaoSender("카카오톡", "바이든", "안녕 코로나바이러스!");
    		contentSender1.sendMessage("트럼프");
    		
    		System.out.println();
    		
    		ContentSender contentSender2 = new SmsSender("SMS", "오바마", "네 귀하고 씩씩했던 삶!");
    		contentSender2.sendMessage("트럼프");
    		
    	}
    
    }
    

    Phone.java

    package kr.co.kihd.abstractt2;
    
    //추상클래스
    public abstract class Phone {
    	private int seriaNo;
    	private String company;
    	private String owner;
    	
    	//생성자
    	public Phone(int seriaNo, String company, String owner) {
    		super();
    		this.seriaNo = seriaNo;
    		this.company = company;
    		this.owner = owner;
    	}
    	
    	//getter
    	public int getSeriaNo() {
    		return seriaNo;
    	}
    
    	public String getCompany() {
    		return company;
    	}
    
    	public String getOwner() {
    		return owner;
    	}
    
    	//추상메서드
    	public abstract void turnOn();
    	public abstract void turnOff();
    	
    	//폰의 정보 표시메서드
    	public void showInfo() {
    		System.out.println("시리얼 넘버 : " +this.getSeriaNo());
    		System.out.println("제조회사 : " +this.getCompany());
    		System.out.println("소유자 : " +this.getOwner());
    	}
    }
    

     

    SmartPhone.java

    package kr.co.kihd.abstractt2;
    
    public class SmartPhone extends Phone {
    
    	public SmartPhone(int seriaNo, String company, String owner) {
    		super(seriaNo, company, owner);
    		
    	}
    
    	@Override
    	public void turnOn() {
    		System.out.println("스마트폰이 켜졌습니다.");
    	}
    
    	@Override
    	public void turnOff() {
    		System.out.println("스마트폰이 꺼졌습니다.");
    	}
    	
    	public void internetSearch() {
    		System.out.println("구글 검색을 합니다.");
    	}
    	
    }
    

     

    TripleCameraPhone.java

    package kr.co.kihd.abstractt2;
    
    public class TripleCameraPhone extends Phone{
    
    	public TripleCameraPhone(int seriaNo, String company, String owner) {
    		super(seriaNo, company, owner);
    		
    	}
    
    	//추상메서드 2개 재정의
    	@Override
    	public void turnOn() {
    		System.out.println("트리플 카메라폰이 켜졌습니다.");
    	}
    
    	@Override
    	public void turnOff() {
    		System.out.println("트리플 카메라폰이 꺼졌습니다.");
    	}
    	
    	//자체 메서드 2개
    	public void carmeraOn() {
    		System.out.println("망원 기능을 사용합니다.");
    	}
    	public void carmeraOff() {
    		System.out.println("망원 기능이 중지됩니다..");
    	}
    		
    }
    

     

    PhoneTest.java

    package kr.co.kihd.abstractt2;
    
    public class PhoneTest {
    
    	public static void main(String[] args) {
    		//추상클래스는 인스턴스를 생성할수 없다.
    //		Phone phone = new Phone();
    //		Phone smartPhone = new SmartPhone(201106, "LG-V50", "손홍민");
    //		smartPhone	
    		
    		SmartPhone smartPhone = new SmartPhone(201106, "LG-V50", "손홍민");
    		smartPhone.showInfo();
    		smartPhone.turnOn();
    		smartPhone.turnOff();
    		smartPhone.internetSearch();
    		System.out.println();
    		
    		TripleCameraPhone triplePhone = new TripleCameraPhone(201112, "Apple iPhone12 pro", "류현진");
    		triplePhone.showInfo();
    		triplePhone.turnOn();
    		triplePhone.carmeraOn();
    		triplePhone.carmeraOff();
    		
    		System.out.println("----------------------------------");
    		Phone[] phone = new Phone[10];
    		phone[0] = new SmartPhone(201106, "LG-V50", "추신수");
    		phone[1] = new TripleCameraPhone(201112, "Apple iPhone12 mini", "박지성"); 
    		
    		//원래 타입이 Phone이니까 SmartPhone이나 TripleCameraPhone문에 
    		//선언되어 있는 메서드는 사용을 못한다. 원래타입이 Phone이니까.
    		phone[0].turnOn();
    		phone[0].showInfo();
    		
    		System.out.println("----------------------------------");
    		phone[1].turnOn();
    		phone[1].showInfo();
    	}
    	
    }
    
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기
    loading