반응형

# 수평적 구조와 수직적 구조

## 상속 (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(강제 형변환)
	}
}
반응형

+ Recent posts