2022-01-13 상속

GGAE99·2022년 1월 13일
0

진도

목록 보기
6/43

상속

상속은 다른 클래스가 가지고있는 멤버(변수와 메소드)들을 새로 작성할 클래스에 직접 만들지 않고, 상속받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능을 말한다.

상속의 목적으로는 클래스의 재사용, 연관된 일련 클래스들에 대해 공통적인 규약을 정의하는 것 이다.

public class Parents{
    private int num;
    private String str;
    public void test{
    
    }
}//부모 클래스

이렇게 클래스를 생성하고 이를 다른 클래스의 부모 클래스로서 상속할 수 있다.
extends라는 키워드를 사용하여, 클래스를 상속 가능하다.

public class Child extends Parents{
    private int num2;
    private double kong;
}//후손 클래스

Child클래스에 Parents클래스를 상속한 상태이다. 이제 Child 클래스에서 Parents클래스의 변수, 메소드들을 따로 작성하지 않아도 사용할 수 있다.

public class Child extends Parents{
    private int num2;
    private double kong;
    
    test();
}

이런식으로 별도의 import과정과 클래스에서 가져온다는 표시 없이, 바로 Parents 클래스의 test메소드를 가져와서 사용할 수 있는 것 이다. 하지만, int형 변수 num과 String형 변수 str을 private로 선언되어있기 때문에, 상속되었더라도 getter, setter 메소드를 만들어 사용하지 않으면 접근할 수 없다. 이 내용은 객체에서 접근제어지시자를 설명할 때 설명한 바 있다.

오해하면 안되는 부분이 있다. 위의 상속된 코드는

public class Child extends Parents{
    private int num
    String str
    private int num2;
    private double kong;
    public void test{
    
    }
}    

이렇게 나오는게 아니다. 상속된 건 맞지만, 변수나 메소드를 그대로 가져와서 적어주는 것이 아니다.

상속의 장점

상속을 안하면서 코드를 작성하는 것은 힘들 것 이다. 상속의 장점을 알아보자

  1. 보다 적은양의 코드로 새로운 클래스를 작성 가능하다.
  2. 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경이 용이하다.
  3. 코드 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

단일상속과 다중상속

단일상속은

  1. 클래스 작성 시 한 개의 클래스만 상속하는 것 이다.
  2. 명확하고 신뢰성 있는 코드가 작성가능하다.

와 같이 설명할 수 있겠다.

다중상속은

  1. 클래스 작성 시 여러 클래스로부터 상속을 받는 것 이다.
  2. 복합적인 기능을 가진 클래스를 쉽게 작성 가능하다.
  3. 서로 다른 클래스로 상속받은 멤버 간의 이름이 같은 경우에는 문제가 발생한다.

와 같이 설명할 수 있다. 타언어에서는 다중상속이 가능하지만 자바에서는 단일상속만을 지원한다.

그렇지만 다중상속을 비슷하게 따라할 수 있다.

public class Parents{
    private int num;
    private String str;
    public void test{
    
    }
}//부모 클래스

public class Child extends Parents{
    private int num2;
    private double kong;
}//후손 클래스

public class Child2 extends Child{
    private int num2;
    private double kong;
}//후손 클래스의 후손 클래스

위와 같이 Parents클래스를 상속받은 Child클래스를 Child2클래스가 상속을 받으면, Parents클래스의 내용도 같이 상속을 받게되는 것 이다.

상속의 특징

중요한 부분이다. 상속의 특징은 다음과 같이 정리할 수 있다.

  1. 부모클래스의 생성자는 상속 안된다.
  • 자식클래스 객체 생성 시, 부모클래스 생성자가 먼저 실행(자동)
  • 자식클래스 생성자 안에서 부모클래스 생성자 호출을 명시하기 위해
    서는 super() 활용
  1. 부모의 private 멤버는 상속은 되지만 직접 접근이 불가하다.
  • 접근제어지시자 private는 해당 클래스에서만 접근이 가능하므로, 자
    식클래스에서도 변수에 접근이 불가능
  • private변수의 초기화는 super()를 이용하여 부모생성자를 통해진행
  • getter, setter 메소드를 이용하여서 접근 가능
  1. 모든 클래스는 Object클래스의 후손이다.
  • 클래스 작성 시 아무 클래스도 상속하지 않으면 자동으로 Object클래
    스를 상속함
  • 다른 클래스를 상속했더라도 이미 부모클래스가 Object클래스를 상속
    했기 때문에 모든 클래스는 Object클래스의 후손

