자바의정석_CHAPTER7 객체지향 프로그램2_(1)

jaei kim·2023년 1월 23일
0

JAVA의정석_기초

목록 보기
7/9

👉 상속

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
자바에서 상속을 구현하는 방법은 새로 작성하고자 하는 클래스의 이름 뒤에 상속받도가 하는 클래스의 이름을 키워드 extends와 함께 써주기만 하면 된다.

class Parent{}
class Child extends Parent{
	//...
}


조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 되지만, 자손 클래스가 변경된느 것은 조상클래스에 아무런 영향을 주지 못한다.

  • 자손 클래스는 조상 클래스의 모든 멤버를 상속받는다. (단, 생성자와 초기화 블럭은 상속되지 않는다.)
  • 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

👉 클래스 간의 관계 - 포함관계

class Circle{
	int x;
    int y;
    int r;
}
class Point{
	int x;
    int y;
}

=> class Circle를 Point를 포함시킬 수 있다.

class Circle{
	Point c = new Point();//원점
    int r;
}

자바에서는 단일상속만 허용한다.

👉 Object클래스 - 모든 클래스의 조상

Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속 받게 함으로써 이것을 가능하게 한다.

👉 오버라이링(overriding)

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라 한다.

  • 오버라이딩의 조건
    1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
    만일 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected나 public이어야 한다. 대부분의 경우 같은 범윙의 접근 제어자를 사용한다. 접근 제어자의 접근범위를 넓은 것에서 좁은 것 순으로 나열하면 public, protexted, (detacult), private이다.
    2. 조상 클래스의 메서드보다 많은 수의 예외를 선언 할 수 없다.
    아래의 코드를 보면 Child클래스의 parentMethod()에 선언된 예외의 개수가 조상인 Parent클래스의 parentMethod()에 선언된 예외의 개수보다 적으므로 바르게 오버라이딩 되었다.

조상 클래스의 메서드를 자손 클래스에서 오버라이딩 할때
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

👉 오버로딩 VS 오버라이딩

오버로딩(overloading) 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩(overriding) 상속받은 메서드의 내용을 변경하는 것 (change, modify)

👉 참조변수 super

인스턴스 메서드에는 this와 super가 지역변수로 존재하는디, 이 들에는 자신이 속한 인스턴스의 주소가 자동으로 저장된다. 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점만 제외하면 this와 super는 근본적으로 같다.

👉 super() - 조상의 생성자

Point3D(int x, int y, int z){
	super(x, y) // 조상클래스의 생성자 Point(int x, int y)를 호출
    this.z = z; // 자신의 멤버를 초기화
}

👉 제어자(modifier)

접근제어자 public, protexted, (default), private
그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp

👉 static - 클래스의 , 공통적인

static 은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.

static이 사용될 수 있는 곳- 멤버변수, 메서드, 초기화 블럭

👉 final - 마지막의, 변경될 수 없는

final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수

👉 abstract - 추상의, 미완성의

abstract가 사용될 수 있는 곳 - 클래스, 메서드

abstract class AbstracTest{ //추상클래스(추상 메서드를 포함한 클래스)
	abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}

👉 접근 제어자(access modifier)

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
private 같은 클래스 내에서만 접근이 가능하다.
(default) 같은 패키지 내에서만 접근이 가능하다.
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public 접근 제한이 전혀 없다.
=> public > protected > (default) > private

접근 제어자를 사용하는 이유

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한, 내부적으로만 사용되는 ,부분을 감추기 위해서

👉 다형성(polymorphism)

조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다는 것

class Tv{
	boolean power; //전원상태(on/off)
    int channel; // 채널
    
    void power() { power = !power;}
    void channelUp() { ++channel; }
    void channelDown(){ --channel; }
}
class SmartTv extends Tv{
	String text; // 캡션(자막)을 보여 죽기 위한 문자열
    void caption() { /* 내용생략 */ }
}
Tv t = new SmartTv(); // 타입 불일치. 조상 타입의 참조변수로 자손 인스턴스를 참조
  • 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.
  • 반대로 자손타입의 참조변수로 조상타입의 인슽너스를 참조할 수는 없다.

👉 참조변수의 형변환

서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조 변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.
그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 먼저 확인하는 것이 중요하다.

profile
@studing_dobby

0개의 댓글