상속 (Inheritance)

Lee Yong Seok·2022년 4월 26일
0
post-thumbnail
post-custom-banner

상속 (Inheritance)

자바에는 슈퍼(super) 클래스의 기능을 하위(sub) 클래스에 그대로 물려받을 수 있는 상속(Inheritance)이라는 개념이 있다.

상속의 특징

1. 객체 지향 프로그래밍(OOP)의 중요한 특징 중 하나이다.  
2. 코드의 재사용이 가능하다.  
3. 클래스 간의 계층적 관계를 구성할 수 있다.(다형성)
4. 다중 상속을 지원하지 않는다.(단일 상속, 하나의 super class를 가질 수 있다.)

** 다형성  
· 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.  
· 자바에서는 이러한 다형성을 슈퍼 클래스 타입의 참조 변수로 서브 클래스 타입의 인스턴스를 참조할 수 있도록 하여 
  구현하고 있다.

일반화 관계 (Generalization)

· 한 클래스가 다른 클래스를 포함하는 상위 개념일 때 두 클래스 사이에는 일반화 관계가 존재한다.  
· IS-A 관계 이다

상속 문법

접근제어자 class 하위클래스명 extends 상위클래스명 {

}

super

· 상위 클래스로부터 상속받은 필드나 메소드를 하위 클래스에서 참조하는 데 사용하는 참조 변수이다.  
· super.dept  
· super.payCheck( )

super() 메소드

· 상위 클래스의 생성자 메소드를 호출할 때 사용한다.  
· 하위 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 하위 클래스의 고유 인스턴스 변수뿐만 아니라 상위 클래스의 
  모든 인스터스 변수까지도 포함된다. 따라서 상위 클래스의 인스턴스 변수를 초기화하기 위해서는 하위 클래스의 생성자
  에서 상위 클래스의 생성자까지 호출해야 한다.
  

[상속에 대한 예제]를 통해 상속에 대한 개념을 살펴보자.

공통된 속성과 기능을 뽑아내자. (추상화)

인사급여관리시스템

정규직 : 고정급여
일용직 : 근무 일수에 따른 일당급여
영업직 : 고정급 외에 영업실적에 따른 영업수당률(커미션)
직원 유형에 따른 인스턴스 변수가 전부 다르기 때문에 클래스를 각각 만들어주어야한다.

사원(super(상위 클래스)) : Employee
공통속성 : 사번(no:String), 이름(name:String), 입사일자(initDay:String)
공통기능 : 급여 계산하기
** private은 상속이 되지않기때문에 default 접근 제어자로 지정

							↑ 일반화(IS-A 관계)
사원(sub(하위 클래스))
정규직 : 사번, 이름, 입사일자, 고정급(int) + 급여 계산하기(기능)
일용직 : 사번, 이름, 입사일자, 근무일수(int), 일당급여(int) + 급여 계산하기(기능)
영업직 : 사번, 이름, 입사일자, 고정급, 영업판매실적, 영업수당률 + 급여 계산하기(기능)

1. Employee 클래스는 슈퍼 클래스이다.
2. 인스턴스 변수, 생성자 메소드 그리고 급여를 계산하는 +payCheck() 메소드를 생성한다.

1. Regular 클래스는 Employee 클래스의 서브 클래스이다.(Employee 클래스를 상속한다.)
2. 매개변수 생성자는 슈퍼 클래스와 동일한 부분은 super() 메소드를 통해 호출할 수 있다.

1. 상속을 테스트해볼 수 있는 main() 메소드가 있는 InheritanceTest 클래스를 생성한다.
2. Regular 클래스 타입 변수 emp1에 대한 인스턴스를 생성한다.(사번, 이름, 입사일자, 급여 정보를 생성한다.)
3. 인스턴스 정보는 Regular 클래스에 매개변수 생성자 메소드에 의해 슈퍼 클래스인 Employee 클래스에 전달되고 인스턴스 
   변수에 저장된다.
4. 급여정보를 조회하기위해 Inheritance 클래스에서 payCheck() 메소드를 호출한다.
5. 메소드를 타고 Regular 클래스에 payCheck() 메소드가 있는지 확인을 했지만 따로 정의되어있지 않기때문에 Regular 
   클래스를 상속하고있는 Employee 클래스로 넘어간다.
6. 급여를 계산하는 메소드인 payCheck() 메소드가 현재 0이라는 값을 리턴(반환)하도록 정의되어있기때문에 콘솔에 급여정보
   가 0원이라는 값이 출력되게된다.
   

메소드 오버라이딩 (method overriding) (=메소드 재정의)

· 메소드 오버라이딩은 객체 지향 프로그래밍에서 서브클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 
  하나에 의해 이미 제공된 메소드를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다.
· 즉, 상속받은 상위 클래스의 메소드를 하위클래스에서 재정의하여 사용하는 것을 의미한다.

