본문 바로가기
Java

Java_3주차-(2)

by shulk 2023. 10. 13.

1. 자식 클래스가 상속 받아 부모 클래스 기능을 사용중인데 부모 클래스가 클래스에 final할시 더 이상 상속 할 수 없어서 부모의 기능 사용 못한다.

부모클래스의 일부 메소드에 final하면 그 메소드는 오버라이딩 할 수 없는 메소드로 변한다.

 

2. Object 클래스는 java 내 모든 클래스들의 최상위 부모 클래스이다. 따라서 모든 클래스는 object의 메소드를 사용 할 수 있다. 

object의 메소드

3. 오버라이딩은 부모클래스로부터 상속받은 메소드를 재정의 하는걸 뜻한다

오버라이딩 하기 위한 조건

*선언부가 부모클래스의 메소드와 일치해야 한다.

* 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.

* 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없다.

 

4. super

*super는 부모 클래스의 멤버를 참조할 수 있는 키워드이고 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용될 수 있다.

*자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 이를 구분하기 위해 사용한다.

왼쪽은 부모 파일,오른쪽은 자식 파일인데 자식의 어떤 함수 필드값 변경하는거에서 super로 인해 부모 필드값이 변경된다. 

 

5. 참조변수 자동,강제 타입변환

 

*참초변수의 자동 타입변환

부모타입 변수 = 자식타입객체;는 자동으로 부모타입으로 변환이 일어난다.

class Mammal {
    // 포유류는 새끼를 낳고 모유수유를 한다.
    public void feeding() {
        System.out.println("모유수유를 합니다.");
    }
}

class Whale extends Mammal {
    // 고래는 포유류 이면서 바다에 살며 수영이 가능하다.
    public void swimming() {
        System.out.println("수영하다.");
    }

    @Override
    public void feeding() {
        System.out.println("고래는 모유수유를 합니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // 고래는 포유류이기 때문에 포유류 타입으로 변환될 수 있습니다.
        Mammal mammal = new Whale();

        // 하지만 포유류 전부가 바다에 살고 수영을 할 수 있는 것은 아니기 때문에
        // 수영 하다 메서드는 실행 불가
        // 즉, 부모 클래스에 swimming이 선언되어있지 않아서 사용 불가능합니다.
        // mammalia.swimming(); // 오류 발생

        // 반대로 모든 포유류가 전부 고래 처럼 수영이 가능한 것이 아니기 때문에 타입변환이 불가능합니다.
        // 즉, 부모타입의 객체는 자식타입의 변수로 변환될 수 없습니다.
        // Whale whale = new Mammal(); // 오류 발생

        mammal.feeding();
    }
}

*강제 타입변환

자식타입 변수 = (자식타입) 부모타입객체;

강제 타입변환은 자동 타입변환을 먼저 해야 사용 할 수 있다!!

6. 추상클래스

이렇게 상속과 비슷하게 부모는 완성시키지 않은 메소드 갖고 있고 자식이 이 메소드를 완성시키는거다.

당연 완성 메소드도 포함 할 수 있고

 

*추상 클래스는 추상 메소드를 포함할 수 있고, 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.

추상클래스의 형태

*추상 메소드는 아직 구현되지 않은 미완성된 메소드이다.

추상메소드 형태

* 상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 한다!!

추상클래스 상속 형태

7. 인터페이스

* 인터페이스는 모든 메소드가 미완성뿐

* interface 키워드를 사용하여 인터페이스를 선언한다.

* 인터페이스는 클래스와 마찬가지로 public, default 접근 제어자를 지정할 수 있다.

인터페이스 선언

* 모든 멤버변수는 public static final , 모든 메서드는 public abstract 이어야하지만 자동으로 해주니 생략해도 된다.

* 인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없기 때문에 클래스에 구현되어 생성된다.

* 인터페이스의 추상 메소드는 구현될 때 반드시 오버라이딩 되어있어야한다.

* 만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경해주면 된다.

인터페이스 구현

*인터페이스간 다중상속이 가능하다!! 그리고 인터페이스간 상속할땐 implements 가 아니라 extends사용한다.

인터페이스 상속

(위에 상속 코드를 보면 인터페이스 C는 아무것도 선언 되어있지 않지만 인터페이스 A, B를 다중 상속받았기 때문에 추상 메서드 a, b를 갖고 있는 상태이고 , Main 클래스에서 인터페이스 C가 구현될 때 a, b 추상 메서드가 오버라이딩된다.)

 

*인터페이스 구현은 상속과 함께 가능하다.

 

7. default, static 메소드

 static,default 메소드는 접근제어자가 public인데 컴파일러가 자동으로 추가해주니 생략가능하고 추상 메소드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없다.

* static,default 메소드 둘다 인터페이스 안에서 구현하니 블럭{}이 존재해야한다. 

static,default 메소드 둘의 차이점은 객체 생성후 호출하냐 안하냐 차이다.

public class Main implements A {

    @Override
    public void a() {
        System.out.println("A");
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.a();
        main.aa();
        System.out.println();

        // static 메서드 aaa() 호출
        A.aaa();
    }
}

interface A {
    void a();
    default void aa() {
        System.out.println("AA");
    }
    static void aaa() {
        System.out.println("static method");
    }
}

'Java' 카테고리의 다른 글

Java_5주차-(1)  (0) 2023.10.16
Java_4주차  (0) 2023.10.16
Java_3주차-(1)  (0) 2023.10.13
Java_2주차  (0) 2023.10.12
Java_1주차  (0) 2023.10.12