
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 = 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); } }
Person p;
Student s = new Student();
p = s; // 업캐스팅
person p = new Student("이재문"); // 업캐스팅
Student s = (Student)p; // 다운캐스팅, (Student)의 타입 변환을 반드시 지정.
업캐스팅을 한 경우 레퍼런스가 가리키는 객체의 진짜 클래스 타입을 구분하기 어려움.
👉 instanceof 연산자 사용
- 레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해, 자바에서는 instanceof 연산자를 두고 있음.
객체레퍼런스 instanceof 클래스타입- '레퍼런스'가 가리키는 객체가 해당 ' 클래스 타입' 이먄 true , 아니면 false로 처리.
- 클래스에만 적용됨.
오버라이딩은 서브 클래스에서 슈퍼 클래스에서 슈퍼 클래스 선언된 메소드를 중복하여 슈퍼 클래스에 작성된 메소드를 무력화시키고, 객체의 주인 노릇을 하는 것.
class A {
void f(){
System.out.printf('A의 f() 호출");
}
}
class B extends A {
void f( ) { // A의 f()를 오버라이딩
System.out.printf('B의 f() 호출");
}
}
| 비교 요소 | 메소드 오버로딩 | 메소드 오버라이딩 |
|---|---|---|
| 선언 | 같은 클래스나 상속 관계에서의 동일한 이름의 메소드 중복 작성 | 서브 클래스에서의 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드 작성 |
| 관계 | 동일한 클래스 내 혹은 상속관계 | 상속관계 |
| 목적 | 이름이 같은 여러개의 메소드를 중복 선언하여 사용의 편리성 향상 | 슈퍼 클래스에 구현된 메소드를 무시하고 서브 클래스에서 새로운 기능의 메소드를 재정의 |
| 조건 | 메소드 이름은 반드시 동일함. 메소드의 인자의 개수나 인자의 타입이 달라야 성립 | 메서드 이름, 인자의 타입, 인자의 개수, 리턴 타입 등이 모두 동일해야 성립 |
| 바인딩 | 정적바인딩 컴파일 시에 중복된 메소드 중 호출되는 메소드 결정 | 동적 바인딩 실행 시간에 오버라이딩된 메소드 찾아 호출 |
추상메소드는 abstract키워드와 함께 원형만 선언되고, 코드는 작성되지 않은 메소드.
abstract public String getName(); // 추상 메소드
abstract public String fail (); { return "Good Bye";} // 추상 메소드 아님. 컴파일 오류
추상클래스는 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의 인스턴스는 생성불가
👉 추상 클래스의 구현
추상 클래스의 구현이란, 서브클래스에서 슈퍼 클래스의 모든 추상 메소드를 오버라이딩 하여 실행 가능한 코드로 구현하는 것을 말함.
인터페이스는 다음처럼 객체를 생성할 수 없음.
PhoneInterface p = new PhoneInterface(); // 오류 , 인터페이스의 객체 생성 불가
인터페이스는 다른 인터페이스를 상속 할 수 있음.
extends를 사용하며 인터페이스는 콤마로 연결하여 2개 이상의 인터페이스를 다중 상속 가능.
인터페이스를 구현이란 implements키워드를 사용하며 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것.
클래스의 상속과 함께 인터페이스를 구현할 수 있음.