반응형
1. abstract 제한자 : 미완성의
- 추상클래스 , 추상메소드 에 설정 가능한 제한자
1) 추상클래스(Abstract Class) - 무조건 상속
- abstract 제한자를 사용하여 선언된 클래스
- 상속을 목적으로 만든 상속전용클래스
형식
public abstract class 클래스명 {
//필드
//생성자
//메소드
}
추상클래스는 언제 만들까?
- 상속해주는 것만이 목적(부모역할)인 클래스에 작성 권장객체생성 목적은 NO
특징
- only 부모역할
- only 상속 전용 클래스
- 생성자가 있어도 부모클래스(추상클래스)는 객체 생성 불가능
- But, 부모클래스(추상클래스)는 참조변수 생성 가능
예시(부모 - Employee클래스)
//사원정보(사원번호, 사원이름)를 저장하기 위한 클래스
//=> 모든 사원 관련 클래스가 상속받아야 되는 부모클래스
//객체생성이 목적이 아닌 상속해주는 것이 목적인 클래스(부모클래스역할)
//=> 추상클래스로 작성하는 것을 권장
public abstract class Employee {
//필드
private int empNo;
private String empName;
//생성자
public Employee() {}
public Employee(int empNo, String empName) {
super();
this.empNo = empNo;
this.empName = empName;
}
//Getter&Setter
public int getEmpNo() {return empNo;}
public void setEmpNo(int empNo) {this.empNo = empNo;}
public String getEmpName() {return empName;}
public void setEmpName(String empName) {this.empName = empName;}
}
2) 추상메소드(Abstract Method) - 무조건 오버라이드
- abstract 제한자를 사용하여 선언된 메소드
- 메소드가 숨겨짐
- 자동형변환되어 오버라이드 선언한 자식메소드가 호출됨
형식
- 메소드의 머릿부를 작성하고 몸체부는 작성하지 않음
접근제한자 abstract 반환형 메소드명 (자료형 매개변수명, ...);
추상메소드는 언제 만들까?
- 자식클래스에서 부모클래스의 메소드를 무조건 오버라이드 선언되도록 설정하기 위해 부모클래스의 메소드를 추상메소드로 선언
추상클래스 내 추상메소드가 선언되어 있다면?
- 상속받은 자식클래스에는 반드시 부모클래스의 모든 추상메소드를 무조건 오버라이드 선언 해야한다.
- 만약 오버라이드 하지 않은 경우 error 발생
특징
- 추상메소드가 있다 ? → 반드시 추상클래스 이어야 한다.
- 추상메소드가 한개라도 선언되어있다면 무조건 추상클래스로 작성!!!!
- 추상클래스 이다? → 반드시 추상메소드가 있을 필요는 없다.
- 단, 여러 자식클래스들 중 추상메소드를 오버라이드 선언하지 않은 자식클래스는 추상클래스로 설정해야함 - 비권장
예시
//추상클래스내에서.. (Employee클래스)
public abstract int computePay();
//자식클래스내에서.. (EmployeeRegular클래스)
@Override
public int computePay() {
return annualSarary/12;
}
주의
- 추상메소드로 선언된 메소드(부모메소드)를 같은 클래스 내(부모클래스)에서 호출 시 자식메소드가 호출됨!!!
//추상메소드가 숨겨지고..
public abstract int computePay();
public int computeIncentive() {
//부모의 추상메소드는 숨겨지고 자동으로 객체형변환되어 자식메소드가 호출됨!!
return (int)(computePay() * INCENTIVE_RATE );
}
2. final 제한자 : 마지막의
- 필드 , 메소드 , 클래스에 설정 가능한 제한자
- 이게 마지막이야!
- 일반적으로 필드만들 때 많이 사용 : 특히 상수필드를 가장 많이 만듦
1) final 필드
- 필드에 final 제한자를 사용하여 선언한 필드
특징
- 필드에 저장된 값 변경 불가능
- 필드값을 변경할 경우 error 발생
- 필드 선언 시 반드시 초기값이 저장되도록 설정
형식
접근제한자 final 자료형 필드명 = 값 ;
2) final static 필드 (상수필드/Constant Field)
- 프로그램에서 값(리터럴) 대신 사용하기 위해 의미있는 단어로 제공되는 절대값
- 필드긴 하지만, 값으로 이용됨
- 값이 절대로 변경되면 안됨
특징
- 필드라고 부르지 않고, 상수라고 부름
- 어차피 직접적으로 접근해도 변경이 불가능하니 public 사용하기
- 주의) 상수명은 대문자 작성 , 스네이크표기법을 권장
형식
public static final 상수명 = 값;
예시
public static final double INCENTIVE_RATE = 1.5;
//객체마다 가질필요없으니 static 붙여주기
//또한 더 이상 값이 바뀌면 절대 안되니 final 붙여주기
//상수완성!
//java.lang.Math클래스의 PI필드 : 원주율을 제공하기 위한 상수
public static final double PI
3) final 메소드 - 오버라이드절대안돼! 이게 마지막이야! (부모클래스에 작성)
- 메소드에 final 제한자를 사용하여 선언한 메소드
- 이 메소드가 마지막 이에요~
- 메소드 재선언 안돼요~
특징
- 자식클래스에서 절대로 오버라이드 선언하지 못하도록 설정하는 메소드
형식
접근제한자 final 반환형 메소드명(자료형 매개변수명,...){명령;,...}
final메소드는 언제 만들면 좋을까?
- 자식이 오버라이드 메소드로 선언하면 잘못된 결과를 가져올 수 있을 때 부모클래스 메소드에 final을 붙여준다.
예시
//자식클래스에서 메소드를 오버라이드 선언하면 final제한자로 인해 비정상적인 결과가 발생한다.
//=> 자식클래스에서 메소드를 오버라이드 선언하지 못하도록 final 메소드로 선언한다.
//..부모클래스에 작성
public final int computeIncentive() {
return (int)(computePay() * INCENTIVE_RATE );
}
//..자식클래스에 작성
//부모클래스의 final메소드를 자식클래스에서 오버라이드 선언한 경우 error 발생
@Override
public int computeIncentive() {
return 100_000_000;
}
//java.lang.Object클래스의 notify메소드 : 자식클래스에서 오버라이드 절대 못함
public final void notify()
4) final 클래스 - 상속절대안돼! 이게마지막이야!
- 클래스에 final 제한자를 사용하여 선언한 클래스 (상속 불가능 클래스)
- 자주 사용하지는 않음
특징
- 다른 클래스에서 상속 받을 수 없는 클래스
형식
- public final class 클래스명{}
예시
//java.lang.system클래스 : 다른 클래스에서 상속받을 수 없는 클래스
public final class System extends Object
3. static 제한자 - 공통적인
- 필드 , 메소드 , 클래스(내부클래스만) 에 설정 가능한 제한자
- 객체에 상관 없이 클래스로 접근하기 위해 사용하는 제한자
- (static메모리에 클래스)
1) static 필드
- 정적필드
- 클래스변수
- final static필드 - 상수필드
2) static 메소드
- this매개변수 없음
3) static 내부클래스
반응형
'java > inheritance' 카테고리의 다른 글
[inheritance] 10. 접근제한자 (private, public, protected, package(default)) (0) | 2024.04.25 |
---|---|
[inheritance] 9. 사원 급여 관리 프로그램 (EmployeeApp) (0) | 2024.04.24 |
[inheritance] 7. object 클래스 (0) | 2024.04.23 |
[inheritance] 6. 학원인적자원관리 ERP프로그램 (AcademyApp) (2) | 2024.04.23 |
[inheritance] 5. 메소드 오버라이드(Method override) (0) | 2024.04.22 |