CHANGEL
SOLID BASICS
CHANGEL

공지사항

  • DEV.CHANGEL PROFILE
  • SOLID BASIC (289)
    • 공부 STUDY (115)
      • JAVA (57)
      • C | C++ (34)
      • CS (11)
      • MySQL (2)
      • ALGORITHM (1)
      • HTML (2)
      • CSS (2)
      • JS (2)
      • CODING (0)
      • MINI PROJECT (3)
    • 스프링 SPRING (21)
      • [SPRING] 김영한 스프링 입문 (11)
      • [SPRING] 남궁성 스프링의 정석 (1)
      • [SPRING] 스프링 핵심원리 (9)
    • 전공 수업 CS (65)
      • Computer Network (13)
      • algorithms (21)
      • Computer Architecture (7)
      • Software Engineering (4)
      • Data Structure (2)
      • DataBase (1)
      • Digital Engineering (14)
      • Discrete Mathematics (3)
      • Introduction to programming (0)
      • Mobile Software (0)
      • Intelligence and Informatio.. (0)
    • 대외활동 (35)
      • 신한은행 대학생 홍보대사 34기 (8)
      • SKT T프렌즈 5기 (13)
      • SK DEVOTION YOUNG 1기 (9)
      • 성균관 대학교 공학교육혁신센터 수강 (3)
      • 수상 기록 (1)
    • 솝트 33기 안드로이드 (7)
      • [솝트 33기] 회고록 (0)
      • [솝트 33기] 안드로이드 왕초보 스터디 (2)
      • [솝트 33기] 코틀린 스터디 (0)
      • [솝트 33기] Git을 털어보자 깃털 스터디 (4)
    • 멋쟁이사자처럼 11기 (6)
      • 멋사 회고록 (4)
      • 백엔드 세션 (1)
      • 기획 세션 (1)
      • 연합해커톤 운영단 (기획팀) (0)
    • 백준 BAEKJOON (16)
    • 독서 BOOK (10)
    • 자격증 CERTIFICATE (1)
    • 준비 서류 및 회고록 MEMOIR (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

최근 댓글

인기 글

CHANGEL

SOLID BASICS

공부 STUDY/JAVA

[Java] 상속 inheritance, 클래스 생성과 형변환 | 예제를 통해 이해하기

2023. 1. 8. 00:40

자바 개념을 확실하게 이해하고 넘어가야 스프링 프레임 워크 공부할 때 어려움이 없을 것 같아서 중요한 개념을 정리하고자한다. 강사님이 이해가 확실히 될 때까지 반복해서 보라고 강조하심! 

 

상속이란 뭘까?

 

한국인이라면 의미를 짐작할 수 있을 것이다. 물려받는 것 정도?

객체 지향 프로그래밍에서 B클래스가 A 클래스를 상속받으면 B클래스는 A클래스의 멤버 변수와 메서드를 사용할 수 있다. 이 '상속'을 기반으로 프로그램 유지 보수를 유연하게 만들고 새로운 내용을 추가하거나 수정을 쉽게 할 수 있다.

 

부모 클래스를 '상위 클래스', - Super Class/ Base class

 

자식 클래스를 '하위클래스'라고 부른다. -Subclass, deprived class

 

상속의 문법: 예약어, Extends

영어 단어를 통해 짐작할 수 있듯이 상속을 통해 부모 클래스가 가지고 있는 속성이나 기능을 추가로 확장하여 자식 클래스를 구현한다.

상속을 하게되면 일반적인 클래스에서 더 구체적인 클래스를 구현할 수 있게 되는 것이다. 

 

예제를 통해 개념을 확실히 이해해보자.

 

아래 코드는 부모 클래스인 Customer 클래스이다.

package inheritance;
public class Customer {
	
	protected int customerID; // 고객 아이디 
	protected String customerName; // 고객 이름
	protected String customerGrade; // 고객 등급
	int bonusPoint;
	double bonusRatio;
	
	
	public Customer() // 디폴트 생성자
	{
		customerGrade = "SILVER";
		bonusRatio = 0.01;
	//	System.out.println("Cusomer() 생성자 호출");
	}
	ㅇ
	public Customer(int customerID, String customerName){
		this.customerID = customerID;
		this.customerName = customerName;
		customerGrade = "SILVER";
		bonusRatio = 0.01;
	//	System.out.println("Cusomer(int, String) 생성자 호출");
	}
	
	public int calcPrice(int price){
		bonusPoint += price * bonusRatio;
		return price;
	}
	
	public String showCustomerInfo(){
		return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";  
	}


	public int getCustomerID() {
		return customerID;
	}
	public void setCustomerID(int customerID) {
		this.customerID = customerID;
	}
	public String getCustomerName() {
		return customerName;
	}
	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}
	public String getCustomerGrade() {
		return customerGrade;
	}
	public void setCustomerGrade(String customerGrade) {
		this.customerGrade = customerGrade;
	}
}

 

 

