오늘보다 더 나은 내일의 나에게_

Java 추상클래스와 인터페이스 본문

JAVA

Java 추상클래스와 인터페이스

chan_96 2022. 1. 13. 06:18
728x90

추상 클래스

추상화
클래스 간의 공통점을 찾아서 공통의 조상을 만드는 작업
상속 계층도를 따라 올라갈수록 추상화는 더욱 심화

구체화
상속을 통해 클래스를 구현, 확장하는 작업

추상 메서드(abstract method)

- 선언되어 있으나 구현되어 있지 않은 메서드

- abstract 키워드를 붙여 선언
=> ex) public abstract int getValue( );

- 서브 클래스에서 오버라이딩하여 재 구현해주어야 함(필수!)

추상 클래스(abstract class)

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

- abstract 키워드를 붙여 선언

- 혹은, 추상 메서드가 하나도 없지만 클래스 앞에 abstract 키워드가 붙은 경우

추상 클래스의 특성

- 추상 클래스 자체로 객체를 생성할 수는 없다

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

- 슈퍼클래스에는 개념적 특징을 정의하고 서브클래스에는 구체적 행위를 구현하여 설계와 구현을 분리할 수 있다.

예제 월급 계산 프로그램 만들기

EmpNo(사번) Name Employee Pay(일당/연봉) Bonus WorkDay 비고(월급 계산)
SMHRD001 박문수 TempEmployee 3000     pay/12
SMHRD002 홍길동 RegularEmployee 4000 400   (pay+bous)/12
SMHRD003 김장독 PartTimeEmployee 10   10 pay*workDay


더보기
Employee 클래스
package Employee;

//abstract : 추상 키워드
//추상클래스는 : 클래스내에 추상메서드가 하나라도 있거나 클래스 선언시 abstract 키워드를
//붙이면 추상클래스가 됨
public abstract class Employee {
	//필드 : 사번, 이름, 페이(일당/연봉)
	//메서드 : 월급계산하다(추상메서드-강제성), 정보출력하다(사번, 이름, 월급)
	String empno;
	String name;
	int pay;
	
	//추상메서드 : 정의는 되어 있지만 기능이 없는 메서드
	//추상메서드가 있는 추상 클래스를 상속받은 하위클래스에서 필수로 오버라이딩 해줘야함(강제성)
	public abstract int getPay();
	
	public String print() {
		return empno + " : " + name + " : " + getPay();
	}
	
}


TempEmployee 클래스
package Employee;

public class TempEmployee extends Employee{

	public TempEmployee(String empno, String name, int pay) {
		this.empno = empno;
		this.name = name;
		this.pay = pay;
	}
	
	@Override
	public int getPay() {
		return pay/12;
	}

}


RegularEmployee 클래스
package Employee;

public class RegularEmployee extends Employee {
	
	int bonus;
	
	public RegularEmployee(String empno, String name, int pay, int bonus) {
		this.empno = empno;
		this.name = name;
		this.pay = pay;
		this.bonus = bonus;
	}
	
	@Override
	public int getPay() {
		return (pay+bonus)/12;
	}

}


PartTimeEmployee 클래스
package Employee;

public class PartTimeEmployee extends Employee{

	int workDay;
	
	public PartTimeEmployee(String empno, String name, int pay, int workDay) {
		this.empno = empno;
		this.name = name;
		this.pay = pay;
		this.workDay = workDay;
	}
	
	@Override
	public int getPay() {
		return pay*workDay;
	}
}

EmployeeMain 클래스
package Employee;

public class EmployeeMain {
	public static void main(String[] args) {
		
		TempEmployee te = new TempEmployee("SMHRD001", "박문수", 3000);
		RegularEmployee re = new RegularEmployee("SMHRD002", "홍길동", 4000, 400);
		PartTimeEmployee pe = new PartTimeEmployee("SMHRD003", "김장독", 10, 10);
		
		System.out.println(te.print());
		System.out.println(re.print());
		System.out.println(pe.print());

		//업캐스팅(자동형변환)
		Employee e1 = te;
		Employee e2 = re;
		Employee e3 = pe;
		
		Employee[] emp_arr = new Employee[3];
		//emp_arr[0] = e1;
		emp_arr[0] = te; // TempEmployee가 Employee 타입으로 자동형변환(업캐스팅) 된상태로 참조값이 할당
		//emp_arr[1] = e2;
		emp_arr[1] = re;
		//emp_arr[2] = e3;
		emp_arr[2] = pe;
	}
}


인터페이스(Interface)

- 모든 메서드가 추상 메서드인 클래스

- 상수추상 메서드로만 구성되어 있어 변수를 필드에 선언 불가
* 단, Java8 버전부터는 일반 메서드도 선언 가능(default, static으로만 가능)

