💬 4일차 후기: 9-6로 수업을 듣다보니 진도가 어마무시하게 빠르다.
수업🔥🔥🔥-복습🔥🔥🔥🔥🔥🔥🔥-예습🔥...
의 굴레에 빠져버렸다..
TIL은 내가 쓸게..잠은 누가 잘래...? 24시간이 모자라 증맬루😮💨
원래 오늘 나간 진도가 더 많은데, 내용을 다 보고가려고 하면, 오히려 더 얉게 이해하고 넘어갈 것 같아서 오늘은 이쯤에서 마무리하고 주말에 예제 코드 꼼꼼히 쳐보면서 복습 할 생각이다!
💻 이후 복습해야 할 부분
▪ 템플릿 메서드
▪ 인터페이스 => 표준화를 위해서!
▪ ArrayList
▶ 위의 복습한 내용들은 [TIL5] 템플릿 메서드, 인터페이스, ArrayList 로!
▪ 자바 JDK 관련 내용들
💪 이후 교재, +a 혼자 공부해야하는 부분
▪ 🧩 토이 프로젝트 진행
▪ 자료구조: 오버라이딩과 오버로딩
🔅 객체 지향 프로그래밍의 핵심은 은닉
+ 상속
+ 다형성
🔅
저번 수업에 배운 객체 지향 프로그래밍 기본, 은닉에 이어
이번 수업에는 상속
과 다형성
에 대해 배웠다.
💡 상속은 객체 지향 프로그래밍의 중요한 특징!
현실세계의 개념을 객체로 프로그래밍한 뒤(클래스로 만든 뒤),
위계에 따라 상위 클래스⏫
, 하위 클래스⏬
를 정함
ex. 포유류(상위) <- 사람(하위)
하위 클래스가 상위 클래스를 상속 받음
( = 상위 클래스가 하위 클래스에게 상속함)
🙋♀️ 상속 받은 클래스(하위 클래스)는 👨👩👧 상속된 클래스(상위 클래스)의 멤버 변수와 메서드
를 사용할 수 있음
extends
예약어를 사용해, 하위 클래스 선언시 상속 여부 명시
class Human extends Mammal {
...
}
확장성
이 좋음
: 한 개념에 포함되는 하위 개념이 클래스로 계속 늘어날 때,
공통되는 부분은 상속 받고, 다른 부분만 각자 맞게 코딩한 뒤,
가상 메서드-오버라이딩
에 기반하여 하나의 코드로 여러 객체를 작동시킬 수 있음(다형성
)
유지보수
가 편함
: 여러 클래스가 엮인 코드가 길게 있으면, 수정사항이 생겼을 때 긴 코드를 다 바꿔주어야 함, 상속 관계를 정의하고 각 객체를 클래스로 따로 따로 두면 수정이 필요한 부분만 효율적으로 접근 가능
🗣🗣🗣🗣🗣🗣🗣주절주절보다 ✅ 명확하고 간략한 게 좋은 법
하위 클래스가 생성될 때는, 반드시 상위 클래스의 생성자가 먼저 호출됨
하위 클래스를 만들기 위해서는
상위 클래스에 있는 멤버 변수, 메소드가 필요할 수 있기 때문에
메모리에 상위 클래스를 먼저 할당하고 하위 클래스 생성!
힙(heap)에 상위 클래스 멤버 변수가 먼저 생성되고,
이어서 하위 클래스 멤버 변수 생성됨
🧨 하위 클래스에서 상위 클래스에 접근하려면?
super
예약어 : 상위 클래스의 참조 값(주소)을 가지고 있는 예약어
cf. this
예약어 : 자기 자신의 참조 값(주소)을 가지고 있는 예약어
super.
을 앞에 붙여서 상위 클래스 멤버 변수, 메서드 접근 가능super();
자동 생성되어 (컴파일러가 추가함)super();
안에 매개변수 넣고,💡 접근 제어자 protected는 상속에 딱!
protected
: 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고, 그 외 클래스에서는 접근할 수 없음
상속된 하위 클래스를 제외한
나머지 외부 클래스에서는 ⛓private
⛓과 동일한 역할을 함
외부 클래스에서 접근하여 수정하거나 변형하면 안되는 상위 클래스의 변수를 protected
예약어를 사용하여 정의할 수 있음
🧨 외부 클래스에서 접근이 필요하다면,
get()
메서드를 만들어 값을 가져올 수 있고,
set()
메서드를 만들어 값을 지정할 수도 있음
자료구조와 알고리즘 수업 때 나를 많이 괴롭게 했던 오버라이딩
과 오버로딩
...😩💨💨💨
메서드 오버라이딩 |
---|
상위 클래스에서 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우, 하위 클래스에서 이 메서드를 재정의 할 수 있음
❗❗ 재정의 되는 메서드의 메서드명, 매개변수가 다 같아야 함 ❗❗
생성자 오버로딩 |
---|
클래스에 매개변수가 다른 생성자가 여러 개 제공되는 경우, 원하는 생성자를 선택해 사용할 수 있음
❗❗ 생성자마다 매개변수가 다 달라야 함 ❗❗
💡 업 캐스팅(묵시적 형 변환)
상위 클래스 Customer
, 하위 클래스 VIPCustomer
예시
VIPCustomer
는 Customer
를 상속 받기 때문에,// 인스턴스 생성 시 둘 다 가능
Customer vc = new VIPCustomer(); // 업 캐스팅
VIPCustomer vc2 = new VIPCustomer();
💡 다운 캐스팅(명시적 형 변환)
위의 예시와 같이,
상위 클래스의 자료형으로 하위 클래스의 인스턴스를 생성했을 때,
경우에 따라 하위 클래스 인스턴스의 자료형을 본래의 자료형으로 다운 캐스팅 해야할 때가 있음
instanceof
활용 (boolean 반환)Customer customer1 = new VIPCustomer();
if (customer1 instanceof VIPCustomer) {
VIPCustomer vipcustomer = (VIPCustomer)customer1;
}
💡 다형성(polymorphism)
: 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
상속 - 가상 메서드 - 오버라이딩 => 다형성
클래스들이 상속 관계를 맺고 있을 때, 상위 클래스에 하위 클래스들에 공통적으로 정의되는 함수를 추상적으로 정의함
하위 클래스는 상위 클래스를 상속 받고, 각 클래스별 특성에 맞게 내부 함수를 정의함
하위 클래스의 인스턴스를 상위 클래스 자료형으로 생성함
상위 클래스 자료형으로 생성된 인스턴스에 상위 클래스에 추상적으로 정의되고, 하위 클래스가 오버라이딩한 메서드 호출
🔥자료형은 상위 클래스에 맞춰져 있지만, 각자 기본 인스턴스에 맞춰서 각 클래스 내부에서 정의한 함수 실행됨
(가상 메서드
원리 : 여러 인스턴스가 생성되어도 메서드는 다 같음, 동일한 영역의 주소를 참조하여 실행, 인스턴스에 해당하는 메서드 호출)
🧨 상위 클래스를 상속 받은 여러 클래스를 하나의 상위 클래스로 처리 가능
🧨 확장성이 좋고 관리가 용이함
🤔🤔🤔 중요한 개념인데 다형성이 좀 어렵다.
예제코드 구현해보면서 복습 필요할듯!⌨⌨⌨
추상 클래스
: 추상 메서드
를 포함한 클래스
추상 메서드
: 메서드 구현에 대한 책임을 상속받는 클래스에 위임
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");
}
}
추상 메서드를 포함한 추상 클래스를 상속받으려면