Recent Posts
Link
250x250
오늘보다 더 나은 내일의 나에게_
Java 추상클래스와 인터페이스 본문
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"); } }
인터페이스 구현한 Pikachupackage 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