[JAVA] 상속과 다형성, 추상 클래스

지수·2021년 7월 1일
0

플레이데이터

목록 보기
4/50
post-thumbnail

💬 4일차 후기: 9-6로 수업을 듣다보니 진도가 어마무시하게 빠르다.
수업🔥🔥🔥-복습🔥🔥🔥🔥🔥🔥🔥-예습🔥...의 굴레에 빠져버렸다..
TIL은 내가 쓸게..잠은 누가 잘래...? 24시간이 모자라 증맬루😮‍💨

원래 오늘 나간 진도가 더 많은데, 내용을 다 보고가려고 하면, 오히려 더 얉게 이해하고 넘어갈 것 같아서 오늘은 이쯤에서 마무리하고 주말에 예제 코드 꼼꼼히 쳐보면서 복습 할 생각이다!


💻 이후 복습해야 할 부분

▪ 템플릿 메서드
▪ 인터페이스 => 표준화를 위해서!
▪ ArrayList
▶ 위의 복습한 내용들은 [TIL5] 템플릿 메서드, 인터페이스, ArrayList 로!
▪ 자바 JDK 관련 내용들

💪 이후 교재, +a 혼자 공부해야하는 부분
▪ 🧩 토이 프로젝트 진행
▪ 자료구조: 오버라이딩과 오버로딩


🔅 객체 지향 프로그래밍의 핵심은 은닉 + 상속 + 다형성 🔅
저번 수업에 배운 객체 지향 프로그래밍 기본, 은닉에 이어
이번 수업에는 상속다형성에 대해 배웠다.

1. 상속이란?

💡 상속은 객체 지향 프로그래밍의 중요한 특징!

  1. 현실세계의 개념을 객체로 프로그래밍한 뒤(클래스로 만든 뒤),

  2. 위계에 따라 상위 클래스⏫, 하위 클래스⏬를 정함
    ex. 포유류(상위) <- 사람(하위)

  3. 하위 클래스가 상위 클래스를 상속 받음( = 상위 클래스가 하위 클래스에게 상속함)

  4. 🙋‍♀️ 상속 받은 클래스(하위 클래스)는 👨‍👩‍👧 상속된 클래스(상위 클래스)의 멤버 변수와 메서드를 사용할 수 있음

extends 예약어를 사용해, 하위 클래스 선언시 상속 여부 명시

class Human extends Mammal {
...
}

상속을 하는 이유

  • 확장성이 좋음
    : 한 개념에 포함되는 하위 개념이 클래스로 계속 늘어날 때,
    공통되는 부분은 상속 받고, 다른 부분만 각자 맞게 코딩한 뒤,
    가상 메서드-오버라이딩에 기반하여 하나의 코드로 여러 객체를 작동시킬 수 있음(다형성)

  • 유지보수가 편함
    : 여러 클래스가 엮인 코드가 길게 있으면, 수정사항이 생겼을 때 긴 코드를 다 바꿔주어야 함, 상속 관계를 정의하고 각 객체를 클래스로 따로 따로 두면 수정이 필요한 부분만 효율적으로 접근 가능

🗣🗣🗣🗣🗣🗣🗣주절주절보다 ✅ 명확하고 간략한 게 좋은 법


상속의 과정

하위 클래스가 생성될 때는, 반드시 상위 클래스의 생성자가 먼저 호출됨

하위 클래스를 만들기 위해서는
상위 클래스에 있는 멤버 변수, 메소드가 필요할 수 있기 때문에
메모리에 상위 클래스를 먼저 할당하고 하위 클래스 생성!

힙(heap)에 상위 클래스 멤버 변수가 먼저 생성되고,
이어서 하위 클래스 멤버 변수 생성됨

🧨 하위 클래스에서 상위 클래스에 접근하려면?

super 예약어 : 상위 클래스의 참조 값(주소)을 가지고 있는 예약어
cf. this 예약어 : 자기 자신의 참조 값(주소)을 가지고 있는 예약어

  • super.을 앞에 붙여서 상위 클래스 멤버 변수, 메서드 접근 가능
  • 하위 클래스의 디폴트 생성자에 super(); 자동 생성되어 (컴파일러가 추가함)
    상위 클래스의 생성자 호출함
  • 상위 클래스의 디폴트 생성자가 정의되지 않았을 때는,
    상위 클래스 생성자 포멧에 맞추어 super(); 안에 매개변수 넣고,
    하위 클래스 생성자에 추가
    시켜줘야 함

상속과 관련된 접근 제어자 protected

💡 접근 제어자 protected는 상속에 딱!

protected : 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고, 그 외 클래스에서는 접근할 수 없음

상속된 하위 클래스를 제외한
나머지 외부 클래스에서는 ⛓private⛓과 동일한 역할을 함

외부 클래스에서 접근하여 수정하거나 변형하면 안되는 상위 클래스의 변수protected 예약어를 사용하여 정의할 수 있음

🧨 외부 클래스에서 접근이 필요하다면,
get() 메서드를 만들어 값을 가져올 수 있고,
set() 메서드를 만들어 값을 지정할 수도 있음


