언어/JAVA

상속

빨대도둑 2022. 11. 15. 11:28

상속은 부모가 자식에게 물려주는 행위를 말한다. 자식은 상속을 통해서 부모가 물려준 것을 자연스럽게 이용할 수 있다. 객체 지향 프로그램에서도 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다. 프로그램에서는 부모 클래스를 상위 클래스라고 부르기도 하고, 자식 클래스를 하위 클래스, 파생 클래스라고 부른다

 

상속

상속을 해도 부모 클래스의 모든 필드와 메소드들을 물려받는 것은 아니다. 부모 클래스에서 private 접근 제한을 갖는 필드와 메서드는 상속 대상에서 제외된다. 그리고 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메서드도 상속 대상에서 제외된다. 그 이외의 경우는 모두 상속의 대상이 된다

상속을 이용하면 클래스의 수정을 최소화 시킬 수 있다. 부모 클래스의 수정으로 모든 자식 클래스들의 수정 효과를 가져오기 때문에 유지 보수 시간을 최소화시켜준다

B.b = new B();
b.fiels1=100;
b.method1();

b.field2="nov";
b.method2();

 

<클래스 상속>

프로그램에서 상속은 자식 클래스가 부모를 선택한다. 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지를 결정하고 선택된 부모 클래스는 extends뒤에 기술한다

class 자식클래스 extends 부모클래스{
필드
생성자
메소드
}


class SUV extends Car{}

- 자바는 다른 언어와 달리 다중 상속을 허용하지 않는다

 

<부모생성자 호출>

자식 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체는 그다음에 생성된다

자식클래스(매개변수);{
super(매개값);
}

 

//부모 클래스
public class Car{
public String model;
public String sn;

public Car(String mode, String sn){
this.modes=mode;
this.sn=sn;
}
//자식 클래스
public class SUV extends Car{
public int SUVno;

public SUV(String model, String sn, int SUVno){
super(model, sn);
this.SUVno=SUVno;
}
}

 

 

메서드

부모 클래스의 모든 메서드가 지식 클래스에 맞게 설계되어 있다면 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다. 이러한 경우 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야 한다

 

<@override 메소드 재정의>

메소드 오버라이딩은 상속된 메서드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메서드를 재정의 하는 것이다. 

 

<규칙>

  • 부모의 메서드와 동일한 리턴타입, 메서드이름, 매개변수 리스트를 가져야 한다
  • 접근 제한을 더 강하게 오버라이딩 할 수 없다
  • 새로운 exception을 throw 할 수 없다

접근 제한을 더 강하게 오버라이딩 할 수 없다는 것은 부모 메서드가 public 접근 제한을 가지고 있을 경우 오버라이딩하는 자식 메소드는 default나 public 접근 제한으로 수정할 수 없다는 의미이다. 단 반대는 가능하다

부모 메소드가 default 접근 제한을 가지면 재정의 되는 자식 메소드는 default 또는 public 접근 제한을 가질 수 있다. 

 

<super 부모 메소드 호출>

자식 클래스에서 부모 클래스의 메서드를 오버라이딩하게 되면, 부모 클래스의 메소드는 숨겨지고 오버라이딩 된 자식 메소드만 사용된다. 그러나 자식 클래스 내부에서 오버라이딩 된 부모 클래스의 메소드를 호출해야 하는 상황이 발생하면 super 키워드를 붙여서 부모 메소드를 호출할 수 있다. 

super.부모 메소드()

super.jet();

 

<final 메서드>

메서드를 선언할 때 final 키워드를 붙이면 이 메서드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다. 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다

 


타입변환, 다형성

다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 코드 측면에서 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다. 다형성을 위해 자바는 부모 클래스로 타입 변환을 허용한다. 부모 타입에도 모든 자식 객체가 대입될 수 있다. 

타입변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 행위를 말한다. 클래스 타입의 변환은 상속 관계에 있는 클래스 사이에서 발생한다. 자식 타입은 부모 타입으로 자동 타입변환이 가능하다

 

<자동 타입변환>

부모 타입으로 자동 타입변환된 이후에는 부모 클래스에 선언된 필드와 메서드만 접근이 가능하다. 변수는 자식 객체를 참조하지만 변수로 접근이 가능한 멤버는 부모 클래스 멤버로만 한정된다. 

메서드가 자식 클래스에서 오버라이딩 되었다면 자식 클래스의 메소드가 대신 호출된다. 

 

<필드의 다형성>

다형성이란 동일한 타입을 사용하지만 다양한 결과가 나오는 성질이다. 주로 필드의 값을 다양화 함으로써 실행 결과가 다르게 나오도록 구현하는데 필드 타입은 변함이 없지만 실행 도중에 어떤 객체를 필드로 저장하는지에 따라 결과가 달라질 수 있다.

 

<매개 변수의 다형성>

자동 타입변환은 필드의 값을 대입할 때에도 발생하지만 주로 메서드를 호출할 때 많이 발생한다. 

매개변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다. 

 


추상 클래스

객체를 직접 생성할 수 없는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있으며 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고 추가적인 특성을 가질 수 있다.

class Suv extends Car{}
public abstarct class 클래스{
필드
생성자
메소드
}

 

<추상 클래스의 목적>

  • 실체 클래스들의 공통된 필드와 메서드의 이름을 통일할 목적
  • 실체 클래스를 작성할 때 시간 절약 목적

 

<추상 메서드>

추상 메서드는 추상 클래스에서만 선언할 수 있다. 메소드의 선언부만 있고 메소드 실행 내용인 중괄호가 없는 메서드를 말한다.

[public | protected] abstract 리턴타입 메소드명(매개변수);

public abstract class Car{}	//추상 클래스

public abstract void engin() //추상 메소드
//추상메소드 재정의
@Override
public void engin(){
}