일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Jenkins
- DP
- Spring
- 백준
- aws
- db
- 코딩
- MST
- JPA
- 디자인 패턴
- Intellj
- 클라우드
- 쿼리
- feign
- 운영체제
- Spring Boot
- Spring Cloud
- 페이징
- golang
- 데이터베이스
- 오라클
- MVC
- 알고리즘
- retry
- SQL
- 자바
- PL/SQL
- 자료구조
- Kafka
- Spring Cloud Feign
- Today
- Total
justgo_developer
OOP(객체지향프로그램) 4가지 원리 본문
[추상화]
추상화란?
어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업
구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념으로 다루는 수단
예시)
switch(자동차 종류)
case 아우디: break;
case 벤츠: break;
default: breka;
이러한 경우 BMW 차가 추가 된다면 BMW에 대한 case문을 추가해야한다.
switch(자동차 종류)
case 아우디: break;
case 벤츠: break;
case BMW : break;
default: breka;
하지만 추상화의 개념을 이용한다면 아래와 같이 코드를 작성할 수 있다.
추상화 개념인 Car 클래스를 사용한다. 따라서 이 코드는 자동차가 추가되더라도 변경될 필요가 없다.
물론 실제 changeEngineOil 메소드는 다르게 실행 될 필요는 있다.
void changeEngineOil(Car c) {
c.changeEngineOil()
}
[캡슐화]
캡슐화는 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리.
캡슐화는 정보은닉을 통해 높은 응집도와 낮은 결합도를 갖도록 한다.
실제 어떤 Class에 선언된 필드에 직접 수정을 하면 그 Class를 사용하는 코드는 강한 결합도를 가진다.
하지만 Class에 필드에 private을 선언해 외부에서 접근을 막고 메소드를 통해 접근한다면 결합도를 낮출수 있다.
※ 정보은닉 : 알 필요가 없는 정보는 외부에서 접근하지 못하도록 제한 하는것
※ 응집도(cohesion) : 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지
※ 결합도(coupling) : 어떤 기능을 실행하는데 다른 클래스나 모듈들에 얼마나 의존적인지
[일반화(상속)]
1. 일반화는 또 다른 캡슐화
일반화 관계는 자식 클래스를 외부로부터 은닉하는 캡술화의 일종이다.
2. 일반화 관계와 위임
일반화 관계는 속성이나 기능의 상속, 즉 재사용을 위해 존재한다고 오해하고 있다.
기본적으로 일반화 관계는 "is a kind of 관계"가 성립되어야 한다.
어떤 클래스의 일부 기능만 재사용하고 싶은 경우에는 위임(Delegation)을 사용하는 것이다.
위임은 자신이 직접 기능을 실행하지 않고 다른 크래스의 객체가 기능을 실행하도록 위임하는 것이다.
3. 집합론 관점으로 본 일반화 관계
일반화는 자식 클래스들의 적절한 합집합과 교집합으로 이루어진다.
[다형성]
서로 다른 클래스의 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력
다형성은 상속과 연계되어 동작하면 매우 강력한 힘을 발휘한다.
- 다형성을 적용하지 않은 코드
class Dog {
public void bark(){...}
}
class Cat {
public void meow(){...}
}
class Parrot {
public void sing(){...}
}
public class Main {
public static void main(String[] args){
Dog d = new Dog();
Cat c = new Cat();
Parrot p = new Parrot();
d.bark();
c.meow();
p.parrot();
}
}
- 다형성을 적용한 코드
abstract class Pet {
public abstract void talk();
}
class Dog extends Pet {
public void talk(){...}
}
class Cat extends Pet {
public void talk(){...}
}
class Parrot extends Pet{
public void talk(){...}
}
public class Main {
public static void groupTalk(Pet[] p){
int i;
for(int i = 0 ;i < 3; i++){
p.talk();
}
}
public static void main(String[] args){
Pet[] p = {new Cat(), new Dog(), new Parrot()};
groupTalk(p);
}
}
다형성을 사용하지 않는 경우에는 클래스 별로 다르게 처리해주어야 하지만 다영성을 사용하는 경우에는 구체적으로 현재 어떤 클래스 객체가 참조되는지 무관하게 코딩할수 있다.
이것이 가능한 이유는 일반화 관계(상속)에 있을 떄 부모클래스의 참조 변수가 자식클래스의 객체를 참조할 수 있기 때문이다.
단, 부모클래스의 참조변수가 접근 할 수 있는 것은 부모 클래스가 물려준 변수와 메소드 뿐이다.
다형성과 상속은 코드를 간결하게 만들 뿐 아니라, 변화에도 유연하게 대처할 수 있게 한다.
※ static method로 선언된 부모클래스는 자식클래스에서 재정의 할수 없다.
: static 메소드는 자바가 컴파일 되는 시점에 결정이 되지만 Override인 경우에는 런타임 시점에 결정이 된다.
그래서 상속이 되지 않는다.
'IT > 자바' 카테고리의 다른 글
SOLID 원칙 (0) | 2021.02.06 |
---|---|
피터 코드의 상속 규칙 (0) | 2021.02.06 |
자바 정규식(Regular Expressions) (0) | 2021.01.30 |
String vs StringBuffer vs StringBuilder 차이 (0) | 2021.01.23 |
public static void main(String[] args) 의미 (0) | 2021.01.09 |