2024. 10. 18. 22:31ㆍjava
오버로딩(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 와 같이 .을 찍어 사용하게 되면 부모안에 있는 변수들을 사용할 수 있게
'java' 카테고리의 다른 글
| 자바 String 클래스 (1) | 2024.10.20 |
|---|---|
| 예외처리 (Exception) try ~ catch (3) | 2024.10.20 |
| 클래스변수 & 인스턴스변수 & 지역변수 (1) | 2024.10.18 |
| 접근제한자(Access Modifier) & 캡슐화 (1) | 2024.10.18 |
| 배열(array), 인덱스 (index) (3) | 2024.10.18 |