IS A 상속이란?
요약하자면 일반 클래스를 구체화 하는 상황에서 상속을 사용한다.
자식클래스는 부모클래스의 모든 멤버(메서드, 필드)를 상속받는다. 따라서 자식클래스는 부모클래스의 모든 기능을 사용할 수 있다.
상속을 사용하면 클래스간 결합도가 높아져 상위 클래스를 수정해야 할 때 하위 클래스에 미치는 영향이 매우 크다.
상위클래스 = 부모클래스 = 기반클래스
하위클래스 = 자식클래스 = 파생클래스
장단점
- 장점
- 생산성이 좋아 빠르게 필요한 로직을 더해 구현 가능하다.
- 중복코드가 줄어든다.
- 다형성이 가능하다.
- 단점
- 부모클래스가 모든 자식클래스에 영향을 미쳐 수정 시 까다로워질 가능성이 있다. 테스트를 많이 거쳐야 한다.
- 캡슐화를 깨지 않으려면 상위클래스에 대해 전부 살펴 봐야 상속 받을 시 제대로 구현할 수 있다.
- 초기에 public으로 설정하고 나중에 private으로 변경시 불가능해 접근자에 대한 제약이 강하다.
- 정적인 코드가 된다.
- 상속은 단 한번만 가능하다.
Override 메서드
부모메서드를 재정의한 메서드를 말한다.
적용
- 할인율 변수 추가
- 기존 calculateTotal() 을 Override해 할인율 적용한 가격 * 수량으로 재정의
- 물건 한개의 할인율 적용된 가격도 추가
- new saleProduct(); 하면 먼저 기존 Product 객체의 공간을 만든다. 그리고 saleProduct에서 추가하거나 재정의된 부분을 덧붙인다.
- 만약 calculateTotal() 을 Override하지 않았다면 메서드를 쓸 수 없는것이 아니라 다음 순위인 super 즉 부모객체 영역에 해당되는 Product에서 해당 메서드를 찾아 호출한다.
public class Program {
public static void main(String[] args) {
saleProduct product = new saleProduct();
product.setName("체크셔츠");
product.setPrice(30000);
product.setQuantity(100);
product.setDiscountRate(10); // 할인율
System.out.println(product.calculatePriceforOne());
System.out.println(product.calculateTotal());
}
}
import part3.practice4.UI코드분리하기.Product;
public class saleProduct extends Product{
private double discountRate;
public double getDiscountRate() {
// 퍼센트로 반환
return discountRate * 100;
}
public void setDiscountRate(double discountRate) {
// 퍼센트 값으로 변환하여 저장
this.discountRate = discountRate / 100;
}
// 기존 calculateTotal()을 재정의 : 할인율까지 적용한 총 수량 * 가격
@Override
public int calculateTotal() {
return (int)(super.calculateTotal()* (1 - this.discountRate / 100));
}
// 물건 하나 당 할인된 가격
public int calculatePriceforOne() {
return (int)(getPrice() * (1 - this.discountRate / 100));
}
}
자식 클래스의 객체를 초기화화는 생성자 Overload
상속받고있는 클래스에서 초기화할 때 Overload를 만드는 과정에서 매개변수의 일부분이 부모객체의 것이라면 부모의 것을 호출한다.
적용
- 부모객체의 변수인 name, price, quantity는 super을 이용해 부모객체의 Overload생성자를 호출가능하다.
- 자식객체인 saleProduct에 있는 discountRate는 this를 이용해 초기화시킨다.
public class Program {
public static void main(String[] args) {
saleProduct product = new saleProduct("체크셔츠", 30000, 100, 10);
/*
product.setName("체크셔츠");
product.setPrice(30000);
product.setQuantity(100);
product.setDiscountRate(10); // 할인율
*/
System.out.println(product.calculatePriceforOne());
System.out.println(product.calculateTotal());
}
}
import part3.practice4.UI코드분리하기.Product;
public class saleProduct extends Product{
private double discountRate;
public saleProduct() {
this("Undefined", 0, 0, 0);
}
public saleProduct(String name, int price, int quantity, double discountRate) {
super(name, price, quantity);
this.discountRate = discountRate;
}
public double getDiscountRate() {
// 퍼센트로 반환
return discountRate * 100;
}
public void setDiscountRate(double discountRate) {
// 퍼센트 값으로 변환하여 저장
this.discountRate = discountRate / 100;
}
// 기존 calculateTotal()을 재정의 : 할인율까지 적용한 총 수량 * 가격
@Override
public int calculateTotal() {
return (int)(super.calculateTotal()* (1 - this.discountRate / 100));
}
// 물건 하나 당 할인된 가격
public int calculatePriceforOne() {
return (int)(getPrice() * (1 - this.discountRate / 100));
}
}
참고 자료 출처 : https://www.youtube.com/watch?v=GN6CshOsej4&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=16
https://www.youtube.com/watch?v=ElLpROe0OXg&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=17
'JAVA' 카테고리의 다른 글
메서드 동적 바인딩 (0) | 2024.01.19 |
---|---|
참조형식과 호출되는 메소드 관계 (0) | 2024.01.18 |
코드 재사용 (0) | 2024.01.14 |
Has A 관계 (0) | 2024.01.11 |
UI코드 분리 하기 (0) | 2024.01.10 |