개발/Spring

자바 상속

728x90

확장을 하면 부모 클래스에 선언되어 있는 public protected로 선언되어 있는 모든 변수와 메소드를 내가 갖고 있는 것처럼 사용할 수 있다.

 

즉 다른 패키지에 선언된 부모 클래스의 접근 제어자가 없거나 privat로 선언된 것들은 자식 클래스에서 사용할 수 없다.

 

하나를 제대로 만들어 놓고 그것에서 파생되는 것들을 조금씩 바꾸어 판매하면 사용자는 기호에 따라 여러 모델을 살 수 있을 것이다.

 

자바에서의 상속도 비슷한 개념이다.

 

 

 

 

 

 

상속과 생성자

부모 클래스에서는 기본  생성자를 만들어 놓는 것 이외에는 상속을 ㅜ이해서 아무런 작업을 할 필요는 없다

매개변수가 있는 생성자를 만들었을 때 기본 생성자는 자동으로 만들어지지 않는다.

부모 클래스에 매개변수가 없는 기본 생성자를 만든다. 자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정하는 super를 사용한다.

super는 부모 클래스의 생성자를 호출한다는 것을 의미한다. 

 

super()를 사용하여 생성자를 호출할 때에는 모호하게 ㅜUll을 넘기는 것보다 호출하고자 하는 생성자의 기본 타입을 넘겨주는 것이 좋다.

 

자바는 부모의 매개변수가 없는 기본 생성자를 찾는 것이 기본이다. 그래서 부모 클래스에 매개 변수가 있는 생성자만 있을 경우에는 super()를 이용해서 부모 생성자를 꼭 호출해야만 한다.

 

자식 클래스의 생성자에서 super()를 명시적으로 지정하지 않는다면 컴파일시 자동으로 super()가 추가된다.

그리고 부모 클래스의 생성자를 호출하는 super()는 반드시 자식 클래스의 생성자에 첫 줄에 선언되어야만 한다.

 

 

 

 

메소드 오버라이딩

 

부모의 기능은 자식이 모두 포함한다고 볼 수 있다.

 

부모 클래스에 선언되어 있는 메소드와 동일한 메소드를 자식 클래스에서 선언해서 사용할 수 있을까 당연히 가능하다.

 

부모 클래스에 선언되어 있는 메소드와 동일하게 선언되어 이쓴ㄴ 메소드를 자식 클래스에 선언하면 자식 클래스의 메소드만 실행된다. 생성자의 경우 자동으로 부모 클래스에 있는 생성자를 호출하는 super()가 추가되지만, 메소드는 오버라이드 된다.

 

동일하게 선언되어 있다는 것은 동일한 시그니처를 가진다고도 표현한다.

 

 

접근 제어자 권한이 확대되는 것은 문제가 되지 않지만, 축소되는 것은 문제가 된다.

 

즉 public > protected > pascage-private > private의 순인데

 

부모가 public, 자식이 private은 불가능하다.

 

 

오버라이드에 대해 정리해보면

 

메소드 오버라이딩은 부모 클래스의 메소드와 동일한 시그니처를 갖는 자식 클래스의 메소드가 존재할 때 성립된다

오버라이딩된 메소드는 부모 클래스와 동일한 리턴타입을 가져야만 한다.

오버라이딩된 메소드의 접근 제어자는 부모 클래스에 있는 메소드와 달라도 되지만, 접근 권한이 확장 될때만 가능하다. 접근 권한이 축소되면 컴파일 에러가 발생한다.

 

 

 

 

참조 자료형의 형 변환

 

 

참조 자료형도 형 변환이 가능하다

자식 타입의 객체를 부모 타입으로 형 변환 하는 것은 자동으로 된다.

부모 타입의 객체를 자식 타입으로 형 변환을 할 대에는 명시적으로 타입을 지정해줘야 한다. 이 때 부모 타입의 실제 객체는 자식 타입이어야만 한다.

instarnceof 예약어를 통해서 객체의 타입을 확인할 수 있다. 타입을 확인할 대 부모 타입도 true라는 결과를 제공한다.

65

 

 

다형성 : 

 

형 변환을 하더라도 실제 호출되는 것은 원래 객체에 있는 메소드가 호출된다.

여러 가지 형태를 가질 수 있는 능력'을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록


 

 

자식 클래스에서 할 수 있는 것들

 

 

 

자식 클래스의 생성자가 호출되면 자동으로 부모 클래스의 매개 변수가 없는 기본 생성자가 호출된다. 명시적으로 super라고 지정할 수 있다.

 

부모 클래스의 생성자를 명시적으로 호출하려면 super()를 사용하면 된다

 

부모 클래스에 private로 선언된 변수를 제외한 모든 변수가 자신의 클래스에 선언된 것 처럼 사용할 수 있다.

 

부모 클래스에 선언된 변수와 동일한 이름을 가지는 변수를 선언할 수 있다. 

 

부모 클래스에 선언되어 있지 않는 이름의 변수를 선언할 수 있다.

 

 

 

변수처럼 부모 클래스에 선언된 메소드들이나 자신의 클래스에 선언된 것처럼 사용할 수 있다.

 

부모 클래스에 선언된 메소드와 동일한 시그니처를 사용함으로써 메소드를 오버라이딩 할 수 있다.

 

부모 클래스에 선언되어 있지 않은 이름의 새로운 메소드를 선언할 수 있다.

 

 

'개발 > Spring' 카테고리의 다른 글

JSP란  (0) 2021.04.07
자바 Object 클래스  (0) 2021.04.06
패키지와 접근 제어  (0) 2021.04.06
Serializable, NIO  (0) 2021.04.05
자바 참조 자료형  (0) 2021.04.05