사이먼's 코딩노트

[Java] 상속 / 오버로딩 / 오버라이딩 본문

Java/Java

[Java] 상속 / 오버로딩 / 오버라이딩

simonpark817 2024. 2. 2. 18:03

[상속]

  • Java는 객체지향 프로그램이다.
  • Java와 같이 객체지향 프로그램은 최대한 중복을 없애는 것을 선호하는 편이다.
  • 서로 다른 클래스가 같은 기능을 하는 메서드를 실행하는 것은 매우 비효율적인 일이라고 판단한다.
  • 같은 계열의 클래스 즉, 비슷한 역할을 하는 설계도가 있다면 해당 설계도는 서로 상속하고 상속받는 역할을 하는 것이 좋다.
  • 아래는 클래스끼리 상속받는 모습을 작성한 코드이다.
public class Main {
    public static void main(String[] args) {

        사람 a사람 = new 사람();
        a사람.숨쉬다();
    }
}

class 동물 {
    static void 숨쉬다() {
        System.out.println("숨쉬다.");
    }
}

class 사람 extends 동물 {
}
  • 기존에는 a사람.숨쉬다() 가 실행되기 위해서는 사람 클래스에 해당 메서드를 생성해야했다.
  • 하지만 우리가 상식적으로 생각하기에 사람은 동물의 일부이다.
  • 그렇게 때문에 중복을 최소화하기 위해서 사람을 동물에게 상속받도록 하는 것이다.
  • 사람이 동물의 기능을 상속받게 되면 일부러 같은 기능을 하는 메서드를 추가할 필요가 없어지는 것이다.
  • 상속하는 방법은 클래스에 extends와 상속받을 부모 클래스를 작성한다.
  • class 사람 extends 동물 과 같이 클래스를 생성하고 그 안에 아무런 메서드를 작성하지 않아도 main 함수에서 숨쉬다() 메서드를 호출하게 되면 동물 클래스에 상속되었기 때문에 동물 클래스에 있는 메서드를 호출하여 실행하게 된다.

 

[오버로딩과 오버라이딩]

[오버로딩]

  • 오버로딩은 메서드 이름은 똑같지만, 매개변수를 다르게 해서 쓸 수 있는 것을 의미한다.
  • 아래는 같은 클래스 안에 메서드를 2개 생성했고, 해당 메서드의 이름이 동일한 코드이다.
public class Main {
    public static void main(String[] args) {
        동물.숨쉬다();
        동물.숨쉬다(3);
    }
}

class 동물 {
    static void 숨쉬다() {
        System.out.println("숨쉬다.");
    }
    static void 숨쉬다(int a) {
        System.out.println(a + "번 숨쉬다.");
    }
}
  • 해당 코드는 실행시켰을 때 '숨쉬다'와 '3번 숨쉬다' 가 출력된다.
  • 동물 클래스에서 숨쉬다() 라는 똑같은 이름을 가진 메서드가 2개 생성되었지만 실행이 가능한 이유는 두 메서드의 매개변수가 서로 다르기 때문이다.
  • 첫번째 숨쉬다() 메서드는 매개변수 없이 출력문만 출력하는 메서드이고, 두번째 숨쉬다(int a) 메서드는 매개변수 int a 포함된 메서드이다.
  • 이처럼 메서드 이름은 같지만 매개변수를 다르게 해서 쓸 수 있는 것을 오버로딩이라고 한다.

 

[오버라이딩]

  • 오버라이딩은 부모가 준 메서드를 자식이 다시 재정의를 하는 것을 의미한다.
  • 여기서 부모 자식관계는 상속을 통해서 알 수 있다.
  • 아래는 서로 상속 관계를 가진 두 개의 클래스가 있고 같은 메서드를 서로 다르게 정의한 코드이다.
public class Main {
    public static void main(String[] args) {
        동물.숨쉬다();
        동물.숨쉬다(3);

        사람 a사람 = new 사람();
        a사람.숨쉬다();
        a사람.숨쉬다(6);
    }
}

class 동물 {
    static void 숨쉬다() {
        System.out.println("숨쉬다.");
    }
    static void 숨쉬다(int a) {
        System.out.println(a + "번 숨쉬다.");
    }
}

class 사람 extends 동물 {
    static void 숨쉬다() {
        System.out.println("숨쉬다!!!!!");
    }
}
  • 사람과 동물은 서로 상속 관계 즉, 부모와 자식의 관계이다.
  • 둘의 관계에 따르면 main 함수에서 a사람.숨쉬다() 를 실행하면 동물 클래스에 있는 숨쉬다() 메서드가 호출되면서 출력문에는 '숨쉬다.' 가 출력되야한다.
  • 하지만 해당 코드를 실행해보면 '숨쉬다!!!!!' 가 출력된다.
  • 그 이유는 사람이 동물에게 상속을 받았지만 사람 자체에 숨쉬는 기능을 다르게 부여하고 싶어서 사람 클래스에서 숨쉬다() 메서드를 재정의 했기 때문이다.
  • 이처럼 동물(부모)이 상속해준 메서드를 사람(자식)이 재정의 한 것을 오버라이딩이라고 한다.
반응형

'Java > Java' 카테고리의 다른 글

[Java] 캐스팅 / 생성자  (2) 2024.02.14
[Java] 클래스와 메서드를 활용한 문제풀이  (0) 2024.02.06
[Java] 클래스와 메서드(2)  (0) 2024.02.02
[Java] 클래스와 메서드(1)  (2) 2024.01.29
[Java] 객체지향 프로그램  (0) 2024.01.24