기록하는 개발자

자바 #1 상속 본문

JAVA

자바 #1 상속

밍맹030 2020. 1. 4. 20:54
728x90

<상속>

#상속이란?

부모 클래스 : super class    |    자식 클래스 : sub class

 

-extends 키워드 사용 : 슈퍼 클래스를 확장한다는 개념. 

ex) class A extends B --> 클래스 A가 클래스 B를 상속 받는다.

여기서 B가 슈퍼(부모)클래스, A가 자식(서브)클래스

 

-다중 상속은 지원하지 않음    ex) class A extends B,C --> (X)

-단, 상속 횟수는 무제한

-상속 시, 슈퍼 클래스에 protect로 선언된 멤버는 다른 패키지에 있어도 서브 클래스에서 접근 가능

-슈퍼 클래스에서 private으로 선언된 멤버는 상속 되어도 접근 불가능하다.

-상속은 자원의 재사용성을 높이므로 중요한 기능이다.

 

*new 에 의해 서브 클래스의 객체가 생성될 때 호출과 실행 순서

서브 c 생성자 호출 --> 슈퍼 c 생성자 호출 --> 슈퍼 c 생성자 실행 --> 서브 c 생성자 실행

 

*super(parameter)

-사용할 시에 무조건 서브 클래스의 생성자 가장 처음에 와야한다.

-Super를 이용하여 따로 생성자를 호출하지 않으면 B에서 기본 생성자 호출됨 --> 기본 생성자가 이 때 없다면 에러 발생

 

#업캐스팅

-서브 클래스 객체를 슈퍼 클래스 타입으로 변환

-객체 내에 슈퍼 클래스의 멤버만 접근 가능 --> 서브 클래스에 추가로 생성된 정보(멤버, 메소드)에 접근 불가능

 

#다운 캐스팅

-슈퍼 클래스 객체를 서브 클래스 타입으로 변환

-개발자가 명시적으로 변환 --> 괄호 사용

 

 

*instance of

-super 클래스를 상속 하는 서브 클래스는 한 개 이상이므로 여러 서브 클래스 중 어떤 것이 슈퍼 클래스 타입으로 변환되었는지 식별하기 위해 instanceof 연산자 사용

--> 객체 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용

-연산 결과 값은 true/false

 

#메소드 오버라이딩

같은 메소드를 쓰며 파라미터를 변경하지 않고 메소드 내의 내용을 수정할 때 사용(==다형성 실현)

 

-슈퍼 클래스의 메소드를 서브 클래스에서 재정의

-슈퍼 클래스 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입 등 모든 것 동일하게 작성

-메소드 무시하기, 덮어쓰기로 번역되기도 한다.

-동적 바인딩 발생

(동적바인딩 : 해당 메소드를 호출하면 슈퍼 클래스의 메소드는 실행되지 않고 서브 클래스에 오버라이딩 메소드가 무조건 실행된다.)

<오버라이딩 후 동적 바인딩 발생 예>

 목적

-상속을 통해 하나의 인터페이스로 서로 다른 내용 구현이라는 다형성 실현

-오버라이딩은 실행시간 다형성 실현(실행 중에 다형성) / 오버로딩은 컴파일 타임 다형성 실현

 

#오버라이딩과 super 키워드

-서브 클래스에서 슈퍼 클래스의 함수 draw() 를 오버라이딩 하면,

이를 사용할 때마다 동적 바인딩이 발생하여 오버라이딩 된 함수가 실행된다.

이 때, 만약 서브 클래스에서 오버라이딩 이전의 함수인

슈퍼 클래스의 함수 draw()를 사용하고 싶다면 super.draw() 를 사용한다.

 

 특징

-서브 클래스에서만 사용

-super 클래스의 메소드 호출

-컴파일러는 super의 접근을 정적 바인딩으로 처리

<정적 바인딩과 동적 바인딩 예시>

위 코드에서 main부의 실행 순서

1. 서브 클래스 Circle 객체를 Shape b로 업캐스팅 하여 생성

2. b.paint()로 메소드 호출

3. 상속 받은 메소드 paint 호출

4. paint 메소드가 draw() 호출하면 자동으로 동적 바인딩 실행

5. 서브 클래스의 draw메소드 실행

6. super 키워드 사용으로 슈퍼 클래스의 이름 지정에서 정적 바인딩 발생

7. 슈퍼 클래스의 draw() 메소드 실행 -> 정적 바인딩 발생, 슈퍼 클래스의 name으로 지정된 Shape 출력

8. 다시 서브 클래스의 draw 메소드로 돌아와 name 출력     |    출력 결과 : Circle

 

<추상 메소드와 추상 클래스>

-선언되어 있으나 구현되어 있지 않은 메소드, abstract로 선언한다.

-추상 메소드는 서브 클래스에서 오버라이딩 하여 구현해야 함

-추상 메소드를 하나라도 가지면 abstract로 선언해야 함

-추상 메소드가 하나도 없지만 abstract로 선언할 수 있음

 

 특징

-객체 생성 불가능

-상속 후 추상 메소드를 구현하지 않으면 서브 클래스도 추상 클래스가 된다. --> 서브 클래스도 abstract로 선언해야 함

-상속 후 추상 메소드를 구현하면서 상속 받으면 이 서브 클래스는 추상 클래스가 아니다.  --> 서브 클래스에서 추상 메소드 오버라이딩 가능

 

 용도

-설계와 구현을 분리한다.(설계는 abstract로 선언, 구현은 따로)

-계층적 상속 관계를 갖는 클래스 구조를 만들 때 유용

728x90

'JAVA' 카테고리의 다른 글

자바 #6 이벤트 처리  (0) 2020.01.05
자바 #5 JAVA GUI  (0) 2020.01.05
자바 #4 컬렉션  (0) 2020.01.05
자바 #3 모듈과 패키지  (0) 2020.01.04
자바 #2 인터페이스  (0) 2020.01.04