Backend/java

[JAVA] 상속

양원준 2022. 10. 25. 03:50
728x90

객체 지향의 상속

부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받음

 

상속의 장점

  • 클래스의 간결화
  • 클래스 관리 용이
  • 소프트웨어 생산성 향상
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

 

인터페이스는

  • 객체 생성 불가
  • 인터페이스 구현하면 상속받는 클래스는 인터페이스의 모든 추상 메소드 반드시 구현
  • 다른 인터페이스 상속 가능
  • 인터페이스의 다중 상속 가능

 


추상 클래스와 인터페이스 비교

유사점

객체 생성 불가, 상속을 위한 슈퍼 클래스로만 사용

클래스의 다형성을 실현하기 위한 목적

 

다른점

 

 

728x90

'Backend > java' 카테고리의 다른 글

[JAVA] 자바란?  (0) 2022.09.26