05. 상속

PearLine_Zero·2023년 12월 8일

Java

목록 보기
5/7
post-thumbnail

5.1 상속의 개념

  • 객체 지향 언어에서의 상속은 부모 유전자를 자식이 물려 받는 유전자 상속과 유사.

✅ 상속의 필요성

  • 상속은 클래스 사이에 코드 중복을 제거하여 클래스를 간결하게 구현
  • 상속의 장점
    • 클래스 사이의 멤버 중복 선언 불피요 - 클래스 간결화
    • 클래스들의 계층적 분류로 클래스 관리 용이
    • 클래스 재사용과 확장을 통한 소프트웨어의 생산성 향상

5.2 클래스 상속과 객체

✅ 자바의 상속 선언

  • 자바에서는 extends 키워드를 이용하여 상속을 선언..
  • 자바에서는 상속하는 부모 클래스를 슈퍼클래스(super class) , 상속받는 자식 클래스를 서브클래스(sub class)라고 부름.
class point{
	int x, y;
}
class ColorPoint extends Point { //Point를 상속받는 ColorPoint 클래스 선언
	String color;
}

👉 상속 선언

  • Point를 상속받는 ColorPoint의 선언은 다음과 같음.
class ColorPoint extends Point {....}

👉 서브 클래스 객체 생성

  • Point 클래스의 객체 p와 ColorPoint 클래스의 객체 cp는 다음과 같이 생성
poinnt p = new Point();
ColorPoint cp = new ColorPoint(); // 서브 클래스 객체 생성.

👉 서브 클래스에서 슈퍼 클래스 멤버 접근

  • Point의 private 멤버이므로, ColorPoint클래스의 멤버들이 접근할 수 없음.
  • x , y는 set()과 showPoint()만 접근이 허용

✅ 자바 상속의 특징

  • 다중 상속을 지원하지 않음.
    • 자바는 C++과 달리 클래스를 여러 개 상속받는 다중상속을 지원하지 않음.
    • 하지만 뒤에서 다룰 인터페이스(interface)는 다중으로 상속받아 구현할 수 있음.
  • Object 클래스를 자동으로 상속 받도록 컴파일

5.3 protected 접근 지정

  • 자바 접근 지정자는 private , public, protected, 디폴트 4가지로 모든 멤버는 이 중 하나로 반드시 지정해야함.

✅ 슈퍼 클래스의 디폴트 멤버에 대한 서브 클래스의 접근

  • 접근 지정자가 선언되지 있지 않을 때, 디폴트 접근 시정이라 부르며, 슈퍼 클래스의 디폴트 멤버는 동일한 패키지에 있는 클래스들에게만 접근이 허용
  • 만일 서브 클래스가 슈퍼 클래스와 다른 패키지에 있다면, 슈퍼 클래스의 디폴트 멥버를 접근할 수 없음.

✅ protected 멤버

  • 같은 패키지에 속한 모든 클래스.
  • 상속되는 서브 클래스(같은 패키지든 다른 패키지든 상관 없음).

5.4 상속과 생성자

✅ 서브 클래스와 슈퍼 클래스의 생성자 호출 및 실행

  • 서브 클래스와 슈퍼 클래스 모두 생성자를 가지고 있음
  • 서브 클래스의 객체 생성시 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행.
  • 슈퍼 클래스의 생성자가 먼저 실행된 후 서브 클래스의 생성자가 실행.
c = new C();
  • 서브 클래스의 생성자가 먼저 호출되지만 결국 슈퍼 클래스의 생성자가 먼저 실행되고 서브 클래스의 생성자가 나중에 실행.

✅ 서브 클래스에서 슈퍼 클래스 생성자 선택

원칙적으로, 서브 클래스의 개발자가 서브 클래스의 각 생성자에 대해, 함께 실행할 슈퍼 클래스의 생성자를 지정함 그러나 슈퍼 클래스의 생성자를 명시적으로 지정하지 않으면, 컴파일러는 묵시적으로 슈퍼 클래스의 기본 생성자가 호출되도록 컴파일.

👉 슈퍼 클래스의 기본 생성자가 묵시적으로 선택

