ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20 - 생활코딩 자바강의 정리(오버라이딩(overriding))
    TIL 2023. 2. 9. 21:55

    [목차]

    1. overriding란
    2. overriding의 제약사항

    overriding란

    • 자식클래스에서 재정의 하게 되면 이 메소드를 호출하게 되면 부모 클래스를 무시하게 되고
    • 자식클래스를 호출하는 것이 오버라이딩이라고 합니다.
    // overriding 오버라이딩 사용법
    packge org.opentutorials.javautorials.overriding.example1;
    
    class Calculator {
        int left, right;
     
        public void setOprands(int left, int right) {
            this.left = left;
            this.right = right;
        }
     	
         public void sum() {
            System.out.println(this.left + this.right);
        }
     
        public void avg() {
            System.out.println((this.left + this.right) / 2);
        }
    }
     
    // Sum이라고 하는 메소드를 갖고 있지 않습니다 
    // 부모의 Calculator의 자바는 sum메소드를 찾게 됩니다.
    
    // Calculator 상속받은 SubstractionableCalculator 클래스가 가 부모가 이미 갖고 있는 메소드인
    // sum을 재정의(overriding)을 하고 있는 것 입니다. 
    /* 
    SubstractionableCalculator의 sum을 호출하게 되면 부모의 Calculator를 사용하게 될까요?
    아니면 SubstractionableCalculator 사용하게 될까요?
    */
    /*
    	SubstractionableCalculator의 sum메소드 실행
    */
    class SubstractionableCalculator extends Calculator {
        
        public void sum() {
            System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
        }
         
        public void substract() {
            System.out.println(this.left - this.right);
        }
    }
     
    public class CalculatorDemo {
        public static void main(String[] args) {
            SubstractionableCalculator c1 = new SubstractionableCalculator();
            c1.setOprands(10, 20);
            // sum이라는 매소드 호출 하게 되면 SubstractionableCalculator의 매소드
            c1.sum();
            c1.avg();
            c1.substract();
        }
    }
    
    // 결과값: 실행 결과는 30입니다.

    overriding의 제약사항

    • 메소드의 리턴 형식이 같아야 합니다.
      메소드의 이름
      메소드 매개변수의 숫자와 데이터 타입 그리고 순서
      메소드의 리턴 타입
    • 메소드의 형태를 정의하는 사항들을 메소드의 서명이라고 합니다.

     

    • 부모와 자식이 똑같은 코드를 갖고 있어서 중복성을 띄우고 있습니다.
    package org.opentutorials.javatutorials.overriding.example1;
     
    class Calculator {
        int left, right;
     
        public void setOprands(int left, int right) {
            this.left = left;
            this.right = right;
        }
     
        public void sum() {
            System.out.println(this.left + this.right);
        }
     	// 부모와 자식이 같은 서명을 가지고 있기 떄문에 정상적으로 오버라이딩이 됩니다.
        public int avg() {
            return ((this.left + this.right) / 2);
        }
    }
     
    class SubstractionableCalculator extends Calculator {
         
        public void sum() {
            System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
        }
         
        
        public int avg() {
            return ((this.left + this.right) / 2);
        }
         
        public void substract() {
            System.out.println(this.left - this.right);
        }
    }
     
    public class CalculatorDemo {
        public static void main(String[] args) {
            SubstractionableCalculator c1 = new SubstractionableCalculator();
            c1.setOprands(10, 20);
            c1.sum();
            c1.avg();
            c1.substract();
        }
    }
    • 중복을 제거 하는 방법
    • 자식 매소드가 부모 매소드를 호출하기 위해서는 super라는 키워드를 사용합니다.
    package org.opentutorials.javatutorials.overriding.example1;
     
    class Calculator {
        int left, right;
     
        public void setOprands(int left, int right) {
            this.left = left;
            this.right = right;
        }
     
        public void sum() {
            System.out.println(this.left + this.right);
        }
     	
        // return이 되면 자식의 avg에 치환이 됩니다.
        // 부모클래스에서 변경을 하면 자식클래스도 같이 변경 됩니다. 
        // 
        public int avg() {
            return ((this.left + this.right) / 2);
        }
    }
     
    class SubstractionableCalculator extends Calculator {
         
        public void sum() {
            System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
        }
         
        public int avg() {
        // super: 현재 클래스의 부모클래스를 의미합니다.
        // super.avg();부모클래스의 소속되는 avg 평균 값을 의미
        // 부모 객체가 가지고 있는 avg 메소드를 호출하는 것 입니다. 
        // 이 뒤에다가 추가 하고 싶은 걸 추가하면 됩니다.
            return super.avg();
        }
         
        public void substract() {
            System.out.println(this.left - this.right);
        }
    }
     
    public class CalculatorDemo {
        public static void main(String[] args) {
            SubstractionableCalculator c1 = new SubstractionableCalculator();
            c1.setOprands(10, 20);
            c1.sum();
            c1.avg();
            c1.substract();
        }
    }

     

Designed by Tistory.