본문 바로가기
언어(Language)/Java

[Java] 상속(Inheritance)과 다형성(polymorphism)

by 올리브영 2023. 2. 24.
728x90
반응형

객체지향

  • 객체지향은 객체지향적인 방식으로 중복 코드를 없애기 위해서 존재한다.
  • 객체지향적인 구조를 위해서 일부러 중복코드를 허용하는 경우도 있다.

 

상속이란?


  • 상속이란 기존 클래스의 변수와 메소드를 물려 받아 새로운 클래스를 구성하는 것을 의미한다.
  • 상속은 캡슐화, 추상화, 다형성 등 객체지향 프로그래밍에서 중요한 역할을 하는 개념이다.

 

상속의 목적


  • 기존 클래스의 변수와 코드를 재사용할 수 있다. 즉, 유지보수가 쉽고, 중복이 적고, 통일성이 있는 코드를 작성할 수 있다.
  • 클래스 간 계층적 분류 및 관리가 가능하여 유지보수가 용이하다.
  • 코드를 공통적으로 관리해서 여러 코드의 추가 및 변경에 용이하다.

 

상속의 특징


  • 부모 클래스의 생성자, 초기화 블럭은 상속이 안된다.
  • 부모의 private 멤버는 상속은 되지만 접근이 안된다.
  • 모든 클래스는 Object 클래스의 후손이다.

 

상속의 작성 방법


상속을 받는 클래스 뒤에 extends 키워드를 사용한다.(단, 상속은 한개의 클래스만 가능하다)

class 오리{
	void 날다();
}

class 흰오리 extends 오리{
	void 수영();
}

흰오리는 오리를 상속받아서 '날다' 기능도 사용할 수 있다. 

 

super 키워드


  • 하위 클래스에서 가지는 상위 클래스에 대한 참조 값
  • super()는 상위 클래스의 기본 생성자를 호출 함.
  • 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출됨. (반드시 상위 클래스의 기본 생성자가 존재 해야 함)
  • 상위 클래스의 기본 생성자가 없는 경우(다른 생성자가 있는 경우) 하위 클래스에서는 생성자에서는 super를 이용하여 명시적으로 상위 클래스의 생성자를 호출 함
  • super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있음.
// Customer.java
// 디폴트 생성자 없애고 매개 변수가 있는 생성자 추가
public Customer(int customerID, String customerName) {
		this.customerID = customerID;
		this.customerName = customerName;
		
		customerGrade = "SILVER";
		bonusRatio = 0.01;
		System.out.println("Customer(int, String) 생성자 호출");
}

// VIPCustomer.java
// super를 이용하여 상위 클래스의 생성자 명시적으로 호출
public VIPCustomer(int customerID, String customerName) {
		super(customerID, customerName);
		
		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
		
		System.out.println("VIPCustomer(int, String) 생성자 호출");
}

 

메서드 오버라이딩


  • 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의메서드를 재정의 할 수 있음.
  • 재정의 하여 구현해야 함.
  •  
class 오리{
    void 날다(){
        System.out.println("날다");
    }
}

class 흰오리 extends 오리{
    void 날다(){
        System.out.println("못날다");
    }
}

 

다형성(polymorphism) 이란?


  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
  • 같은 코드에서 여러 다른 실행 결과가 나옴
  • 정보은닉, 상속과 더불어 객체지향 프로그램밍의 가장 큰 특징중 하나이다.
  • 다형성을 잘 활용하면 유연하고 확장성 있고, 유지보수가 편리한 프로그램을 만들 수 있다.
class Animal{
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
	
	public void eating() {
		
	}
}

class Human extends Animal{
	public void move() {
		System.out.println("사람이 두발로 걷습니다.");
	}
	
	public void readBooks() {
		System.out.println("사람이 책을 읽습니다.");
	}
}

class Tiger extends Animal{
	public void move() {
		System.out.println("호랑이가 네 발로 뜁니다.");
	}
	
	public void hunting() {
		System.out.println("호랑이가 사냥을 합니다.");
	}
}


class Eagle extends Animal{
	public void move() {
		System.out.println("독수리가 하늘을 날아갑니다.");
	}
	
	public void flying() {
		System.out.println("독수리가 날개를 쭉 펴고 멀리 날아갑니다");
	}
}

 

다형성을 사용하는 이유?


  • 다른 동물을 추가하는 경우
  • 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음.
  • 그렇지 않는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워짐.
  • 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음.
728x90
반응형