메소드 오버라이딩 (method overriding)의 조건

1. 메소드의 선언부는 기존 메소드와 완전히 같아야 한다. 하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 
   타입 변환할 수 있는 타입이라면 변경할 수 있다.
2. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.

[메소드 오버라이딩에 대한 예제1] 정규직 사원의 급여를 출력해보자.

1. 일반 사원 (Employee) 클래스에서 정의한 payCheck() 메소드를 정규직 사원 (Regular) 클래스에서 메소드 
   오버라이딩(메소드 재정의)한다.
2. InheritanceTest 클래스에서 payCheck() 메소드를 호출한다.
3. Regular 클래스에서 재정의한 payCheck() 메소드의 결과값은 리턴(반환)한다.
4. 리턴값을 int형 변수 pay에 저장한다.
5. printf 출력문에 의해 정규직 사원의 급여를 출력한다.

[메소드 오버라이딩에 대한 예제2] Daily 클래스를 생성하여 일용직 사원의 급여를 출력해보자.

1. 일용직 사원의 급여를 조회하기 위해 Daily 클래스를 생성한다.
2. 일용직 사원 Daily 클래스는 일반 사원 Employee 클래스의 기능을 상속받는다.
3. 근무일수를 저장하는 인스턴스 변수 workDay와 일당급여를 저장하는 인스턴스 변수 dailyPay를 생성한다.
4. 인스턴스의 정보를 전달 받을 생성자 메소드를 생성한다.
5. 일용직 사원의 급여를 계산해주는 payCheck() 메소드를 메소드 오버라이딩(메소드 재정의)한다.

1. 일용직 사원 (Daily)의 인스턴스 정보 생성한다.
2. 일용직 사원 (Daily)의 급여를 조회하는 메소드 payCheck() 메소드를 호출한다.
3. 일용직 사원 (Daily)에 재정의된 payCheck() 메소드의 결과값을 리턴(반환)한다.
4. 리턴값을 int형 변수 pay에 저장한다.
5. printf 출력문에 의해 일용직 사원의 급여를 출력한다.

[메소드 오버라이딩에 대한 예제3] 모든 사원의 기본 정보를 조회해보자.

· Employee 클래스에 사원의 기본 정보(사번, 이름, 입사일자)를 출력하는 printEmployee() 메소드를 정의한다.

· Employee 클래스를 상속받은 Regular 클래스에서 사원의 기본 정보를 출력하는 printEmployee() 메소드를 정규직 
  사원의 정보에 맞게 재정의한다.

· Employee 클래스를 상속받은 Daily 클래스에서 사원의 기본 정보를 출력하는 printEmployee() 메소드를 일용직 
  사원의 정보에 맞게 재정의한다.
  

1. 정규직 사원 (Regular) 클래스에서 재정의한 printEmployee() 메소드를 출력한다.
2. 일용직 사원 (Regular) 클래스에서 재정의한 printEmployee() 메소드를 출력한다.

[메소드 오버라이딩에 대한 예제4] Regular 클래스를 상속 받는 영업직 사원 (Sales) 클래스를 생성하여 급여 정보와 사원 기본 정보를 출력해보자.

1. Regular 클래스를 상속 받는 영업직 사원 (Sales) 클래스를 생성한다.
2. 영업직 사원 (Sales)에만 있는 영업판매실적을 나타내는 인스턴스 변수 sales와 커미션을 나타내는 commission 
   변수를 생성한다.
3. 인스턴스의 정보를 전달 받아 저장할 수 있는 메소드를 생성한다.
4. 영업판매실적에 따른 커미션 %를 계산하는 조건문을 사용하여 커미션 인스턴스 변수 commission에 저장한다.
5. 급여정보를 조회하는 payCheck() 메소드와 사원의 기본 정보를 나타내는 printEmployee() 메소드를 영업직 사원 
   (Sales) 클래스에 맞게 재정의한다.
   

1. 영업직 사원의 정보를 저장하는 인스턴스를 생성한다.
2. Sales 클래스 타입 변수 emp3는 인스턴스 정보를 가리키는 주소값을 가진다.
3. 변수 emp3 로 Sales 클래스에 재정의된 payCheck() 메소드를 호출하여 결과값을 리턴(반환)한다.
4. 리턴값을 int형 변수 pay에 저장한다.
5. printf 형식으로 영업직 사원의 급여 정보를 출력한다.
6. Sales 클래스에 재정의된 printEmployee() 메소드의 결과값을 리턴(반환)하여 영업직 사원의 기본 정보를 받아와서 
   출력한다.
∴ 급여가 200만원이며, 영업판매실적이 500만원이고, 영업수당률은 5%이기때문에 기본 급여 200만원에 500만원의 5%인 
   10만원을 가산해 총 급여는 210만원이다.
profile
Today I Learned 🌙
post-custom-banner

0개의 댓글