Java

Java) 객체지향 프로그래밍 : 상속성 및 다형성

pogun 2025. 1. 8. 14:02

상속성(inheritance) :

: 부모 클래스로부터 속성 or 특성을 상속받는 것

: variable(변수), method(함수)를 물려받는 것

: 다중 상속은 불가능하다!

 

형식 :
        class 부모클래스명{
            부모변수
            부모메소드
        }
        class 자식클래스 extends 부모클래스명{
            (부모변수)
            (부모메소드) -> 우리눈엔 보이지 않지만 내려와있는 것이다.
            자식변수
            자식메소드
        }


간단한 예제로 사용 형식 보기

public class MainClass {
    public static void main(String[] args) {
    	
        Child child = new Child();
        child.number = 123;
        child.name = "홍길동";
        child.parent_method();
    }
}

class Parent{
    int number;
    String name;

    void parent_method(){
        System.out.println("Parent parent_nethod()");
    }
}

class Child extends Parent{

}

: child에 출력값이 없지만 Child 클래스에 extends로 Parent가 부모클래스로 지정되어있다.

: 그래서 child.parent_method()로 호출이 가능하다.("Parent parent_nethod()" 이게 출력 됨)

다중상속 불가능

class Parent{
    int number;
    String name;

    void parent_method(){
        System.out.println("Parent parent_nethod()");
    }
}

class Human{

}

class Child extends Parent, Human{

}

: 이런식으로 extneds에 parent와 Human 함께 상속은 불가능하다.(자바에서)

: extends 를 사용하여 클래스 간 상속을 정의할 수 있다.

: 하지만 한 클래스에서 두 개 이상의 클래스를 동시에 상속받는 다중 상속은 지원하지 않는다.


상속성 활용한 예제

public class MianClass {
    public static void main(String[] args) {
    	
        child Child = new child();
        Child.method();
    }
}
public class Parent {

    public void method(){
        System.out.println("Parent method()");
    }
}
public class child extends Parent {

    public void method(){

        System.out.println("Child method()");
    }
}

: 이렇게만 하면 child.method() 호출 시 "Child method()" 출력된다.

자식클래스에서 Super

public class child extends Parent {

    public void method(){
		
        super.method(); // 부모클래스(Parent) 메소드가 호출
        
        System.out.println("Child method()");
    }
}

: 자식클래스에서 super.method();를 넣으면 부모클래스의 method() 함수도 같이 호출된다.

: "Parent method()", "Child method()" 출력

자식클래스에 protected로 선언 시 main클래스에서 접근 불가능

public class MianClass {
    public static void main(String[] args) {
    	
        child Child = new child();
        Child.func();
        child.number = 1;
    }
}
public class child extends Parent {

    protected int number;
    
    public void func(){
      
        System.out.println("Child func()");
    }
}

: child.number = 1; 이렇게 사용하는 것은 불가능

자식클래스에 protected로 선언 시 접근 가능한 예

public class MianClass {
    public static void main(String[] args) {
    	
        child Child = new child();
        Child.func();
    }
}
public class Parent {

    protected String name;
}
package cls;

public class child extends Parent {

    public void func(){
        name = "홍길동";  // 부모클래스에서 protect했으므로 자식클래스에서 접근 가능

        System.out.println("Child func()");
    }
}

: 코드처럼 Mian클래스에서 func() 함수 호출

: Parent(부모클래스)에서 protected로 선언해놔서 child(자식클래스)에서 접근 가능

Over Ride

: 상속 받은 클래스에서 고쳐(추가) 기입

public class MianClass {
    public static void main(String[] args) {
    	
        // 원래 이렇게 씀
        child Child = new child();
        Child.method();
        
        // 이렇게도 됨
        Parent parent = new child();
        parent.method();
        parent.func();  // 이건 에러 발생
    }
}
public class Parent {

    public void method(){
        System.out.println("Parent method()");
    }
}
public class child extends Parent {
   
    // over ride
    public void method(){

        System.out.println("Child method()");
    }
}

Parent parent = new child() : 이렇게하면 parent 클래스 메서드가 아닌 child 클래스 메서드가 호출 된다.

parent.func() : 이건 접근 불가능(자식에는 있지만 부모에는 없는 메서드라서)