ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🎮 [JAVA 자바] #9 | 자바 상속과 접근 지정, 메소드 오버라이딩, 상속과 생성자
    CS/Java 2022. 4. 17. 11:18

     


    🎮 상속과 접근 지정

     - 상속 (Inheritance) 

    객체 지향의 특성으로, 상위 개체의 속성이 하위 개체에 물려짐(재사용), 기존의 클래스로 새로운 클래스를 작성하는것

    하위 개체가 상위 개체의 속성(필드, 메소드)을 모두 가지면서 확장하는 관계(확장)

     

    자식 : sub class  부모 : super class

     

     - 장점 

    공통된 멤버를 가지는 클래스들을 정리하여 중복을 제거해 간결해진 클래스 구조를 가짐

    클래스의 간결화, 계층적 분류로 관리 쉬움, 클래스 재사용확장 쉬움

     

     - 자바의 상속 

    extends 사용. 상속 횟수 무제한, 단일 상속 지원 (다중 상속 지원 X)

    자식 클래스의 멤버 개수 >= 부모 클래스의 멤버 개수 (생성자 예외)

    public class Person { ... } // Object 클래스 상속 (상속 안받는 클래스들의 기본 상속 클래스)
    public class Student extends Person { ... } // Person 클래스 상속
    public class StudentWorker extends Student { ... } // Student 클래스 상속

    * java.lang.Object는 최상위 조상 클래스로 모든 클래스는 자동으로 java.lang.Object를 상속받음

     

     - 상속과 접근 지정자 

    슈퍼 클래스의 protected 멤버 : 다른 패키지에 있어도 상속받은 서브 클래스는 접근 가능

    default는 동일 패키지에 있으면 슈퍼클래스의 멤버 접근 가능

     

    슈퍼클래스와 서브클래스가 동일 패키지 : public, default, protected      (private 멤버 접근 안됨)

    슈퍼클래스와 서브클래스가 다른 패키지 : public, protected     (default, private 멤버 접근 안됨)

     

    * private 멤버 접근 하는 방법 : get, set메소드 통해서 조작

    class Person {
        private int weight;
        public void setWeight(int weight) { // set 선언 
            this.weight = weight;
        }
        public int getWeight() { // get 선언
            return weight;
        }
    }
    
    class Student extends Person {
        public void set() {
            setWeight(99); // set 호출
            System.out.println(getWeight()); // get 호출
        }
    }

    🎮 메소드 오버라이딩

     - 메소드 오버라이딩 

    상속받은 메소드의 동작을 다르게 정의하는 방법. 슈퍼 클래스의 메소드를 서브 클래스에서 재정의

    조건 1) 이름, 매개변수 타입 및 개수, 리턴 타입까지 모두 같아야 함   

    조건 2) 접근 제어자는 슈퍼클래스 보다 같거나 넓게 해야함

    동적 바인딩 발생 : 서브 클래스에 오버라이딩된 메소드가 무조건 실행. 런타임에 바뀜.

     

     - 오버라이딩의 목적 

    다형성 실현 : 상속을 통해 '하나의 인터페이스(같은 이름)에 서로 다른 내용 구현'이라는 객체 지향의 다형성 실현

    실행 시간 다형성 실현 : 동적 바인딩을 통해 런타임(실행 중)에 다형성 실현, (+오버로딩은 컴파일 타임(실행 전)에 다형성 실현)

    비교요소 메소드 오버로딩 메소드 오버라이딩
    선언 같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성 서브 클래스에서 슈퍼 클래스에 있는 메소드와
    동일한 이름의 메소드 재작성
    관계 동일한 클래스 내 혹은 상속 관계 상속 관계
    목적 이름이 같은 여러 개의 메소드를 중복 작성하여
    사용의 편리성 향상. 다형성 실현
    슈퍼 클래스에 구현된 메소드를 무시하고 서브 클래스에서
    새로운 기능의 메소드를 재정의하고자 함. 다형성 실현
    조건 이름만 반드시 동일
    매개변수 타입 또는 개수가 다름 
    이름, 매개변수 타입과 개수, 리턴 타입 모두 동일
    바인딩 정적 바인딩. 컴파일 시에 호출될 메소드가 결정됨 동적 바인딩. 실행 시간에 오버라이딩된 메소드 찾아 호출

     

     - 어노테이션 

    오버라이딩 메소드임을 명시 (실수 방지) 명시여서 알려주기만 할뿐 오류는 X

    @Override 어노테이션

     

     - 오버라이딩에 의해 서브 클래스의 메소드 호출 

    1) 서브 클래스 레퍼런스로 오버라이딩된 메소드 호출

     

    2) 업캐스팅에 의해 슈퍼 클래스 레퍼런스로 오버라이딩된 메소드 호출(동적 바인딩)

     

     - 오버라이딩과 super 키워드 

    super : 슈퍼 클래스의 멤버를 접근할 때 사용되는 레퍼런스

    서브 클래스에서만 사용

    슈퍼 클래스 멤버와 자신의 멤버를 구별

    super 메소드 접근을 정적 바인딩으로 처리

    슈퍼클래스의 생성자 접근 : super()

    public void draw(String name) {
        System.out.prinln(name); // 블록 안에서의 변수. 인자
        System.out.println(this.name); // 해당 클래스의 멤버변수(없으면 슈퍼클래스의 멤버변수)
        System.out.println(super.name); // 슈퍼 클래스의 멤버변수
    }

     


    🎮 상속과 생성자

    class Point extends Object {
       Point() {
          super(); 
       }
    }

    생성자에는 처음에는 생성자가 호출되어야 함. 없는 경우 super()가 추가됨 (부모의 기본생성자)

     

     - 자주 발생하는 실수 

    super()는 기본생성자이므로, 슈퍼클래스에 커스텀생성자는 있는데 기본생성자가 없다면 오류. 반드시 첫 줄에 와야 함.

    서브클래스에서 매개변수가 있는 생성자일때도, 슈퍼클래스 기본 생성자를 자동 선택

    class Point {
        Point(int x, int y) { ... }
    }
    
    class ColorPoint extends Point {
        ColorPoint(int x, int y) {
            super(); // 안써줘도 자동으로 추가됨. 근데 Point()가 존재하지 않아서 오류
            // super(x,y); 이렇게 고쳐주어야 함
        }
    }

     

     - 상속 관계에서 생성자 호출 및 실행 

    더보기
    상속 관계에서 생성자 호출 및 실행 과정