반응형
# 수평적 구조와 수직적 구조
## 상속 (Inheritance : 키워드는 extends 임을 기억하라.) _ 클래스의 설계 (행위적인 측면)
1. 수평적 설계
멍멍이 클래스
- 이름, 나이, 종, 먹다
고양이 클래스
- 이름, 나이, 종, 먹다
=>
위 처럼 이름, 나이, 종, 먹다 등의 특징이 모든 종에 존재할 수 있음.
아래와 같은 문제점들이 발생한다.
# 문제점
1. 코드의 중복 발생.
2. 새로운 요구사항에 대한 콛의 수정이 불가피.
3. 관리하기가 어려움 (부모와 자식의 관계)
2. 수직적 설계 (계층화 / 상속구조) : 수평 구조를 수직적 구조로 바꾸면 위의 문제점들 해결 가능.
동물 (멍멍이, 고양이의 상위 클래스)
- 해당 클래스에서 중복되는 코드(이름, 나이, 종, 먹다 등) 생성.
동물을 -> 상위 클래스, 부모 클래스
멍멍이와 고양이를 -> 하위 클래스, 자식 클래스
수직적 설계를 하게 되면...
1. 수평적 설계의 단점을 극복할 수 있음.
2. 확장을 쉽게 할 수 있음.
3. 대신 코드가 복잡해진다. (하지만 이점이 많음)
- 상속은 자식(하위) 클래스에서 부모(상위) 클래스로 갈수록 추상화/보편화/일반화/개념화 되고,
- 반대로 부모(상위) 클래스에서 자식(하위) 클래스로 갈수록 세분화/상세화/구체화/구상화 된다.
## 상속 (예)
1. 중복된 코드 존재.
1. 멍멍이 클래스
public class Dog {
public void eat() {
System.out.println("개 처럼 먹다.");
}
}
2. 고양이 클래스
public class Cat {
public void eat() {
System.out.println("고양이 처럼 먹다.");
}
}
2. 중복 제거
1. 동물 클래스
public class Animal extends Object {
pulbic String name;
public int age;
public String part;
public void eat() {
System.out.println("?");
}
public Animal() { // new Object
super();
}
}
2. 멍멍이 클래스
public class Dog extends Animal {
public Dog() { // new Animal
super();
}
}
3. 고양이 클래스
public class Cat extends Animal {
public Cat() { // new Animal
super();
}
}
- super() : 자신의 생성자에서 부모의 생성자를 호출 함. (상속에서 부모-자식을 연결하는 방법.)
- 상속 체이닝 기법을 이용해서 위와 같이 표현 가능.
## 상속 (실습)
객체지향에서 상속은 소유의 개념이 아님, 즉 자식이 부모에 포함되는게 아님. (부모클래스 에서 자식 클래스에 있는 기능을 물려준다면 자식 클래스 입장에서는 해당 기능을 사용할 수 있는 것. 즉, 확장되는 것)
package kr.tpc;
public class Animal {
public void eat() {
System.out.println("?"); // 포괄적, 추상적.
}
}
package kr.tpc;
public class Dog extends Animal {
// 이름, 나이, 종 등 : 상태정보 존재.
/*
* public void eat() { System.out.println("멍멍이 처럼 먹는다."); }
*/
}
package kr.tpc;
public class Cat extends Animal {
// 이름, 나이, 종 등 : 상태정보 존재.
// Dog, Cat의 공통.
/*
* public void eat() { System.out.println("고양이 처럼 먹는다."); }
*/
public void night() {
System.out.println("고양이는 밤에 눈에서 빛이 난다.");
}
}
import kr.tpc.Animal;
import kr.tpc.Cat;
import kr.tpc.Dog;
public class TPC20 {
public static void main(String[] args) {
// Dog, Cat -> Animal
Dog dog = new Dog();
dog.eat();
Cat cat = new Cat();
cat.eat();
cat.night();
// 상속
Animal ani = new Dog();
ani.eat();
ani = new Cat();
ani.eat();
}
}
# 재정의 (Override)
- 상속 관계에서 상속받은 하위 클래스가 상위 클래스의 동작을 수정하는 것.
- 재정의는 부모 메서드가 무시됨. 메모리에 부모와 자식 메서드가 공존하지만, 자식 메서드가 실행됨.
- Override (재정의) :동적 바인딩(호출될 메서드가 실행시점에서 결정되는 바인딩) 프로그램의 속도가 떨어지는 원인이 되지만, 이점이 더 많아 사용 됨.
1. 동물
public class Animal {
public void eat() {
System.out.println("?"); // 포괄적, 추상적.
}
}
2. 멍멍이
public class Dog extends Animal {
// 이름, 나이, 종 등 : 상태정보 존재.
// Dog, Cat의 공통. -> 재정의(오버라이드)
public void eat() {
System.out.println("멍멍이 처럼 먹는다.");
}
}
3. 고양이
public class Cat extends Animal {
// 이름, 나이, 종 등 : 상태정보 존재.
// Dog, Cat의 공통. -> 재정의(오버라이드)
public void eat() {
System.out.println("고양이 처럼 먹는다.");
}
public void night() {
System.out.println("고양이는 밤에 눈에서 빛이 난다.");
}
}
- 업캐스팅 (UpCcasting) : 자동으로 형이 바뀌는 것으로, 부모와 자식간에는 아래와 같이 업캐스팅 가능.
Animal ani = new Dog(); // 부모, 자식 간 업캐스팅
- 오버라이드 (Override) 를 통해 하위 클래스를 접근 할 수 있다.
## 재정의 (실습)
상속관계의 경우 자동 형 변환(UpCasting) 가능, 자동 형 변환이 된다면 강제 형 변환(DownCasting)도 가능 함.
public class Animal {
public void eat() {
System.out.println("?"); // 포괄적, 추상적.
}
}
public class Cat extends Animal {
// 이름, 나이, 종 등 : 상태정보 존재.
@Override
public void eat() {
System.out.println("고양이 처럼 먹는다.");
}
public void night() {
System.out.println("고양이는 밤에 눈에서 빛이 난다.");
}
}
public class Dog extends Animal {
// 이름, 나이, 종 등 : 상태정보 존재.
// 재정의(override)
public void eat() {
System.out.println("멍멍이 처럼 먹는다.");
}
}
public class TPC21 {
public static void main(String[] args) {
// 상속 관계 -> 자식 = 부모
// 부모클래스(Animal) 사용하지 않음.
// 아래는 직접 설계하는 경우.
Dog d = new Dog();
d.eat();
Cat c = new Cat();
c.eat();
c.night();
// 부모클래스(Animal) 사용. (상속관계)
Animal ani1 = new Dog(); // UpCasting(자동 형변환).
ani1.eat();
Animal ani2 = new Cat();
ani2.eat();
// ani2.night(); 는 Animal에 존재 하지 않으므로 아래와 같이 진행.
((Cat)ani2).night(); // DownCating(강제 형변환)
}
}
반응형
'인프런 강의 학습 > Java TPC' 카테고리의 다른 글
Java TPC_14일차 객체 형 변환 (0) | 2022.01.19 |
---|---|
Java TPC_13일차 상속관계에서 객체생성 방법 (0) | 2022.01.18 |
Java TPC_11일차 class (0) | 2022.01.13 |
Java TPC_10일차 메서드 오버로딩 / 동일한 구조와 이질적인 구조 (0) | 2022.01.12 |
Java TPC_9일차 정보은닉 / 잘 설계된 클래스 (0) | 2022.01.10 |