ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 자바] 7. 상속 ① 클래스 상속, super, 메소드 오버라이딩
    Programming/Java 2022. 8. 7. 17:31
    반응형

    7-1. 상속이란?

    기존 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것

    - 기존에 정의되어 있던 클래스: 부모 클래스(parent class) == 상위 클래스(super class) == 기초 클래스(base class)

    - 상속을 통해 새롭게 정의된 클래스: 자식클래스(child class) == 하위 클래스(sub class) == 파생 클래스(derived class)

    - 상속은 코드의 중복을 줄여주고 개발시간 단축을 통해 효율성을 높일 수 있음
    - 접근제한자에 따라 상속을 받아 접근할 수 있는 필드와 메소드는 달라질 수 있음 (부모클래스의 private 필드, 메소드는 접근 불가)

    7-2. 클래스 상속

    extends 를 통해 부모클래스 상속 가능
    - 다중 상속은 불가

    //Parents.java
    public class Parent {
      String name;
      int age;
      
      public void eat() {
        System.out.println("음식을 먹는다.");
      }
    }
    
    //Child.java
    public class Child extends Parent{
    
      public static void main(String[] args) {
        Child c = new Child();
    	
        // 부모의 필드, 메소드 모두 사용 가능.
        c.name = "Erin";
        c.age = 20;
    		
        c.eat();
      }
    }

    7-3. super, super()

    7-3-1. super 참조 변수

    - 부모 클래스로부터 상속 받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수
    - 부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별 가능
    - 인스턴스 변수 이름과 지역 변수 이름이 같을 경우에도, this 키워드를 사용하여 구별 가능 

    // Parent.java
    public class Parent {
      int a = 10;
    }
    
    // Child.java
    public class Child extends Parent{
      int a = 20;
    	
      void display(int a) {
        System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);
      }
    }
    
    // Test.java
    public class Test {
    
      public static void main(String[] args) {
    		
        Child c = new Child();
        c.display(30);
      }
    }
    
    // 30 20 10 순으로 출력

    7-3-2. super() 부모 생성자 호출

    - 자식 객체를 생성하면 부모 객체가 먼저 생성되고 자식 객체가 그 후에 생성됨
    - 부모 기본생성자는 자식 생성자의 맨 첫 줄에서 super() 형태로 자동 호출
    - 부모에 매개변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위한 super(매개값)을 작성해야 함

    //Parent.java
    public class Parent {
    
      Parent(int i) {
        System.out.println("부모 객채: " + i);
      }
    	
      String name;
      int age;
    	
      public void eat() {
        System.out.println("음식을 먹습니다.");
      }
    }
    
    //Child.java
    public class Child extends Parent{
    
      Child(int j) {
        super(1);
        System.out.println("자식 객체: " + j);
      }
      
      public static void main(String[] args) {
        Child c = new Child(2);
      }
    }

    7-4. 메소드 재정의

    부모클래스의 메소드를 자식클래스에서 재정의하여 사용할 수 있다

    7-4-1. 메소드 재정의(@Override)

    : 자식 클래스에서 동일한 메소드를 재정의, 재정의 후엔 자식객체에서 메소드 호출시 오버라이딩된 자식 메소드가 호출됨

    ❗️ 메소드 오버라이딩 시 주의할 규칙
    1. 부모의 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 함
    2. 접근 제한을 더 강하게 오버라이딩할 수 없음
    3. 세로운 예외(Exception)을 throws할 수 없다.

    - @Override 어노테이션을 붙여주면 컴파일러가 메소드 오버라이딩이 잘 되었는지 체크해주기 때문에 오류 발생 가능성 감소

    7-4-2. 부모 메소드 호출(super)

    - 자식 클래스에서 메소드 오버라이딩을 할 경우, 부모 클래스 메소드는 숨겨지고 오버라이딩된 자식 메소드만 호출됨
    - 자식클래스 내부에서 오버라이딩된 부모 메소드를 호출해야 하면 명시적으로 super키워드를 사용하여 호출 가능 (super.method())

    7-5. final 클래스와 final 메소드

    7-5-1. 상속할 수 없는 final 클래스

    - 클래스 선언시 final 키워드가 붙으면, 이 클래스는 최종적 클래스로 상속할 수 없는 클래스가 됨
    - 대표적인 예는 자바에서 제공하는 String 클래스

    7-5-2. 오버라이딩할 수 없는 final 메소드

    - 메소드 선언시 final 키워드가 붙으면, 이 메소드는 최종적 메소드로 오버라이딩 할 수 없는 메소드가 됨

    7-6. protected 접근자

    - protected 접근자는 다른 패키지에서는 자식 클래스만 접근을 허용

    package test;
    
    public class Parent {
    
      public Parent() {}
    	
      protected int i = 1;
      protected void method01() {
        System.out.println("부모 객체에서 옴");
      }
    }
    
    
    package test2;
    import test.Parent;
    
    public class Child extends Parent{
    
      public static void main(String[] args) {
    		
        Parent p = new Parent();
        p.method01(); // 오류 발생, 자식 객체에서만 접근 가능하기 때문
    		
        Child c = new Child();
        c.method01();
    		
      }
    }

     

    반응형

    댓글

Designed by Tistory.