아래 코드는 부모 클래스인 customer 클래스를 상속받아 생성한 VIPcustomer 클래스이다.

 

package inheritance;

public class VIPcustomer extends Customer {
	
	private int agentID;
	private double saleRatio;
	
	public VIPcustomer() {
	
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;

}
	
	public int getagentID() {
		return agentID;
	}


}

 

아래 코드는 위 클래스들을 실행할 테스트 코드이다.

package inheritance;

public class CustomerTest1 {

	public static void main(String[] args) {
		
		Customer customerLee = new Customer();
		customerLee.setCustomerID(10100); // customerID와 customerNAme은 프로텍트 변수이므로 셋 메서드를 호출한다.
		customerLee.setCustomerName("Lee");
		
		VIPcustomer customerKim = new VIPcustomer();
		customerKim.setCustomerID(20200);
		customerKim.setCustomerName("kim");
		customerKim.bonusPoint = 10000;
		System.out.println(customerKim.showCustomerInfo());
		
	}

}

 

상속에서 클래스 생성과 형 변환

 

하위 클래스가 생성될 떄는 상위 클래스의 생성자가 먼저 호출된다. 이 관계를 이해하면 하위 클래스가 상위 클래스의 변수와 메서드를 사용할 수 있는 이유와 하위 클래스가 상위 클래스의 자료형으로 형 변환을 할 수 있는 이유를 이해할 수 있다.

위에 구현한 코드를 이용하여 설명해보도록 하겠다.

 

테스트 코드에서 VIPcustomer클래스로 선언한 커스토머킴 인스턴스는 상속받은 상위 클래스의 변수를 자기  것처럼 사용할 수 있다.

변수를 사용한다는 것은 그 변수를 저장하고 있는 메모리가 존재한다는 뜻...!

 

그러나 VIPcustomer 클래스의 코드에는 해당 변수가 존재하지 않는다. customer 클래스를 상속받았을 뿐이다. 어떻게 된 일일까?

자, 상속된 하위 클래스가 생성되는 과정을 되짚어보자. 테스트를 위해 두 코드의 생성자에 출력문을 넣고 출력해보면 상위 클래스를 상속받는 하위 클래스가 생설될 때 상위 클래스의 생성자가 먼저 생성된다는 걸 확인할 수 있다. 그리고 상위 클래스 생성자가 호출될 때 상위 클래스의 멤버 변수가 메모리에 생성된다. 

 

즉, 상위 클래스의 변수가 메모리에 먼저 생성되기에 하위 클래스에서도 이 값들을 모두 사용할 수 있다는 것이다! 여기서 주의할 점은 상위 클래스의 private 변수들이다. 하위 클래스에서 해당 변수를 사용할 수 없었던 이유는 상위 클래스의 변수가 생성되지 않았기 때문이 아니다. private 변수는 생성되지만, 단지 하위 클래스에서 접근할 수 없었을 뿐이다.

 

 

 

다음 글에서 어떤 과정으로 상위 클래스가 생성되는지 공부해보도록 하자!

 

'공부 STUDY > JAVA' 카테고리의 다른 글

[JAVA] 상속 | 메서드 오버라이딩  (0) 2023.01.08
[JAVA] 상속 | 부모를 부르는 예약어, super  (0) 2023.01.08
[JAVA] 싱글톤 패턴(Singleton Pattern) - static 응용  (0) 2023.01.07
JAVA 2회독 시작 기록  (0) 2023.01.03
[JAVA] 스프링 시작 전, 생활코딩 JAVA + 수업 완강 회고록(2)  (0) 2022.12.29
    '공부 STUDY/JAVA' 카테고리의 다른 글
    • [JAVA] 상속 | 메서드 오버라이딩
    • [JAVA] 상속 | 부모를 부르는 예약어, super
    • [JAVA] 싱글톤 패턴(Singleton Pattern) - static 응용
    • JAVA 2회독 시작 기록
    CHANGEL
    CHANGEL
    NOT GIVING UP | SOLID BASICS

    티스토리툴바