상속

수달·2021년 2월 24일
1

JAVA

목록 보기
1/2
post-thumbnail

오늘은 다형성을 할 수 있게 해주는 자바의 상속에 대해서 아래와 같은 순서로 정리한다.

자바의 상속에 대해서

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 추상 클래스
  • final 키워드
  • Object 클래스

상속

상속은 우리가 알고 있듯이 가지고 있는 재산을 자식에게 내려주는 것을 의미한다.
자바에서도 클래스와 클래스, 인터페이스와 클래스, 등등 상속이 가능하다.

상속의 특징

1) 부모 클래스와 자식 클래스는 자바 지정예약어 extends에 의하여 정해집니다.

2)하나의 부모 클래스는 여러개의 자식 클래스을 가질 수 있습니다.

3)반대로 하나의 클래스는 여러개의 클래스로부터 상속을 받을수는 없습니다.

4)부모 클래스로부터 상속받은 자식 클래스는 부모 클래스의 자원모두를 사용 할 수 있습니다.

5)반대로 부모클래스는 자식클래스의 자원을 가져다 쓸 수는 없습니다.

6)자식클래스는 또다른 클래스의 부모 클래스가 될 수 있습니다. 

7)자식클래스는 부모클래스로부터 물려받은 자원을 override 하여 수정해서 사용 할 수 있습니다.

8) 부모클래스가 상속받은 자원도 자식클래스가 사용 가능합니다
public class Car{
  private String 연비;
  public int 속도;
  
}

public class  Avante extends Car {
	private int 기름양;
  // 연비는 상속받지 못했지만, 속도는 상속받음, 그리고 기름양 이라는 필드까지 있음.
}

super 키워드

부모에게 재산을 상속 받고싶은 수진이가 있다. 수진이가 재산을 가지기 위해서는 누가 먼저 필요하나?
부모가 먼저 필요하다. 

따라서 클래스도 상속을 받게 되면

1) 부모클래스 객체 생성
2) 자식클래스 객체 생성

순으로 생성된다. 객체가 생성 될 때는 제일 먼저 클래스 안에 있는 생성자가 호출된다.
위에 말은 1) 부모생성자, 2)자식 생성자의 호출이 이뤄진다는 것이다.

생성자

클래스 내에 필드들을 초기화(값을 지정) 해주는 역할. 위에서 Car에 (속도)가 있다.
속도가 몇인지 지정해줘야하지 않는가? 그런데 운전자마다 선호하는 속도가 다를 수도 있으니
객체를 만들 때 속도가 몇인지 지정해주면 좋겠다. 그래서 생성자가 필요하다.

맨 처음 객체를 만들면, 기본 생성자가 자동으로 만들어진다. 이 생성자는 값도 없고 아무것도 없다.

나는 속도 값을 넣고 싶다. 그러면 이 기능을 수행하는 생성자를 만들면 된다.

public class Car{
  private String 연비;
  public int 속도;
  
  public Car(String 연비, int 속도){
  	this.연비 = 연비;
  	this.속도 = 속도;
}

그런데 이 부모 객체를 자식이 상속 받았다면, 이 생성자를 어떻게 부르는가.

자식이 부모차를 상속 받았다. 자동차는 타다보면 고장이 나거나 사용자에 맞춰지기 때문에
기본 값과 다를 수 있다. 근데 이 차가 속도가 얼마큼까지 괜찮은지, 연비는 어떻게 되는지 
어떻게 아는가. 그럴 때 우리가 하는 것은? 

엄마 ~~!!

슈퍼맨(우먼) 인 엄마 아빠를 부른다. 그래 자식 객체도 엄마를 부르게 해주자 . 그게 바로 super 이다.
public class Car{
  private String 연비;
  public int 속도;
  
