ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA 추상과 인터페이스
    back-end&DB/Java 2023. 5. 22. 16:12
    728x90

    1. 추상화(Abstraction)

     

    객체에서 공통된 속성과 행위를 추출하는 기법

    상세한 정보는 무시하고 필욯나 정보들만 간추려서 구성

     

     

    1.1 추상 메소드(abstract method)

     

    선언되어 있으나 boy가 구현되어 있지 않는 메소드

    추상 메소드 선언

    abstract 키워드로 선언

    public abstract int getValues();

     

    1.2 추상 클래스 (abstract class)

     

    추상 메소드를 하나라도 가진 클래스

    클래스 앞에 반드시 abstract라고 선언해야 한다.

    추상 메소드가 하나도 없지만 클래스 앞에 abstract로 선언한 경우

     

    - 추상 클래스의 특징

    추상클래스의 객체는 생성할 수 없다.

     

    - 추상 클래스 필요성

    상속관계에서 서브 클래스가 반드시 구현 해야 함을 알릴 때(강제성)

     

    - 설계와 구현 분리

    슈퍼 클래스에서는 개념적 특징 정의

    서브 클래스에서 구체적 행위 구현

     

     

    1.3 예제

    사번 이름 구분 계약급여/연봉/일당 비고
    E001 AAA 계약직 5000 6개월
    E002 BBB 정규직 3000 보너스 400
    E003 CCC 아르바이트 5 10일 근무
    E004 DDD 아르바이트 10 20일 근무

     

    - 직원 클래스 생성

     

    추상 메소드로 인한 추상 클래스

    package com.employee;
    
    public abstract class Employee {
    
    	// 속성
    	private String empNo; // 사원번호
    	private String name; // 이름
    	protected int pay; // 급여
    	
    	public abstract int getMoneyPay(); // 오버라이딩 하는 메소드
    	
    	// 객체 생성을 될때 초기화 -- 생성자
        
    	public Employee(String empNo, String name, int pay) {
    		super();
    		this.empNo = empNo;
    		this.name = name;
    		this.pay = pay;
    	}
    	
    	// 캡슐화 -- 외부로부터 접근가능한 메소드
    	public String getEmpNo() {
    		return empNo;
    	}
    	public void setEmpNO(String empNo) {
    		this.empNo = empNo;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getPay() {
    		return pay;
    	}
    	public void setPay(int pay) {
    		this.pay = pay;
    	}
    }

     

    - 정규직 클래스 생성 (부모 클래스 직원)

    bonusPay라는 보너스 속성 추가

    package com.employee;
    
    public class RegularEmployee extends Employee {
    	
    	// 정규직에는 보너스 추가 속성
    	private int bonusPay;
    
    	public RegularEmployee(String empNo, String name, int pay, int bonusPay) {
    		super(empNo, name, pay);
    		this.bonusPay = bonusPay;
    	}
    	@Override
    	public int getMoneyPay() {
    		return (pay + bonusPay)/12;
    	}
    }

     

    - 계약직 클래스 생성(부모 클래스 직원)

    month라는 계약기간 속성 추가

    package com.employee;
    
    public class TempEmployee extends Employee {
    
    	//계약직에는 추가 속성에 계약 월
    	private int month;
    	
    	public TempEmployee(String empNo, String name, int pay, int month) {
    		super(empNo, name, pay);// 조상클래스의 생성자를 호출하는 메소드
    		// 첫줄에 작성해야 된다.
    		this.month = month;
    	}
    	@Override
    	public int getMoneyPay() {
    		return pay/month;
    	}
    }

     

    - 아르바이트 클래스 생성(부모 클래스 직원)

    time이라는 시간 속성을 추가

    package com.employee;
    
    public class PartTimeEmployee extends Employee {
    
    	// 아르바이트는 시간 추가 속성
    	private int time;
    	
    	public PartTimeEmployee(String empNo, String name, int pay, int time) {
    		super(empNo, name, pay);
    		this.time = time;
    	}
    	@Override
    	public int getMoneyPay() {
    		return pay = pay * time;
    	}	
    }

     

    - 최종 메인 클래스

    package com.employee;
    
    public class Employee_main {
    	public static void main(String[] args) {
    
    		Employee emp01 = new TempEmployee("E001", "AAA", 5000, 6);
    		Employee emp02 = new RegularEmployee("E002", "BBB", 3000, 400);
    		Employee emp03 = new PartTimeEmployee("E003", "CCC", 5, 10);
    		Employee emp04 = new PartTimeEmployee("E004", "DDD", 10, 20);
    
    		Employee[] emp = { emp01, emp02, emp03, emp04 };
    
    		for (int i = 0; i < emp.length; i++) {
    			System.out.println("사번 : " + emp[i].getEmpNo());
    			System.out.println("이름 : " + emp[i].getName());
    			System.out.println("급여 : " + emp[i].getMoneyPay());
    			System.out.println("==============");
    		}
    	}
    }

     

    2. 인터페이스

     

    인터페이스란 

    서로 다른 시스템을 서로 이어주는 부분

     

    2.1 변수 선언의 특징

    public static final int num1 = 0;
    // public static final은 생략이 가능하다.
    int num2 = 10;
    final int num3 = 11;
    static final int num4 = 14;

     

    2.2 메소드 선언의 특징

    public abstract void call();
    // public abstract 생략 가능
    void receive();
    // abstract void lvlvl();
    
    //JDK 1.7 default 메소드 생성 가능
    //JDK 1.9 버전 이상 부터는 static 메소드 가능
    	
    default void sendmessage() {
    //body가 있는 메소드도 생성 가능
    	}

     

    2.3 인터페이스 상속

    package ex_interface;
    public interface SmartPhone_interface extends Phone_interface {
    	//인터페이스의 상속
    	void internet();	
    }

     

    - 인터페이스 상속의 장점

    다중 상속이 가능하다.

    다중 구현도 가능하다.

    package ex_interface;
    
    public class SmartPhone implements SmartPhone_interface,Camera {
    	// 인터페이스는 다중 구현(다중 상속)이 가능 합니다.
    	@Override
    	public void call() {	
    	}
    	@Override
    	public void receive() {
    	}
    	@Override
    	public void pick() {	
    	}
    	@Override
    	public void internet() {	
    	}
    }

     

    인터 페이스에서는 객체 생성이 불가능하다.

    다만 익명 클래스로 인터페이스 일회성으로 사용 가능하다.

    package ex_interface;
    
    public class Phone_main {
    	public static void main(String[] args) {
    		//Phone_interface pi = new Phone_interface(); 사용 불가	
    		// 익명클래스 -- 일회성
    		Phone_interface pi2 = new Phone_interface() {		
    			@Override
    			public void receive() {		
    			}
    			@Override
    			public void call() {			
    			}
    		};	
    	}
    }

     

    3. 정리

    비교요소 인터페이스 추상클래스
    목적 객체의 기능을 모두 공개한 문서와 같은 것으로, 개발자에게 인터페이스 상속받는 클래스의 목적에 따라 모든 추상메소드를 만들도록 하는 목적 서브클래스에서 필요한 부분을 구현하고 상속받아 활용 할 수 있도록 추상메소드를 선언하여 서브 클래스에서 구현하도록 만든 클래스
    구성 변수 필드는 포함 X
    상수만 가능
    추상메소드 포함
    (버전에 따라 default메소드도 가능)
    다중 상속 지원
    추상메소드, 일반메소드 모두 가능
    상수, 변수 모두 포함

     

    728x90

    'back-end&DB > Java' 카테고리의 다른 글

    JAVA 제네릭스와 제네릭클래스  (0) 2023.05.27
    JAVA JDBC과 API  (0) 2023.05.24
    JAVA MVC패턴  (0) 2023.05.22
    JAVA 상속과 오버라이딩(Overriding)  (0) 2023.05.19
    JAVA 생성자와 접근제한자  (0) 2023.05.19
Designed by Tistory.