사이먼's 코딩노트
[Java] 상속 / 오버로딩 / 오버라이딩 본문
[상속]
- 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 |