Lune Bleue 2019. 12. 17. 01:12

1. 상속이란

다른 클래스가 가지고있는 맴버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능(단 final 클래스는 상속이 불가능하다.)

 

2. 상속의 목적

1)클래스의 재사용

2)연관된 일련의 클래스들에 대한 공통적인 규약 정의

  -> 장점: ㄱ)보다 적은 양의 코드로 새로운 클래스 작성가능

              ㄴ)코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경용의

              ㄷ) 코드의 중복을 제거하여 프로그램의 생산성/유지보수의 크게 기여

 

ex) 사람    ◁ㅡ    강사 (강사는 사람을 상속한다)
     먹다
     자다
                      가르치다
     놀다(추가)
                      (강사는 사람에 추가된 놀다도 가지게 된다.)

 

 

3. 상속의 특징

1) JAVA의 모든 클래스는 Object클래스의 후손

-> Object의 모든 기능을 오버라이딩하여 재구현 가능

 

2) 부모 클래스의 생성자, 초기화 블록은 상속안됨 

-> 부모클래스의 생성자를 사용하고 싶을시 자식 클래스의 생성자에 super();활용

 

3) 부모의 private 맴버는 상속은되지만 직접 접근 불가.

->super()를 사용하여 부모필드로 넘겨 생성하거나 getter/setter 활용

 

4.방법

클래스간의 상속시 extends 사용

접근제한자 class 클래스명 extends 상속할 클래스명{

   --> 부모에 있는 생성자및 메소드를 가진 상태다.

}

 

생성자에 super()사용법

public 클래스명(자료형 변수명1, 자료형 변수명2, 자료형 변수명3){ --> 변수1,변수2는 부모에서 정의된 속성으로

                                                                             두 개의 속성을 매개변수로 쓰는 생성자가 존재한다고 가정

  super(변수명1, 변수명2);

  this변수 =변수명3;

}

 

super() -> 부모생성자를 호출하는 메소드, 자식 클래스는 객체 생성시 부모부터 생성되기 때문에 자손 클래스안에는 부모 생성자를 호출하는 super()가 반드시 존재(기본생성자 안에는 JVM이 만들어줌).

자손클래스의 매개변수 생성자에서 부모의 필드를 쓸 시 반드시 첫줄에 존재해야한다.

 

super. -> 상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 참조변수로 자식 클래스 내에서 부모 클래스 객체에 접근하여 필드(private 필드는 불가)나 메소드 호출 시 사용.

 

 

5.is a/ has a

is a(상속 관계) : 자바내에서 결합관계 최상 
 -> 부모에서 변경시 에러가 나는 것이 아닌 자손도 변경되서 적용 : 의존도가 높다 : 결합관계가 최상
 
has a(포함 관계) : 한 클래스의 맴버 변수로 다른 클래스 타입의 참조변수 선언 
 클래스1                                       클래스2
속성1                        <ㅡ private 클래스1 객체명 = new 클래스1(); -> 속성값으로 다른 클래스객체를 가지고있다.
속성1                                           속성1

is a has a차이
is a : 자식클래스는 부모클래스를 내포하고 있다 (자식클래스는 하나의 부모클래스라고 할 수 있다)
has a : 클래스2는 단순히 클래스1을 객체로 만들어 기능을 가지고있다. (상속이 아닌 단순히 외부에서 가져오는 것)

 

 

6.오버라이딩

부모가 가진 메소드를 일부 고쳐서(재정의) 하여 사용 하는것. 사용 방법은 다음과 같다

1. 접근제한자는 부모 메소드의 접근제한자와 같거나 더 넓은 범위로 해야 한다.

   (단 private는 접근 불가, final은 변경이 불가능하다.)

2. 메소드명과 반환형의 자료형은 같아야한다.

3. 매개변수의 개수, 타입 은 같아한다.

4. 예외처리는 부모클래스보다 더 좁은 범위로 해야 한다.

 

오버라이딩은 메소드 위에 @Override 또는 Annotation 을 표시

 

7. 오버라이딩과 오버로딩의 차이

오버로딩 오버라이딩
같은 클래스에서 메소드 정의 하위 클래스에서 메소드 정의

메소드이름동일

매개변수 다름

(개수, 타입, 다른타입간의 위치)

리턴 타입상관없음

메소드 이름동일

매개변수 같음

리턴타입 동일

 접근제한자 상관없음

접근제한자가 같거나

더 넓은 범위

예외처리와 상관없음

부모 메소드보다 수가 적거나 

범위가 좁아야함