추상화
- 역할을 가지지않음
- 추상 클래스(abstract)는 new 불가 ⇒ 추상적인건 존재하지않기때문
- 공통적인 것을 하나로 모아둔 추상클래스(부모클래스)가 자식클래스들에 상속(extends)
- 클래스들의 공통적인 부분들을 찾아서 재사용 가능한 클래스 설계
상속 (extends 부모클래스)
- is 관계 : ‘~ 이다’
다형성
- 한 객체가 역할을 여러개 가짐
- 하나의 공통되는 메소드가 상속 받은곳에서 모두 다른 동작을 함 ⇒ 여러가지 기능을 만들 수 있음 (ex. 탈 것(추상)에는 자동차(바퀴4), 오토바이(바퀴2), 비행기(날개)가 있고 셋 다 움직이는 방법이 다름) (ex. 동물(추상)에는 강아지(멍멍), 고양이(야옹), 오리(꽥꽥)가 있고 셋 다 울음소리가 다름)
- 오버라이딩과 오버로딩으로 구현
- 오버라이드 : 자식클래스에서 메소드 재정의하고 부모클래스의 동일 메소드 무효화 (동적바인딩)
- 오버로드 : 같은 이름의 메소드 여러개 정의
오버라이드 (재정의→무효화), 동적바인딩
- 자식이 부모와의 동일 메소드를 재정의하면 부모의 메소드는 무효화 ⇒ 동적바인딩
- 자식것을 같은 타입으로 만들고 활성화 시키기위해 부모것을 무효화함(오버라이드의 목적)
ocp (Open Close Principle)
- 개방폐쇄의 원칙
- 컴포넌트, 클래스, 함수 등 구성 요소는 확장에 대해서는 개방되어야 하지만 변경에 대해서는 폐쇄되어야함
- 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 하는 설계가 되어야함
<ocp 위배>
// ocp 위배
// 이 경우, 길동도 코스도 둘 다 심문 가능하게 하려면 기존 코드를 수정해야됨
// 위배되지않게 하려면 추상클래스와 상속 필요
class 길동 {
void start() {
System.out.println("심문을 시작하시오");
}
}
class 코스 {
void start() {
System.out.println("심문을 시작하시오");
}
}
class 영희 {
void start() {
System.out.println("죄인은 응답하시오");
}
}
class Game {
void init(길동 gi, 영희 yo) {
gi.start();
yo.start();
}
}
public class StarApp1 {
public static void main(String[] args) {
// 1. 의존적인 것들 생성하기
길동 gi = new 길동();
영희 yo = new 영희();
코스 cos = new 코스();
// 2. 게임 실행
Game game = new Game();
game.init(gi, yo);
}
}<추상화, 다형성, 오버라이드>
// 추상클래스(abstract)
abstract class 재판관 {
abstract void start();
}
// 재판관 class 상속(extends)
// is 관계 (~이다.) : '길동2는 재판관이다.'
// => 다형성(한 객체가 역할 여러개(길동2, 재판관))
class 길동2 extends 재판관 {
// 오버라이드 (재정의)
// 자식이 부모와의 동일 메소드를 오버라이드하면 부모의 메소드는 무효화됨
// => 동적바인딩
void start() {
System.out.println("심문을 시작하시오");
}
}
// 재판관 class 상속(extends)
// is 관계 (~이다.) : '코스2는 재판관이다.'
// => 다형성(한 객체가 역할 여러개)
class 코스2 extends 재판관 {
// 오버라이드 (재정의)
// 자식이 부모와의 동일 메소드를 오버라이드하면 부모의 메소드는 무효화됨
// => 동적바인딩
void start() {
System.out.println("심문을 시작하시오");
}
}
class 영희2 {
void start() {
System.out.println("죄인은 응답하시오");
}
}
class Game2 {
void init(재판관 gi, 영희2 yo) {
gi.start();
yo.start();
}
}
public class StarApp2 {
public static void main(String[] args) {
// 1. 의존적인 것들 생성하기
길동2 gi = new 길동2();
영희2 yo = new 영희2(); // 영희2 (start)
코스2 cos = new 코스2(); // 코스2 (start => 재정의) + 재판관 (start => 무효화)
// 2. 게임 실행
Game2 game2 = new Game2();
game2.init(cos, yo);
}
}<is 관계, has 관계>
class 버튼 {
// 기능
}
// 버튼 class 상속(extends)
// is 관계 (~이다.) : '엘레베이티드버튼은 버튼이다.'
// => 다형성(한 객체가 역할 여러개 (버튼, 엘레베이티드버튼))
class 엘레베이티드버튼 extends 버튼{
}
class 엔진 {
int power = 5000;
}
// has 관계 (~을 가진다.) : '자동차는 엔진을 가진다.'
class 자동차 {
엔진 e;
public 자동차(엔진 e){
this.e = e;
}
}
public class DataTest {
}Share article