객체 지향의 상속
부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받음
상속의 장점
- 클래스의 간결화
- 클래스 관리 용이
- 소프트웨어 생산성 향상
public class Person{}
public class Student extends Person{} //Person 클래스 상속
public class StudentWorker extends Student{} //Student 클래스 상속
- 부모 클래스 -> 슈퍼클래스로 부름
- 자식 클래스 -> 서브클래스로 부름
- 확장할 떄 extends 키워드 사용
자바 상속의 특징
- 클래스의 다중 상속 지원하지 않음
- 상속 횟수 무제한
- 상속의 최상위 조상 클래스는 java.lang.Object 클래스
상속과 접근 지정자
public, protected, 디폴트, private
- 슈퍼 클래스의 private 멤버 : private 멤버는 다른 모든 클래스에 접근 불허
- 슈퍼 클래스의 디폴트 멤버 : 패키지내 모든 클래스에 접근 허용
- 슈퍼 클래스의 public 멤버 : 다른 모든 클래스에 접근 허용
- 슈퍼 클래스의 protected 멤버 : 같은 패키지, 다른 패키지의 있어도 서브 클래스는 접근 가능
서브 클래스 객체가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행되는가? 아니면 서브 클래스의 생성자만 실행되는가?
둘 다 실행된다
서브 클래스의 생성자와 슈퍼클래스의 생성자 중 누가 먼저 실행되는가?
슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자 실행
new에 의해 서브 클래스의 객체가 생성될 때
- 슈퍼클래스 생성자와 서브 클래스 생성자 모두 실행
- 호출 순서 : 서브클래스부터 먼저 호출, 슈퍼로 올라감
- 실행 순서 : 슈퍼클래스부터 먼저 실행, 서브로 내려감
super()
- 서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출
- super(parameter)
- 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야함
업캐스팅
서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환
class Person{..}
class Student extends Person{..}
Student s = new Student();
Person p = s; //업캐스팅, 자동 타입 변환
업캐스팅된 레퍼런스 ==> 객체 내에 슈퍼 클래스의 멤버만 접근 가능
다운캐스팅
- 슈퍼 클래스 객체를 서브 클래스 타입으로 변환
- 개발자의 명시적 타입 변환 필요
class Person{ ... }
class Student extends Person { ... }
Person p = new Student("양원준"); //업캐스팅
Student s = (Student)p; //다운캐스팅, (Student)의 타입 변환 표시 필요
업캐스팅된 레퍼런스로 객체의 타입 판단이 어려움 => 왜? 슈퍼 클래스는 여러 서브 클래스가 존재
그래서 나온게
instanceof 연산자
레퍼런스가 가리키는 객체의 타입 식별을 위해 사용
객체레퍼런스 instanceof 클래스 타입
==> 결과 : true/false
메소드 오버라이딩
- 슈퍼클래스의 메소드를 서브클래스에서 재정의
- 슈퍼클래스 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입 등 모든 것 동일 == 덮어쓰기
- 동적바인딩 발생
동적바인딩? 서브 클래스에 오버라이딩된 메소드가 무조건 실행되는 것실행할 메소드를 실행 시에 결정
오버라이딩은
==> 상속을 통해 하나의 인터페이스에 서로 다른 내용 구현이라는 객체 지향의 다형성 실현
==> 실행 시간 다형성 실현, 동적 바인딩을 통해 <-> 오버로딩은 컴파일 타임 다형성 실현
오버라이딩과 super 키워드
- super는 슈퍼 클래스의 멤버를 접근할 때 사용되는 레퍼런스
- 서브클래스에서만 사용
- 슈퍼클래스의 메소드 호출
- 컴파일러는 super의 접근을 정적 바인딩으로 처리
정적바인딩?
실행 이전에 값이 확정되는 것
오버라이딩 vs 오버로딩
추상 메소드
- 선언되어 있으나 구현되어 있지 않은 메소드 abstract 로 선언
- 추상 메소드는 서브 클래스에서 오버라이딩하여 구현해야 함 @Override
- 여러 객체에 공통되는 사항을 추출하여 부모 클래스에 선언 및 구현을 하고 자식 클래스에는 특징을 구현하여 기능을 확장한다. 상속의 개념과 동일하지만, 표준화의 정도를 올려준다
추상 메서드를 선언하는 이유
설계자가 특정 메서드를 각 클래스 별로 재 구현을 원하지만 부모 클래스에서 일반 메서드로 구현하면 자식 클래스에서 구현을 하지 않는 경우가 발생할 수 있다. 이런 메서드를 추상 메서드로 선언하면 자식 클래스는 재 구현을 강요받는다
추상 클래스 2가지
1) 추상 메소드를 하나라도 가진 클래스
//1. 추상 메소드를 포함하는 추상 클래스
abstract class Shape{ //추상 클래스 선언
public Shape() {}
public void paint() { draw(); }
abstaract public void draw(); //추상 메소드
}
2) 추상 메소드 없는 추상 클래스
//2. 추상 메소드 없는 추상 클래스
abstract class MyComponent { // 추상 클래스 선언
String name;
public void load(String name) {
this.name = name;
}
}
추상 클래스는 객체를 생성할 수 없다
인터페이스
- 클래스가 구현해야 할 메소드들이 선언되는 추상형
- ex) 가이드 라인
- 필드(멤버 변수) 선언 불가
인터페이스는 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스 규격 선언, 클래스의 다형성을 실현하는 도구이다
인터페이스 구성 요소
상수 : public만 허용, public static fianl 생략
추상 메소드 : public abstact 생략 가능
dafault 메소드 : 인터페이스에 코드가 작성된 메소드, 구현하는 클래스에 자동 상속
private 메소드 : 인터페이스 내에 메소드 코드가 작성되어야 함
static 메소드 : public, private 모두 지정 가능, 생략하면 public
인터페이스는
- 객체 생성 불가
- 인터페이스 구현하면 상속받는 클래스는 인터페이스의 모든 추상 메소드 반드시 구현
- 다른 인터페이스 상속 가능
- 인터페이스의 다중 상속 가능
추상 클래스와 인터페이스 비교
유사점
객체 생성 불가, 상속을 위한 슈퍼 클래스로만 사용
클래스의 다형성을 실현하기 위한 목적
다른점
'Backend > java' 카테고리의 다른 글
[JAVA] 자바란? (0) | 2022.09.26 |
---|