♨학습내용
☞ 자바 상속의 특징
☞ super 키워드
☞ 메소드 오버라이딩
☞ 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
☞ 추상 클래스
☞ final 키워드
☞ Object 클래스
- 자바 상속의 특징
- 상속이란? (Inheritance)
- 하위(자식) 클래스가 상위(부모) 클래스의 모든것을 물려받는 것을 말한다.
- 재사용성과 코드의 간결성을 향상시킬 수 있다.
- 자신이 만들어서 상속 시킬수도 있고 JDK가 지원하는 클래스로 부터 상속 받아서도 사용가능하다.
- 최상위 클래스는 java.lang.Object이다.
- 상속을 받고자 할 때의 키워드는 extends이다.
- 자바는 단일상속만 지원한다.
[public/final/abstract] class 클래스명 extends 상위클래스명 {
멤버 변수;
멤버 메소드;
}
- private 멤버를 제외한 상위 클래스의 모든 멤버는 상속 가능하다.
class A { // A라는 클래스 생성
int num;
}
class B extends A { // B 클래스가 생성되고 그와 동시에 A 클래스를 상속
int num1;
}
// C 클래스가 생성되고 그와 동시에 B 클래스를 상속받고 B 클래스에 상속된 A 클래스도 함께 상속
class C extends B {
int num2;
}
- super 키워드
- 하위 클래스에서 상위 클래스 객체를 가리키는 포인터이다.
- 하위 클래스와 상위 클래스 모두 동일한 메소드 또는 변수가 있을 때 상위 클래스 멤버를 지지한다.
- 생성자에서만 호출이 가능하다.
- 사용방법
- 멤버 필드 접근 : super.멤버필드
- 멤버 메소드 접근 : super.멤버메소드(매개변수)
- 생성자 접근 : super(매개변수) - 생성자 메소드에서만 사용이 가능
/* Parent 클래스 */
class Parent {
public void print() {
System.out.println("부모 클래스의 print() 메소드");
}
}
/* Child 클래스 */
public class Child extends Parent {
public void print() {
super.print();
System.out.println("자식 클래스의 print() 메소드");
}
public static void main(String[] args) {
Child ch = new Child();
ch.print();
}
}
[실행결과]
부모 클래스의 print() 메소드
자식 클래스의 print() 메소드
- 메소드 오버라이딩
- 상속받은 부모 클래스의 메소드(동작)를 자식 클래스에서 재정의 할 때 사용
- 자식 클래스에서 오버라이딩하는 메소드는 부모 클래스의 메소드와의 조건
- 메소드명은 동일해야한다.
- 매개변수의 타입, 갯수, 순서가 같아야한다.
- 리턴타입이 있어야한다.
- 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
public class A {
int age = 10;
public void setAge(int age) {
this.age = age;
}
}
class B extends A {
public void setAge(int age) {
this.age = age+10;
}
}
- 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
- 디스패치란? (Dispatch)
- 어떤 메서드를 호출할 것인가 를 결정하는 과정을 말한다. 즉, 메서드의 의존성을 결정하는 과정이라 할 수 있다.
- 다이나믹 메소드 디스패치란?
- 메소드가 동적으로 붙여진다는 의미이다.
- 어떤 메서드를 실행시킬까는 런타임에 결정하게 되는 것이다. 이를 동적 디스패치라 한다.
// Job 추상 클래스
public abstract class Job {
abstract void printJob();
}
// Job을 상속받은 Student 클래스
public class Student extends Job {
@Override
public void printJob() {
System.out.println("Student");
}
}
// Job을 상속받은 Teacher 클래스
public class Teacher extends Job {
@Override
public void printJob() {
System.out.println("Teacher");
}
}
public class DynamicDispatch {
public static void main(String[] args) {
Job student = new Student();
Job teacher = new Teacher();
student.printJob();
teacher.printJob();
}
}
- 추상 클래스
- Abstract 추상적인, 이라는 뜻의 클래스이다.
- 일반 클래스 처럼 변수 또는 함수를 선언할 수 있지만, abstaract를 붙여 그 형태만을 붙일 수 있다.
- 일반 변수 또는 함수를 선언할 수 없다는 것이 인터페이스와의 차이점이다.
- 반드시 상속을 통해서만 완성된다.
- 추상클래스로는 객체 생성을 못한다.
- 클래스가 한개 이상의 추상메서드를 포함하면 무조건 그 클래스는 추상클래스가 된다.
//추상클래스 생성
abstract class Figure {
abstract void area(int a, int b);
}
//추상클래스를 상속받는 자식 클래스 생성
class Ractangle extends Figure {
void area (int a, int b) {
System.out.println("사각형의 넓이 : " + (a * b));
}
}
//실행클래스
class Example {
public static void main(String args[]) {
Ractangle ract = new Ractangle();
ract(2, 3);
}
}
//실행결과
사각형의 넓이 : 6
- final 키워드
- 마지막, 변경될 수 없다는 의미를 가진다.
- final 클래스: 변경될 수 없는 클래스, 확장될 수 없는 클래스를 말한다.
- final 클래스를 상속받으려고 하면 에러 발생
final class Parent {
}
public class Solution extends Parent { // Error: The type Solution cannot subclass the final class Parant
- final 메소드: 변경될 수 없는 메소드, overriding이 불가능하다. (overloading은 가능)
- final 메소드를 상속받으려고 하면 에러 발생
class Parent {
final void thisIsFinal() {
}
void thisIsNotFinal() {
}
}
public class Solution extends Parent {
@Override
void thisIsFinal() { // Error: thisIsFinal() in Solution cannot override thisIsFinal() in Parent
overridden method is final
}
@Override
void thisIsNotFinal() { // 이건 가능
}
- final 변수: 값을 변경할 수 없는 상수가 된다.
- final 변수의 값을 바꾸려고 시도하면 에러 발생
public class Solution {
final static int LIMIT = 10;
public static void main(String[] args) {
System.out.println(Solution.LIMIT);
Solution.LIMIT = 11; // Error: cannot assign a value to final variable LIMIT
}
- Object 클래스
- Object 클래스는 모든 클래스의 최상위 클래스이다.
- 아래 두 클래스는 동일한 클래스이다.
public class Parent {
}
public class Parent extends Object {
}
- 모든 클래스는 Object클래스의 멤버를 상속받으면 다음과 같은 멤버들이 존재한다.
- Object clone() : 객체를 복제한다.
- boolean equals(Object object) : 두 개의 객체가 같은 지를 비교하고 같으면 true, 다르면 false를 반환한다.
- void finalize() : 가비지 컬렉팅이 수행되기 전에 호출되며 객체가 점유하고 있던 자원을 해제한다.
- Class getClass() : 객체의 클래스명을 Class 형의 객체로 반환한다.
- int hashCode() : 자바에서 객체를 식별하는 정수 값인 해시 코드(16진수)를 반환한다.
- String toString() : 현재 객체의 문자열 표현을 반환하고 Object 클래스에서는 클래스명@해시코드값을 리턴한다.
- void notify() : 대기중인 쓰레드 중 하나의 쓰레드를 다시 시작한다.
- void notifyAll() : 대기중인 모든 쓰레드를 다시 시작한다.
- void wait() : Thread의 작동을 중지하고 대기상태로 전환한다.
'Study > Java_study' 카테고리의 다른 글
Java_study_8 (인터페이스) (0) | 2021.08.17 |
---|---|
Java_study_7 (패키지) (0) | 2021.08.11 |
Java_study_5 (클래스) (0) | 2021.08.04 |
Java_study_4 (제어문) (0) | 2021.08.01 |
Java_study_3 (연산자) (0) | 2021.07.26 |