상속이란?
super class의 field와 method를 물려 받는것이다.
상속의 장점
- 클래스 사이의 멤버 중복 선언 불필요 - 클래스의 간결화
- 클래스들의 계층적 분류로 클래스 관리 용이
- 클래스 재사용과 확장을 통한 소프트웨어의 생산성 향상
extends키둬르를 사용하여 상속을 선언한다.
상속을 하는 클래스를 super class, 상속을 받는 클래스를 sub class라고한다.
class Point {
int x, y;
}
class ColorPoint extends Point {
// extends 키워드를 통해 Point 클래스를 상속 받음. Point는 super class, ColorPoint는 sub class
String color;
}
자바 상속의 특징
1. 클래스의 다중 상속을 지원하지 않는다.
2. 모든 클래스는 자바에서 제공하는 Object 클래스를 자동으로 상속받도록 컴파일 된다.
Object클래스의 경로명은 java.lang.Object이며, 유일하게 슈퍼 클래스를 가지지 않는 클래스다.
슈퍼 클래스 멤버에 대한 접근 지정
상속과 생성자
서브 클래스와 슈퍼 클래스 모두 생성자를 가지고 있을경우
서브 클래스의 생성자가 먼저 호출 되지만, 결국 슈퍼 클래스의 생성자가 먼저 실행되고 서브 클래스의 생성자가 나중에 실행된다. 어떤 서브 클래스이든지, 서브 클래스의 생성자에 대해, 컴파일러는 슈퍼 클래스의 생성자를 호출한 뒤 자신의 코드를 실행하도록 컴파일 한다. 슈퍼 클래스가 먼저 초기화된 후, 이를 활용하는 서브 클래스가 초기화 되어야 하기 때문이다.
super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택
서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 명시적으로 선택하는 것이 원칙이다.
super()를 이용하면, 서브 클래스의 생성자에서 슈퍼 클래스 생성자를 명시적으로 선택할 수 있다.
괄호 안에 매개 변수를 주어 매개 변수를 가진 슈퍼 클래스의 생성자를 호출할 수 있다.
super()의 호출은 반드시 생성자의 첫 라인에 와야한다.
업캐스팅과 instanceof 연산자
캐스팅(casting)이란 타입변환을 말한다. 자바에서 클래스에 대한 캐스팅은 업캐스팅(upcasting)과 다운 캐스팅(downcasting)로 나뉜다.
업캐스팅 : 서브 클래스 객체가 슈퍼 클래스 타입으로 변환
다운캐스팅 : 업캐스팅된 것을 다시 원래대로 돌리는 것
업캐스팅 시 명시적 타입 변환은 하지 않아도 된다. Student 객체는 Person 타입이기도 하기 때문이다.
p=(Person)s; // (Person)을 생략하고, p=s; 로 해도 됨.
다운 캐스팅은 업캐스팅과 달리 명시적으로 타입변환을 지정해야 한다.
Student s = (Student)p;
instanceof
업캐스팅을 한 경우 래퍼런스가 가리키는 객체의 진짜 클래스 타입을 구분하기 어렵다.
레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해, instanceof 연산자를 두고 있다.
객체레퍼런스 instanceof 클래스타입
instanceof 연산자는, '레퍼런스'가 가리키는 객체가 해당 '클래스 타입'이면 true, 아니면 false로 처리한다.
메소드 오버라이딩
메소드 오버라이딩은 서브 클래스에서 슈퍼 클래스에 선언된 메소드를 중복 작성하여 슈퍼 클래스에 작성된 메소드를 무력화 시키고, 객체의 주인 노릇을 하는 것이다.
서브 클래스에 오버라이딩한 메소드는 반드시 슈퍼 클래스에 작성된 메소드의 이름, 리턴 타입, 매개 변수 리스트가 모두 같도록 작성되어야 한다.
동적 바인딩 사례
동적 바인딩(dynamic binding)은 실행할 메소드를 컴파일 시(compile time)에 결정하지 않고
실행 시(run time)에 결정하는 것을 말한다.
오버로딩과 오버라이딩
추상 클래스
추상 메소드(sbstrace method)는 abstract 키워드와 함께 원형만 선언되고, 코드는 작성되지 않은 메소드이다.
abstract public String getName(); // 추상 메소드
abstract public String fail() { return "good bye"} // 추상 메소드 아님. 컴파일 오류 발생
추상 메소드를 가지고 있으면 반드시 추상 클래스로 선언되어야 한다.
추상을 상속받으면 무조건 만들어야함.
추상 메소드를 가진 추상 클래스를 상속받는 서브 클래스는 자동으로 추상 클래스가된다. 이는 추상 메소드를 상속받기 때문이다. 그러므로 서브 클래스에 abstract를 붙여 추상 클래스임을 명시해야 한다. 다음 코드는 A가 추상 클래스이므로 상속받는 클래스B는 자동으로 추상 클래스가 되어 abstract로 선언하였다.
abstract class A {
abstract public int add(int x, int y); // 추상 메소드
}
abstract class B extends A {
public void show() {System.out.println("B); }
}
그러므로 class A, class B의 인스턴스는 생성할 수 없다.
추상 클래스 구현
서브 클래스에서 슈퍼 클래스의 모든 추상 메소드를 오버라이딩하여 실행 가능한 코드로 구현하는 것을 말한다.
class C extends A {
public int add(int x, int y) {return x+y;} // 추상 메소드 구현(상속 받으면 만드시 구현해야함), 오버라이딩
public void show() {System.out.println("c");}
}
추상 클래스를 구현한 서브 클래스는 인스턴스를 생성할 수 있다.
C c = new C();
인터페이스(interface)
interface 키워드를 사용하여 클래스를 선언하듯이 선언한다.
인터페이스는 5종류의 멤버로 구성되며, 필드를 만들 수 없다.
- 상수, 추상 메소드, default메소드, private 메소드, static 메소드
인터페이스를 구성하는 멤버들의 특징
- 상수는 public static final 속성이며, 속성은 생략가능하다.
- 추상 메소드는 속성이 public abstract로 정해져 있으며 생략 가능하다. (본연의 목적)
- default 메소드의 접근 지정은 public으로 고정되어 있다.
- private 메소드는 인터페이스 내의 다른 메소드에서만 호출 가능하다.
- static 메소드의 경우 접근 지정이 생략되면 public이며, private로 지정 가능하다.
- default, private, static 메소드들은 코드가 작성되어 있어야 한다.
인터페이스는 객체를 생성할 수 없다. 메소드에 body가 없기 때문에 메모리에 할당이 되지 않는다.
인터페이스 상속
인터페이스는 다른 인터페이스를 상속할 수 있다. 상속을 통해 기존 인터페이스에 새로운 규격을 추가한 새로운 인터페이스를 만든다. 상속시 extends 키워드를 이용하면 된다.
또한 인터페이스는 다중 상속을 지원하며 콤마( , )로 2개 이상의 인터페이스를 다중 상속할 수 있다.
인터페이스 구현
인터페이스 구현이란 implements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것을 말한다.
'java' 카테고리의 다른 글
자바 8장 자바 GUI Swing 기초 (0) | 2020.12.01 |
---|---|
자바 4장 클래스와 객체 (0) | 2020.11.27 |