여니의 프로그래밍 study/Java

[Java] 상속

여니's 2022. 7. 24. 15:21

목차

     

     

     


    상속이란?

    : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것을 의미한다.

     

    하나의 거대한 클래스를 작성하는 것보다는

    단위별로 여러 개의 클래스를 작성하고

    이 단위 클래스들을 포함관계로 재사용하는 것이 좋은 코드다.

     


    상속의 이점

    - 적은 양의 코드로 새로운 클래스를 작성할 수 있다.

    - 코드의 추가 및 변경이 매우 용이하다.

     


    상속을 구현하는 방법

    'extends' 키워드를 사용하면 된다.

    class Yeony extends Parent{
    ...
    
    }

     

    상속 받는다는 것은 조상 클래스를 확장한다는 의미로 해석할 수 있고

    그래서 상속에 사용되는 키워드가 extends이다.

     

    단, 생성자와 초기화 블럭은 상속되지 않고

    멤버만 상속된다. 

     

     

    조상 클래스만 변경해도 모든 자손 클래스, 자손 클래스의 자손 클래스에 영향이 간다.

    따라서, 공통적인 부분은 조상 클래스에 관리하고

    자손 클래스는 자신에 정의된 멤버들만 관리하면 된다.

     

     


    상속의 특징

    - 조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받는다.

    하지만 자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다. 

     

    - 생성자와 초기화 블럭은 상속되지 않고 오직 멤버만 상속된다.

     

    - 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에

    따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다. 

    즉, 자손 클래스의 인스턴스를 생성하면

    조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.

     

    - 자바에서는 오직 단일 상속만을 허용한다. (interface와 포함관계(has a)로 단점 극복!)

     

    - this를 통해 객체 멤버에 접근하고, super를 통해 조상 클래스 멤버에 접근한다. 


    상속과 포함 관계

    - 상속관계 '~은 ~이다' 

    ex) 스포츠카는 자동차이다.

    class Circle extends Point{
    	int r;
    }

    - 포함관계 '~은 ~을 가지고 있다'

    : 상속 이외에 클래스를 재활용하는 방법이다.

    ex) 원은 점을 가지고 있다. 

    class Circle{
    	Point c=new Point();
        int r;
    }

     

     


    Object 클래스

    : 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다. 

    다른 클래스로부터 상속 받지 않은 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 한다. 

     

    만일 다른 클래스로부터 상속을 받는다 하더라도

    상속계층도를 따라 올라가면 마지막 최상위 조상은 Object 클래스이다.

     


    다형성

    : 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 한 성질이다.

     

    같은 타입의 인스턴스일지라도

    참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.

     

    정리하자면

    조상 타입의 참조변수로 자손 타입의 인스턴스를 참조하는 것은 가능하다.

    그러나, 반대로

    자손 타입의 참조변수로 조상 타입의 인스턴스를 참조하는 것은 불가능하다.

     

     

    왜냐하면

    실제 자손 타입의 참조변수가 사용할 수 있는 멤버의 개수가

    실제 조상 타입의 인스턴스의 멤버 개수보다 많기 때문이다.

     

    따라서 참조변수가 사용할 수 있는 멤버의 개수는

    인스턴스의 멤버 개수보다 같거나 적어야한다.

     

     

    또한,

    멤버변수의 경우 참조변수의 타입에 따라 달라진다.

    조상타입의 참조변수를 사용했다면 조상 클래스에 선언된 멤버변수가 사용된다.

     

     

    멤버변수들은 주로 private으로 접근을 제한하고

    외부에서는 메서드를 통해서만 멤버변수에 접근할 수 있도록 한다.

     

     

     


     

    프로그램의 일부가 변수를 직접 수정할 수 있다는 것은

    해당 변수의 값에 액세스하고 변경하는 데 제한이나 제한이 없음을 의미합니다.

     

    즉, 변수는 공개적으로 액세스할 수 있으며

    변수의 위치나 액세스하는 코드 블록에 관계없이 프로그램의 모든 부분에서 수정할 수 있습니다.

     

    프로그램의 모든 부분에서 액세스할 수 있는 "count"라는 변수를 고려하십시오.

    예를 들면 다음과 같습니다.

     

    위의 코드에서 count 변수는 공개로 선언되어

    프로그램의 모든 부분에서 직접 수정할 수 있습니다.

    main() 메소드와 updateCount() 메소드 모두 제한 없이 count 값에 액세스하고 수정할 수 있습니다.

    변수에 대한 무제한 액세스의 결과는 모든 코드 블록 또는 메서드가 언제든지 해당 값을 변경할 수 있다는 것입니다.

    이로 인해 다음과 같은 잠재적인 문제가 발생할 수 있습니다.

     

     

    1. 일관되지 않은 데이터: 프로그램의 모든 부분이 변수를 수정할 수 있기 때문에 일관되고 신뢰할 수 있는 값을 유지하기가 어려워집니다. 프로그램의 다른 부분이 변수를 독립적으로 업데이트하여 데이터가 충돌하거나 잘못될 수 있습니다.
    2. 제어 부족: 변수 수정에 대한 제한이 없으면 변수에 할당된 값에 대한 규칙, 유효성 검사 또는 제약 조건을 적용하기가 어려워집니다. 이는 원하는 논리 또는 비즈니스 규칙을 위반하는 데이터로 이어질 수 있습니다.
    3. 디버깅의 어려움: 프로그램의 일부가 변수를 수정할 수 있는 경우 예기치 않은 변경이나 버그의 원인을 추적하기가 더 어려워질 수 있습니다. 여러 코드 블록이 변수를 수정할 수 있기 때문에 특정 값 변경을 담당하는 프로그램 부분을 정확히 찾아내기가 어려워집니다.

     

     

    이러한 문제를 극복하기 위해 변수를 비공개로 만들고 메서드를 통해

    제어된 액세스를 제공하는 캡슐화 및 액세스 제어 메커니즘이 사용됩니다.

    변수에 대한 직접 액세스를 제한하고 잘 정의된 방법을 통해 액세스를 시행함으로써 수

    정 사항이 특정 규칙 및 제약 조건을 따르도록 하여 보다 안정적이고 유지 관리 가능한 코드로 이어질 수 있습니다.


    참고 출처 : Java의 정석