이 부분의 내용은 숙지하는편이 나한테 좋을 것 같아서 중요하다고 해놨다. 위에 super()라는 메소드로 부모객체의 생성자를 호출한다고 되어있는데 이 부분을 한번 알아보자

super()

super()은 부모객체의 생성자를 호출하는 메소드이다. 기본적으로 자식객체에서는 부모객체를 생성했을 때 처럼 자동으로 생성자를 호출해주지않기 때문에 따로 생성자를 만들어주어야한다.

public class Child extends Parents{
	public Child(){
  	    super();
	}
   	private int num2
        private double kong;
}

와 같은 형태로 생성자를 만들어주고, super()메소드로 부모객체의 생성자를 호출해 주는 것 이다.

public class Parents{
    private int num;
    private String str;
    
    public Parents(){
    
    }//기본 생성자
    
    public Parents(int num, String str){
    	this.num = num;
        this.str = str;
    }
    
    public void test{
    
    }
}

부모 클래스에서 이렇게 매개변수가 존재하는 생성자를 만들어주었다면,

public class Child extends Parents{
	public Child(){
  	    super();
	}
        public Child(int num, String str){
        	super(num,str);
        }
}

와 같이 super(매개변수);를 통해 매개변수가 있는 생성자를 호출해 줄 수 있다.
super() 메소드는 항상 자식객체의 생성자보다 먼저 실행되어야하기 때문에 자식객체 생성자의 맨 앞줄에만 사용이 가능하다.

그럼 이제 부모클래스의 메소드를 자식클래스가 수정해서 사용하고 싶을 때, 어떻게 하는지 알아보자.

Overridng (오버 라이딩)

오버 라이딩은

  • 자식 클래스가 상속받은 부모 메소드를 재작성하는 것
  • 부모가 제공하는 기능을 후손이 일부 고쳐서 사용하겠다는 의미
  • 자식객체를 통한 실행 시 후손의 것이 우선권을 가짐(동적 바인딩)

과 같이 그 특징을 정리할 수 있다.

이 overriding을 할때, Anootation이라는 주석문을 달아놓는 것이 좋은데, 이는 @를 통해 사용할 수 있다.

@Override
public void testMethod(){
}

위와 같은 형태로 사용하는 것 이다. 사실 안해줘도 상관이 없지만, 사용해준다면 컴파일러가 내가 상속클래스의 메소드를 수정하는 것이 아닌, 새 메소드를 사용하는데 수정한다고 해놓는 것을 막아준다. 이게 말을 너무 이상하게 했는데 어떤 의미냐하면

public class Child extends Parents{
	@Override
	public void ~~testMethod~~(){
	}
}

이 상황에서 testMethod()라는 메소드가 부모객체에 존재하지 않으면, testMethod에 오류 메세지가 뜬다. 편리하기도 하고, 나중에 코드 알아보기도 편하니까 사용해주는 것이 좋겠다.

오버 라이딩의 성립조건

오버 라이딩의 성립 조건은 다음과 같다.

일단 부모클래스의 메소드와 자식클래스의 메소드 비교한다.
1. 메소드의 이름이 동일해야 한다.
2. 매개변수의 개수와 타입이 동일해야 한다.
3. 리턴 타입이 동일해야 한다.
4. private메소드의 오버라이딩이 불가능하다.
5. 접근제어 지시자는 수정이 가능하지만 부모의 것보다 같거나 넓은 범위
로 가능하다.(default → public으로 가능, public → private 불가능)

이것으로 오늘의 포스팅은 마치겠다!

0개의 댓글