오버로딩(overloading), 오버라이딩(overriding), 상속

2024. 10. 18. 22:31java

오버로딩(overloading):

같은 이름을 가진 메소드 이나, 매개변수가 다르다면 다른 메소드

 
  • 한 클래스 안에 같은 이름의 메서드 여러 개 정의
  • 매개변수 자료형의 개수, 순서, 종류 다르게 작성해야함
  • 단, 매개변수명, 접근제한자, 반환타입은 메소드 오버로딩에 영향을 끼치지 않음
  • 원래는 한 개의 메소드 이름에 한 개의 메서드 사용인데 오버로딩은 하나의 이름에 여러 개의 메소드 사용
  • 매개변수는 다르지만 같은 의미의 기능 수행

오버로딩 성립 조건(3가지 모두 충족)

  • 메소드 이름이 같아야 함
  • 매개변수의 개수 또는 타입이 달라야 함 (접근제한자와는 상관 없음)
  • 반환 타입은 영향이 없음

 

 

 

오버라이딩(overriding)

  • 부모 클래스로부터 상속 받은 메소드를 자손 클래스가 변경하는 것
    (부모클래스가 제공하고 있는 메소드를 자식이 일부 고쳐서 사용하겠다는 의미)
  • 매개변수

오버라이딩 성립 조건(3가지 모두 충족)

  • 부모메소드의 메소드명과 동일
  • 매개변수의 자료형, 개수, 순서가 동일(매개변수명과는 무관)
  • return 타입이 같아야 함

[ 개발자들끼리 약속 ]

1. 오버라이딩 메소드에는 @Overrid 애노테이션을 붙여주자

   → 일종의 주석으로 생략 가능

   → 다만, 실수를 줄이고 한눈에 알아볼 수 있도록 달고자 함

2. 부모메소드의 접근제한자보다 공유범위가 같거나 넓게 선언하자


 

 

상속 (inheritance) :

class Student extends Person{ }

  • 기존의 클래스를 이용해서 새로운 클래스를 만드는 기술 == 상속
  • 매 클래스마다 중복된 필드, 메소드들을 단 한 번 하나의 클래스(부모클래스)로 정의해둔 후 해당 클래스의 멤버를 가져다 쓰는 개념
    → 매 클래스마다 중복된 코드들을 하나하나 기술하게 되면
        코드의 추가 또는 수정과 같은 유지 보수 시 전부 한땀 한땀 찾아서 고쳐야하는 번거로움이 생김
    → 상속이라는 개념을 적용시켜 매 클래스마다 중복된 필드, 메소드들을 단 하나의 클래스 (부모클래스)로 만들고,
        정의하여 해당 부모클래스의 속성, 행위를 상속받아서 사용하는 형태로 진행 

 

public class Food {

// 공통으로 가지고 있어야 할 필드

// foodName, material, cookingTime

private String foodName;

private String material;

private int cookingTime;

 

 

// 생성자부

public Food() {

System.out.println("안녕하세요. 부모입니다.");

}

 

public Food(String foodName, String material, int cookingTime) {

this.foodName = foodName;

this.material = material;

this.cookingTime = cookingTime;

}

 

 

// 메소드부

public String getFoodName() {

return foodName;

}

 

public String getMaterial() {

return material;

}

 

public int getcookingTime() {

return cookingTime;

}

 

 

public void setFoodName(String foodName) {

this.foodName = foodName;

}

 

public void setMaterial(String material) {

this.material = material;

}

 

public void setCookingTime(int cookingTime) {

this.cookingTime = cookingTime;

}

 

public String information() {

return "음식명: " + foodName + ", 주재료: " + material + ", 조리시간: " + cookingTime;

}

 

 

// 자식클래스 extends 부모클래스

public class ChinaFood extends Food{

 

// [ 필드부 ]

// 부모로부터 상속받는 부분은 기술하지 않는다! -> 필드

private String oil;

 

// [ 생성자부 ]

public ChinaFood() {}

 

// [ 매개변수 ]

// foodName, material, cookingTime: 부모클래스인 Food 필드에 대입

// oil: 내 필드에 대립

public ChinaFood(String foodName, String material, int cookingTime, String oil) {

super(foodName, material, cookingTime);

this.oil = oil;

 

}

 

// [ 메소드부 ]

public String getOil() {

return oil;

}

 

public void setOil(String oil) {

this.oil = oil;

}

 

 

// 메소드를 상속받았는데 재정의 하고 싶다 →  다시 기술 가능

public String information() {

// return "음식명: " + super.getFoodName() + ",주재료: " ; 굳이 할필요뭐있냐 부모에있는데..

return super.information() + ", 느끼함: " + oil;

 

}

 

 

}

 

 

 

[ 상속의 장점]

  • 중복된 코드를 공통으로 관리 → 보다 적은양의 코드로 새로운 클래스를 만들 수 있음
  • 프로그램 생산성가독성유지보수에 크게 기여

[ 상속의 특징 ]

  • 클래스간의 다중상속은 불가능 (단일상속만 가능)
  • 명시되어있지는 않지만 모든 클래스는 object클래스의 후손클래스

 

상속 생성자(super):

상속 시 멤버들을 사용 가능하나, 예외적으로 생성자와 초기화블럭은 자손클래스에서는 실행되지 않음.

이에 따라 super라는 바로 부모 클래스에 접근할 수 있게 만드는 변수를 활용

 

[ super 활용법 ]

  • 생성자
    super()라고 메서드 처럼 적게 되면 부모클래스의 생성자를 받아오는 것
    super(name)이라고 하면 부모의 생성자 중에 name을 받는 생성자를 찾음
  • 변수
    super.xxx 와 같이 .을 찍어 사용하게 되면 부모안에 있는 변수들을 사용할 수 있게