본문 바로가기
JAVA

IS A 상속

by 영카이브 2024. 1. 16.

IS A 상속이란?

 

요약하자면 일반 클래스를 구체화 하는 상황에서 상속을 사용한다.

자식클래스는 부모클래스의 모든 멤버(메서드, 필드)를 상속받는다. 따라서 자식클래스는 부모클래스의 모든 기능을 사용할 수 있다.

상속을 사용하면 클래스간 결합도가 높아져 상위 클래스를 수정해야 할 때 하위 클래스에 미치는 영향이 매우 크다. 

 

 

상위클래스 = 부모클래스 = 기반클래스

하위클래스 = 자식클래스 = 파생클래스

 

 

장단점

  1. 장점
    1. 생산성이 좋아 빠르게 필요한 로직을 더해 구현 가능하다.
    2. 중복코드가 줄어든다.
    3. 다형성이 가능하다.
  2. 단점 
    1. 부모클래스가 모든 자식클래스에 영향을 미쳐 수정 시 까다로워질 가능성이 있다. 테스트를 많이 거쳐야 한다.
    2. 캡슐화를 깨지 않으려면 상위클래스에 대해 전부 살펴 봐야 상속 받을 시 제대로 구현할 수 있다. 
    3. 초기에 public으로 설정하고 나중에 private으로 변경시 불가능해 접근자에 대한 제약이 강하다. 
    4. 정적인 코드가 된다. 
    5. 상속은 단 한번만 가능하다.

 

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