TIL_180417 Java 상속과 생성자, overriding/loading

상속과 생성자

  • Class 자식클래스명 extends 부모클래스명 {}을 통해 상속 가능
  • 자바는 객체 속에 기본적으로 자신의 이름(객체명)과 동일한 생성자를 만듬
  • 직접적인 생성자를 만들 경우 암시적 생성자는 만들어 지지 않음
  • 부모클래스와 자식클래스가 모두 매개변수를 언급하고 있을 시, 에러 발생
  • -> 하위객체는 extends함으로써 자바가 만든 부모객체의 암시적 생성자를 따르게 되는데, 프로그래머가 직접 지정해줌으로써 따를 수가 없기에 에러 발생

상속과 생성자 에러 해결방안 2가지

1. 부모클래스에 암시적(기본) 생성자를 직접 삽입하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Calculator {
int left, right;
//기본생성자 직접 삽입하기
public Calculator(){
}
public Calculator(int left, int right){
this.left = left;
this.right = right;
}
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}

2. 자식객체에 super 키워드 사용하기


super키워드란?

  • super 키워드는 부모 클래스를 의미
  • 여기에 ()붙이면 부모 클래스의 생성자를 의미하게 됨
  • 이렇게 하면 부모 클래스의 기본 생성자가 없어져도 오류발생 X

자식 클래스의 생성자에서 super를 사용할 때 주의할 점

  • 자식 클래스의 초기화문보다 super 키워드가 가장 먼저 사용되어야 함
    -자식클래스는 부모클래스의 상속으로 인스턴스를 생성하기 때문에, 부모클래스의 초기화가 끝난 상태에서만 자식클래스의 초기화 진행이 가능
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public Calculator(int left, int right){
    this.left = left;
    this.right = right;
    }
    public void setOprands(int left, int right) {
    this.left = left;
    this.right = right;
    }
    public void sum() {
    System.out.println(this.left + this.right);
    }
    }
    class SubstractionableCalculator extends Calculator {
    public SubstractionableCalculator(int left, int right) {
    // 자식객체에 super키워드 사용
    super(left, right);
    }
    public void substract() {
    System.out.println(this.left - this.right);
    }
    }
    public class CalculatorConstructorDemo5 {
    public static void main(String[] args) {
    //setOperands 함수 호출 없이 객체 생성시 left 와 right 값을 설정하기 위해서
    SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
    c1.sum();
    c1.avg();
    c1.substract();
    }
    }

Overriding

부모클래스의 메소드를 하위클래스에서 재정의하기 위해서는 몇가지 조건이 동일하여야 함

  • 메소드 이름
  • 리턴 타입
  • 매개변수의 수, 타입, 순서

-> 이럴경우, 부모클래스와 하위클래스의 코딩이 중복됨
-> 중복을 피하기 위해서는 super 키워드 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 부모 클래스
public int avg() {
return ((this.left + this.right) / 2);
}
}
// 자식 클래스에는 부모클래스를 의미하는 super 키워드 사용
public int avg() {
return super.avg();
}
```
---
## Overloading
- 같은 이름이지만 서로다른 매개변수의 형식을 가지고 있는 메소드
- 즉, 자바입장에서는 같은 이름의 메소드일지라도 매개변수의 이름이나, 타입이 다를경우 다른 메소드로 인식하게 됨.
- 단, 매개변수의 이름, 형식이 같으나 리턴값이 (int, void등) 다를 경우 에러발생
- 위의 경우에는 메소드를 호출하는 방식이 같기에, 자바 입장에서는 어떤 리턴값의 메소드를 실행해야하는지 알수 없음
- 즉, 오버로딩은 **1. 리턴값이 같아야하며 2. 메소드를 호출하는 방식이 달라야 함**
```java
class Calculator{
int left, right;
int third = 0;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void setOprands(int left, int right, int third){
// this.left = left;
// this.right = right; 중복을 막도록 아래코드로 대체
// 중복 부분을 먼저 호출
this.setOprands(left, right);
this.third = third;
}

오버라이딩 vs 오버로딩

오버라이딩은 하위클래스가 상속받은 부모클래스의 메소드를 새롭게 변경, 정의하여 사용하고자 할때 사용.
오버로딩은 같은 이름, 다른 매개변수의 메소드를 여러개 만들 수 있음 (eg. 같은 기능을 하는 하나의 메소드이나, 매개변수의 갯수에 따른 경우의 수와 같은 때에 적용)