    public Car(String 연비, int 속도){
  		this.연비 = 연비;
  		this.속도 = 속도;
}
  
}

public class  ChCar extends Car {
	private int 기름양;
  	public ChCar(int 기름양){
    	super();
        this.기름양 = 기름양;
}

super 를 사용하게 되면 부모의 생성자를 호출할 수 있게 된다. 자식 생성자에 추가해주자

메소드 오버라이딩

부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하여 사용하는 것이다.

자동차는 내 눈높이에 맞춰서 사이드 미러도 조절하고, 핸들에 높이도 조절해야한다. 
그런데 엄마가 주신 차는 엄마가 맞춰서 조정되어 있다. 이제 내 차니까 나에게 맞춰보자. 

오버라이딩의 조건 및 방법

자식 클래스에서 부모 클래스의 메소드를 재정의 하기 위해서는 조건을 지켜야 한다.

1) 부모 메소드의 이름, 리턴 타입, 매개변수의 갯수, 자료형과 순서를
동일하게 하여 자식 클래스에서 작성해야 한다.

2) 그리고 안에 코드를 원하는 대로 재정의한다.

부모 클래스의 메소드 Car

public class Car{
  private String 연비;
  public int 속도;
  
    public Car(String 연비, int 속도){
  		this.연비 = 연비;
  		this.속도 = 속도;
}
  
public void handle(int 높이, int 좌우 간격){
	if( 장거리 운전일 때)
    	중간 높이
    else (단거리 운전일 때)
}	낮게

자식 클래스의 메소드 ChCar

public class  ChCar extends Car {
	private int 기름양;
  	public ChCar(int 기름양){
    	super();
        this.기름양 = 기름양;
}
오버 라이드
public void handle(int 높이, int 좌우 간격){
	if( 장거리 운전일 때)
    	아주높게
    elseif (단거리 운전일 때)
	낮게
    else(운전하지 않을 때)
    빼놓는다.
    
}
    

잠깐.

근데 핸들은 모든 자동차에 있는 거잖아? 매번 이렇게 남이 쓰던걸 재정의 해야해?
모든 자동차에 있으니까 따로 빼서 쌔거 줘!!! .,

추상 클래스(메소드)

추상클래스는 여러개의 클래스에서 공통점(필드, 메서드)을 추출하여 만든 클래스이다.

다수의 개발자가 동일한 목적으로 클래스를 설계해도 같은 모양의 클래스가 나올 수 없다.
모든 사람의 핸들 위치가 같을 수 없는 것처럼 
그래서 추상클래스를 상속하여 통일성을 높여서 유지보수를 쉽게 할 수 있다.

추상클래스(메소드)는 반드시 abstract 키워드를 사용해야 한다.

public abstract class handle{

}
  

추상메서드는 코드가 구현되지않고 형식만 있는 메서드다
메서드의 반환타입, 이름, 매개변수가 필요하다.
public abstract void hello(String name, String message);

쌔거니까 나에게 맞추는 것은 필수겠죠? 추상 클래스(메소드) 는 상속받으면 
꼭 꼭 값을 재정의 해줘야 합니다.

final 키워드

final 클래스
final이 클래스 이름 앞에 사용되면 클래스를 상속받을 수 없음 을 지정한다.

final class FinalClass {
  ...
}
class DerivedClass extends FinalClass { // 컴파일 오류
  ...
}

FinalClass를 상속받아 DerivedClass를 만들 수 없다.
final 메서드
메서드 앞에 final 속성이 붙으면 이 메서드는 더 이상 오버라이딩할 수 없음 을 지정한다.

public class SuperClass {
  protected final int finalMethod() { ... }
}
class DerivedClass extends SuperClass { // SuperClass를 상속 받음
  protected int finalMethod() { ... } // 컴파일 오류
}

자식 클래스가 부모 클래스의 특정 메서드를 오버라이딩하지 못하게 하고 무조건 상속받아
사용하도록 하고자 한다면 final로 지정하면 된다.

Object 클래스

Object 클래스는 모든 클래스가 상속받는 최상위 클래스이다.

Object클래스가 들어있는 java.lang 패키지는 자동으로 import된다.

주로 toString(), equals() 등을 오버라이딩 한다.

profile
짜장면 쟁이

0개의 댓글