개발자의 명시적으로 지시가 없으면, 서브 클래스의 생성자가 기본 생성자이든 매개 변수를 가진 것이든, 슈퍼 클래스의 생성자로 기본 생성자가 선택

👉 super( )를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택

  • 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 선택하는 것이 원칙.
  • super( )를 이용하면, 서브 클래스의 생성자에게 슈퍼 클래스 생성자를 명시적으로 선택.
  • super( )는 슈퍼 클래스 생성자의 호출을 의미.
  • super( ) 호출은 반드시 생성자 첫 라인에 와야 함.
class A {
	public A( ) {
    	System.out.printf("생성자 A");
	}
    public A(int x) {
    	System.out.printf("매개변수생성자A" + x);
    }
}
class B extends A {
	public B( ) {
    	System.out.printf("생성자 B");
	}
    public B(int x) {
    	super(x); // 첫 줄에 와야함.
        System.out.printf("매개변수생성자B" + x);
    }
}
public class ConstructorEx4 {
	public static void main(string[]args) {
    	B b;
        b = new B(5);
	}   
}

5.5 업캐스팅과 instanceof 연산자

  • 캐스팅이란 타입변환을 말함. 자바에서 클래스에 대한 캐스팅은 업캐스팅다운캐스팅으로 나눔.

✅ 업캐스팅

  • 서브 클래스 객체가 슈퍼클래스 타입으로 변환되는 것을 업캐스팅이라함.
Person p;
Student s = new Student();
p = s; // 업캐스팅
  • student 클래스의 필드나 메소드는 접근할 수 없음.
  • 업캐스팅은 명시적으로 타입 변환을 하지 않아도 됨.

✅ 다운캐스팅

  • 업캐스팅된 것을 다시 원래대로 되돌리는 것은 다운캐스팅이라함.
person p = new Student("이재문"); // 업캐스팅
Student s = (Student)p; // 다운캐스팅, (Student)의 타입 변환을 반드시 지정.
  • 명시적으로 타입 변환을 지정해야 함.

✅ instanceof 연산자와 객체 구별

업캐스팅을 한 경우 레퍼런스가 가리키는 객체의 진짜 클래스 타입을 구분하기 어려움.

👉 instanceof 연산자 사용

  • 레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해, 자바에서는 instanceof 연산자를 두고 있음.
    객체레퍼런스 instanceof 클래스타입
  • '레퍼런스'가 가리키는 객체가 해당 ' 클래스 타입' 이먄 true , 아니면 false로 처리.
  • 클래스에만 적용됨.

5.6 메소드 오버라이딩

✅ 메소드 오버라이딩 개념

오버라이딩은 서브 클래스에서 슈퍼 클래스에서 슈퍼 클래스 선언된 메소드를 중복하여 슈퍼 클래스에 작성된 메소드를 무력화시키고, 객체의 주인 노릇을 하는 것.

class A {
	void f(){
    	System.out.printf('A의 f() 호출");
      }
    }
class B extends A {
	void f( )  { // A의 f()를 오버라이딩
    	System.out.printf('B의 f() 호출");
     }
  }

✅ 오버라이딩의 목적, 다형성 실현

  • 오버라이딩은 상속을 통해 '하나의 인터페이스(같은 이름)에 서로 다른 내용 구현'이라는 객체 지향의 다형성을 실현하는 도구.

✅ 동적 바인딩 사례

  • 동적 바인딩은 실행할 메소드를 컴파일 시에 결정하지 않고 실행 시에 결정되는 것을 말함.
  • 자바에서는 동적 바인딩을 통해 오버라이딩된 메소드가 항상 실행되도록 보장.

✅ 오버라이딩 super 키워드

  • 서브 클래스에서 super 키워드를 이용하면 정적 바인딩을 통해 슈퍼 클래스의 멤버에 접근

✅ 오버로딩 오버라이딩