- interface 키워드를 붙여 선언
* public interface Code() {...}

- 인터페이스는 객체 생성이 불가능

인터페이스 상속

- 인터페이스를 상속하여 확장된 인터페이스 작성 가능

- 다중 구현(implements) 가능

- 인터페이스에는 선언만 하여 선언부구현부를 나누어 작성 가능
=> 사용자는 구현의 내용은 모르지만 인터페이스에 선언된 메서드가 구현되어 있기 때문에 호출해서 사용만 하면 됨
=> 플러그가 콘센트 규격만 맞으면 어떻게 만들어졌는지 알 필요 없이 전원 연결에 사용하기만 하면 됨

인터페이스 구현

- implements 키워드 사용하여 구현
- 여러 개의 인터페이스를 동시에 구현할 수 있음
- 상속 구현 동시에 가능

public interface 인터페이스이름{
	public static final 자료형 변수명 = 변수값;
    
	public abstract 반환자료형 메소드명(매개변수);
}

public interface Animals{
	public static final int AGE = 4;
	double WEIGHT = 60; //상수 final 생략
    
	public abstract void eat(String food);
	public abstract void sleep();
	void speek(); // 추상메서드 / abstract 생략된 형태
}


하나의 클래스가 여러 개의 인터페이스 구현할 수 있다.

interface l1{
	public void x();
}
interface l2{
	public void z();
}

class A implements l1, l2{
	public void x(){};
	public void z(){};
}


인터페이스끼리도 상속이 가능하다

interface l3{
	public void x();
}
interface l4 extends l3{
	public void z();

class B implements l4{
	public void x(){};
	public void z(){}; 
}


추상 클래스 인터페이스 비교


추상클래스

인터페이스
- 일반 메소드 포함 가능

- 상수, 변수 모두 필드에 포함 가능

- 모든 서브 클래스에 공통된 메소드가 있는 경우에는 추상클래스가 적합
- 모든 메소드가 추상 메소드

- 상수만 필드에 포함 가능

- 다중 구현 지원

인터페이스 예시 코드

인터페이스 Epoketmon
package EPoketmon;

public interface Epoketmon { // 객체 생성 불가능

	//인터페이스 내에서는 상수만 선언 가능 (final)
	//상수는 무조건 선언할 때 초기화 시켜줘야함
	final String type = "전기";
	int level = 1; //상수
	//인터페이스 내에는 변수선언이 불가능하기때문에 final 키워드 안붙여도
	//상수로 선언 (초기화 시켜줘야함)
	
	//인터페이스 내에서는 추상메서드 선언가능
	public abstract void attack();
	public void moving(); 
	// abstract 키워드 붙이지 않아도 추상메서드로 선언됨
	// 일반메서드는 {}가 있어야함!
	
	//java8버전 이상부터는 일반메서드도 선언 가능
	//(default, static)
	//default : 접근제한자가 아니라 인터페이스내에서 일반메서드를
	//선언할 수 있게 해주는 키워드
	public default void hello() {
		System.out.println("안녕");
	}
	
	public static void hello1() {
		System.out.println("안녕1");
	}
}


인터페이스 구현한 Pikachu

package EPoketmon;

public class Pikachu implements Epoketmon{

	@Override
	public void attack() {
		System.out.println("피카츄공격!");
	}

	@Override
	public void moving() {
		System.out.println("피카츄이동!");
	}
}​

 


인터페이스 구현한 Coil
package EPoketmon;

public class Coil implements Epoketmon{
	@Override
	public void attack() {
		System.out.println("코일공격!");
	}

	@Override
	public void moving() {
		System.out.println("코일이동!");		
	}
}​


객체 생성

package EPoketmon;

public class Main {
	public static void main(String[] args) {
		
		// Epoketmon e = new Epoketmon(); - 인터페이스를 객체 생성 불가능 
		
		Pikachu p = new Pikachu();
		Coil c = new Coil();
		
		Epoketmon e1 = p; // 업캐스팅(자동형변환)
		Epoketmon e2 = c;
		
		Epoketmon[] e_arr = new Epoketmon[2];
		
		//e_arr[0] = e1;
		e_arr[0] = p; //피카츄 -> 전기포켓못으로 업캐스팅(자동형변환)
		//e_arr[1] = e2; 
		e_arr[1] = c;
	}
}​


728x90

'JAVA' 카테고리의 다른 글

Java 정렬 알고리즘  (0) 2022.01.13
Java 상속  (0) 2022.01.13
Java MVC Pattern  (0) 2022.01.13
Java 객체 배열  (0) 2022.01.13
Java 메소드(Method)  (0) 2022.01.13
Comments