OOP(Object Oriented Programming)

yshjft·2021년 12월 29일
0

Java, OOP

목록 보기
7/27

OOP란

OOP는 실제 사물을 프로그래밍으로 옮겨와 모델링하는 것이다.

OOP의 4가지 특징

1. 추상화(abstraction)

필요로 하는 속성이나 행동을 추출하자!
공통적인 특징을 파악하여 하나의 개념을 다루는 것

2. 캡슐화(encapsulation)

변화로 인한 영향을 최소화하자!
객체가 내부적으로 기능을 어떻게 구현하는지 감추자!
정보 은닉을 통해 높은 응집도 낮은 결합도를 유지하여 유연함과 유지보수성을 증가하는 것

✔︎ 정보은닉(information hiding)

private 키워드를 통해 낮은 결합도를 유지하여 유연함과 유지보수성을 증가하는 것

✔︎ 응집도(cohension)

클래스나 모듈 안의 요소들이 얼마나 밀접하게 연관되어 있는지

✔︎ 결합도(coupling)

어떤 긴능을 실행하는데 클래스나 모듈에 얼마나 의존적인지
😱 (강한결합) → class A가 변경되었는데 class B가 변경되어야 한다. 😱

3. 일반화 관계 (Generalization, 상속 관계)


사람 class는 구체적인 자동차 종류를 알 수 없다
→ 사람은 자동차의 종류에 따라 운전에 영향을 받지 않는다

여러 객체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 것
이를 통해 자식 클래스를 은닉할 수 있게 된다

캡슐화의 일종이다(자식 클래스로 인해 다른 클래스들이 영향을 받지 않는다)

😱 두 클래스 사이에 'is a kind of' 관계가 성립되지 않을 때 상속을 사용하면 불필요한 속성이나 연산도 물려받게 된다.

😲 클래스의 일부 기능만 재사용하고 싶은 경우 상속이 아닌 위임을 해야 한다.
(상속)

public class MyStack<String> extends ArrayList<String> {
    public void push(String element) {
    	add(element);
    }
    public String pop() {
    	return remove(size()-1);
    }
}

(위임)

public class MyStack<String>{
    private ArrayList<String> arrayList = new ArrayList<String>();
    
    public void push(String element) {
    	arrayList.add(element);
    }
    
    public String pop() {
    	return arrayList.remove(size()-1);
    }
    
    public int size() {
    	return arrayList.size();
    }
    ....
}

4. 다형성(polymorphism)

서로 다른 크래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력을 의미한다. 오버라이딩(Overriding)과 오버로딩(Overloading)을 통해 이루어진다.

✔︎ 오버라이딩

상위 클래스가 가지고 있는 메스드를 하위 클래스가 재정의해서 사용

✔︎ 오버로딩

같은 이름의 메서 여러개를 가지면서 매개변수의 유형과 개수가 다르도록하여 사용

OOP의 5대 원칙(SOLID)

1. Single Responsibility Principle(SRP), 단일 책임 원칙

객체는 단 하나의 책임만 가져야 한다.

2. Open Closed Principle(OCP), 개방-폐쇄 원칙

기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계되어야 한다.(확장에는 열려있고 수정에는 닫혀 있어야 한다.)

3. Liscop Substitution Principle(LSP), 리스코프 치환 원칙

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.즉 상위 객체와 하위 객체의 행위가 일관성이 있어야 한다!

4. Interface Segregation Principle(ISP), 인터페이스 분리 원칙

인터페이스를 클라이언트에 특화되도록 분리시켜야 한다. 클라이언트는 자신이 이용하지 않는 기능에는 영향을 받지 않아야 한다.

(ISP 미적용)

public interface multiFunction{
  void funcA();
  void funcB(int b);
  void funcC();
}


public class OnlyNeedFuncA implements multiFunction{
   @Override
   public void funcA() {
     ~~~~~
   }
   
   @Override
   public void funcB(int b) {
     ~~~~~
   }
   
   @Override
   public void funcC() {
     ~~~~~
   }
}

😱 클래스 OnlyNeedFuncA는 funcA만 필요하지만 funcB와 funcC 모두 구현해야 한다!

(ISP 적용)

public interface FuncA {
  void funcA();
}

public interface FuncB {
  void funcB(int b);
}

public interface FuncC {
  void funcC();
}

public class OnlyNeedFuncA implements FuncA{
   @Override
   public void funcA() {
     ~~~~~
   }
}

😊 클래스 OnlyNeedFuncA는 필요한 funcA만 구현하면된다.

5. Dependency Inversion Principle(DIP), 의존 역전 원칙

의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다 거의 변화가 없는 것에 의존해야 한다.

이해가 안된다면 이 글을 보자

참고

profile
꾸준히 나아가자 🐢

0개의 댓글