  • 오버라이딩 슈퍼 클래스에 있는 메소드와 이름, 매개 변수 타입과 개수, 리턴 타입 등 모두 동일한 메소드가 서브 클래스에 재정의되었을 경우.
  • 오버로딩은 한 클래스나 상속 관계에 있는 클래스에 서로 매개 변수 타입인 ㅏ개수가 다른 여러개의 메소드가 같은 이름으로 작성되는 것을 지칭.
비교 요소메소드 오버로딩메소드 오버라이딩
선언같은 클래스나 상속 관계에서의 동일한 이름의 메소드 중복 작성서브 클래스에서의 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드 작성
관계동일한 클래스 내 혹은 상속관계상속관계
목적이름이 같은 여러개의 메소드를 중복 선언하여 사용의 편리성 향상슈퍼 클래스에 구현된 메소드를 무시하고 서브 클래스에서 새로운 기능의 메소드를 재정의
조건메소드 이름은 반드시 동일함. 메소드의 인자의 개수나 인자의 타입이 달라야 성립메서드 이름, 인자의 타입, 인자의 개수, 리턴 타입 등이 모두 동일해야 성립
바인딩정적바인딩 컴파일 시에 중복된 메소드 중 호출되는 메소드 결정동적 바인딩 실행 시간에 오버라이딩된 메소드 찾아 호출

5.7 추상 클래스

✅ 추상 메소드

추상메소드abstract키워드와 함께 원형만 선언되고, 코드는 작성되지 않은 메소드.

abstract public String getName(); // 추상 메소드
abstract public String fail (); { return "Good Bye";} // 추상 메소드 아님. 컴파일 오류

✅ 추상 클래스 선언

추상클래스는 abstract로 선언한 클래스로서, 다음과 같이 두 가지로 경우가 있음

  • 추상 메소드를 최소 한 개 이상 가지고 abstract로 선언된 클래스.
  • 추상 메소드가 없어도 abstract로 선언한 클래스.

추상 메소드를 가지고 있으면 반드시 추상 클래스로 선언해야함.

✅ 추상 클래스의 인스턴스를 생성할 수 없다.

추상 클래스의 인스턴스를 생성할 수 없음.

✅ 추상 클래스 상속과 구현

👉 추상 클래스의 상속

서브 크래스와 abstract를 붙여 추상 클래스임을 명시해야함.

abstract class A { // 추상클래스
	abstract public int add(int x , int y0; // 추상 메서드
}
abstract class B extends A { // 추상 클래스, 추상 메소드 add()를 상속받기 떄문
	public void show() { System.out.printf("B");}
}

그러나 클래스 A와 B의 인스턴스는 생성불가

👉 추상 클래스의 구현

추상 클래스의 구현이란, 서브클래스에서 슈퍼 클래스의 모든 추상 메소드를 오버라이딩 하여 실행 가능한 코드로 구현하는 것을 말함.

✅ 추상 클래스의 목적

  • 객체(인스턴스)를 생성하기 위함이 아니며, 상속을 위한 슈퍼 클래스로 활용하기 위한 것.
  • 추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드의 원형을 알려주는 인터페이스의 역할을 하고, 서브 클래스의 다형성을 실현.

5.8 인터페이스

✅ 자바의 인터페이스란

  • interface 키워드를 사용하여 클래스를 선언하듯이 선언
  • 인터페이스는 5종류 멤버로 구성되며, 필드(멤버변수)를 만들 수 없음.
    • 상수, 추상 메소드, default 메소드, private 메소드 , static 메소드

✅ 인터페이스의 객체는 생성할 수 없다.

인터페이스는 다음처럼 객체를 생성할 수 없음.

PhoneInterface p = new PhoneInterface(); // 오류 , 인터페이스의 객체 생성 불가

✅ 인터페이스 상속

인터페이스는 다른 인터페이스를 상속 할 수 있음.
extends를 사용하며 인터페이스는 콤마로 연결하여 2개 이상의 인터페이스를 다중 상속 가능.

✅ 인터페이스 구현

인터페이스를 구현이란 implements키워드를 사용하며 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것.

✅ 클래스 상속과 함께 인터페이스 구현

클래스의 상속과 함께 인터페이스를 구현할 수 있음.

profile
https://baesaa0304.tistory.com 블로그 이사합니다~

0개의 댓글