메서드 오버라이딩 vs 생성자 오버로딩

자료구조와 알고리즘 수업 때 나를 많이 괴롭게 했던 오버라이딩오버로딩...😩💨💨💨

메서드 오버라이딩

상위 클래스에서 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우, 하위 클래스에서 이 메서드를 재정의 할 수 있음
❗❗ 재정의 되는 메서드의 메서드명, 매개변수가 다 같아야 함 ❗❗

생성자 오버로딩

클래스에 매개변수가 다른 생성자가 여러 개 제공되는 경우, 원하는 생성자를 선택해 사용할 수 있음
❗❗ 생성자마다 매개변수가 다 달라야 함 ❗❗


상속 과정의 업 캐스팅 vs 다운 캐스팅

💡 업 캐스팅(묵시적 형 변환)

상위 클래스 Customer, 하위 클래스 VIPCustomer 예시

  • VIPCustomerCustomer를 상속 받기 때문에,
    Customer형이기도하고, VIPCustomer형이기도 함
// 인스턴스 생성 시 둘 다 가능
Customer vc = new VIPCustomer();  // 업 캐스팅
VIPCustomer vc2 = new VIPCustomer();
  • 모든 하위 클래스는 상위 클래스 자료형으로 형 변환(업 캐스팅) 될 수 있지만, 그 역은 성립하지 않음

💡 다운 캐스팅(명시적 형 변환)

위의 예시와 같이,
상위 클래스의 자료형으로 하위 클래스의 인스턴스를 생성했을 때,
경우에 따라 하위 클래스 인스턴스의 자료형을 본래의 자료형으로 다운 캐스팅 해야할 때가 있음

  • 강제로 형을 다시 바꾸어 주기 전에,
    상위 클래스 형으로 변환된 인스턴스의 원래 자료형을 확인해주고 변경해야 오류를 막을 수 있음 instanceof 활용 (boolean 반환)
Customer customer1 = new VIPCustomer();
if (customer1 instanceof VIPCustomer) {
	VIPCustomer vipcustomer = (VIPCustomer)customer1;
}


2. 다형성

💡 다형성(polymorphism)
: 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
상속 - 가상 메서드 - 오버라이딩 => 다형성

  • 클래스들이 상속 관계를 맺고 있을 때, 상위 클래스에 하위 클래스들에 공통적으로 정의되는 함수를 추상적으로 정의함

  • 하위 클래스는 상위 클래스를 상속 받고, 각 클래스별 특성에 맞게 내부 함수를 정의함

  • 하위 클래스의 인스턴스를 상위 클래스 자료형으로 생성함

  • 상위 클래스 자료형으로 생성된 인스턴스에 상위 클래스에 추상적으로 정의되고, 하위 클래스가 오버라이딩한 메서드 호출

  • 🔥자료형은 상위 클래스에 맞춰져 있지만, 각자 기본 인스턴스에 맞춰서 각 클래스 내부에서 정의한 함수 실행
    (가상 메서드 원리 : 여러 인스턴스가 생성되어도 메서드는 다 같음, 동일한 영역의 주소를 참조하여 실행, 인스턴스에 해당하는 메서드 호출)

🧨 상위 클래스를 상속 받은 여러 클래스를 하나의 상위 클래스로 처리 가능
🧨 확장성이 좋고 관리가 용이함

🤔🤔🤔 중요한 개념인데 다형성이 좀 어렵다.
예제코드 구현해보면서 복습 필요할듯!⌨⌨⌨



3. 추상 클래스

추상 클래스 : 추상 메서드를 포함한 클래스
추상 메서드 : 메서드 구현에 대한 책임을 상속받는 클래스에 위임

  • 상위 클래스에서는 하위 클래스도 공통적으로 사용할 메서드 구현
  • 하위 클래스마다 다르게 구현할 메서드는 추상 메서드로 선언

추상 클래스, 추상 메서드 선언

abstact 예약어를 사용하여 선언

  • 추상 메서드를 포함하면 클래스도 추상 클래스여야함
  • 추상 메서드가 없어도 추상 클래스로 선언할 수 있음
  • 추상 메서드는 구현 코드가 없음
    = 메서드 몸체 body가 없음
    = {} 없이, ();으로만 구현
public abstract class Computer {    // 추상 클래스 
    public abstract void display(); // 추상 메서드
    public abstract void typing();  // 추상 메서드
    
    public void turnOn() {	    // 일반 메서드
       System.out.println("turn-on");
    }
    
    public void turnOff() {    	   // 일반 메서드
       System.out.println("turn-off");
    }
    
 }

추상 클래스 상속의 조건

추상 메서드를 포함한 추상 클래스를 상속받으려면

  • 추상 클래스가 가진 메서드를 상속 받아야 함
  • 즉, 상속 받은 추상 메서드를 구현하든가
  • 자기 자신도 추상 클래스로 만들든가 둘 중 하나를 해야함
profile
사부작 사부작

0개의 댓글