1. 상속이란 ? 

  • 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 방법.
  • 다시 말해, 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 하는 것.
  • 따라서 중복이 되는 코드를 줄여줄 수 있고, 개발 시간을 절약해 주기 때문에 효율적이고, 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오기 때문에 유지 보수 시간을 최소화할 수 있다는 장점이 있다.
  • 부모 클래스를 상위 클래스, 자식 클래스를 하위 클래스 또는 파생 클래스라고 부른다.

 

2. 클래스 상속

  • 프로그램에의 상속은 자식이 부모를 선택한다.
  • 선택된 부모클래스는 extends 뒤에 기술한다.
  • 단 하나의 부모클래스만 상속할 수 있다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 부모 클래스와 자식 클래스의 패키지가 다르다면, default 접근 제한을 갖는 필드와 메소드도 상속대상에서 제외된다.

 

3. 부모 생성자 호출

  • 모든 객체는 클래스의 생성자를 호출해야만 생성된다.
  • 부모 생성자는 자식 생정자의 맨 첫 줄에서 호출된다.
  • super();는 부모의 기본 생성자를 호출한다.
  • 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성한다.

  • super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. - 일치하지 않으면 컴파일에러
  • super(매개값, ...)는 반드시 자식 생성자 첫 줄에 위치해야 한다. - 아니면 컴파일 에러 발생

 

4. 메소드 재정의 (Overriding)

  • 자식 클래스에서 부모 클래스의 메소드를 사용하기 적합하도록 수정해서 사용하는 방법.
  • 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것

① 메소드 재정의 규칙

  1. 부모의 메소드와 동일한 시그너처 ( 리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
  2. 접근 제한을 더 강하게 재정의할 수 없다.
  3. 새로운 예외(Exception)를 throws할 수 없다.

※ 접근 제한을 더 강하게 재정을 할 수 없다 ? 

더보기
부모 메소드가 public 접근 제한을 가지고 있을 경우 재정의하는 자식 메소드는 default 나 private 접근 제한으로 수정할 수 없다는 의미. 단, 반대는 가능. 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public으로 접근 제한을 가질 수 있다.

 

@Override 어노테이션

  • 해당 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여 준다.
//부모 클래스

public class Calculator {
	double areaCircle(double r) {
    	System.out.println("Calculator 개체의 areaCircle()실행");
        return 3.14159 * r * r ;
    }
}

//자식 클래스 // 재정의

public class Computer extends Calculator {
    @Override //어노테이션 생략 가능
    double areaCircle(double r) {
    	System.out.println("Computer 객체의 areaCircle() 실행");
        return Math.PI * r * r;   
    }
}

//메소드 재정의 테스트

public class ComputerExample {
	public static void main(String[] args) {
    	int r = 20;
        
        Calulator calculrator = new Calculator();
        System.out.println(calculatro.areaCircle(r)); //314.159
        
        Computer computer = new Computer();
        System.out.println(computer.areaCircle(r)); //314.1592653589793
        
    }
}

 

③ 부모 메소드 호출

  • 자식 클래스에서 부모 클래스 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨진다.
  • 그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 한다면, 명시적으로 super 키워드를 븉여서 부모 메소드를 호출 할 수 있다.
  • super.부모메소드();

 

 

5. Final 클래스와 Final 메소드

  • 클래스와 메소드를 선언할 때 final 키워드가 지정되면 상속과 관련이 있다는 의미
  • final 클래스는 부모 클래스가 될 수 없다. 즉, 자식 클래스를 만들 수 없다.
  • final 키워드 때문에 최종적인 클래스가 되기 때문이다.
  • 마찬가지로, 부모 클래스 내부의 final 메소드도 최종적인 메소드가 되기 때문에 자식 클래스에서 재정의 할 수 없다.
//재정의 할 수 없는 final 메소드

public class Car {
    //필드
    public int speed;
    
    //메소드
    public void speedUp(){ speed += 1; }
    
    //final 메소드
    public final void stop() {
    	System.out.println("차를 멈춤");
    	speed = 0;
    }
}


public class SportCar extends Car {
    @Override
    public void speedUp(){ speed += 10; }
    
    @Override
    public void stop(){
    	System.out.println("스포츠카를 멈춤");   //stop()은 final 메소드기 때문에 재정의 할 수 없음
        speed = 0;
    }
}

 

 

6. protected 접근 제한자

  • protected 는 public과 default 접근 제한의 중간
  • 같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
  • 단, 자식 클래스에서 부모 클래스의 생성자를 호출할 때, new 연산자를 사용해서 직접 호출할 수 없고, super(); 를 이용해야 한다.

'Coding > Java' 카테고리의 다른 글

[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25

+ Recent posts