ved_Rony
article thumbnail

객체지향의 4가지 속성

- 추상, 캡슐, 상속, 다형성

 

추상화 (Abstraction)

  • 객체들의 공통적인 특징(기능, 속성)을 추출해서 정의하는 것
  • 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악한 후, 필요 없는 특성을 제거해 하나의 묶음으로 만들어내는 과정을 가르킨다.
  • 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.
  • ex) 게임에 대포를 만드는데 뭔가 필요할까..탄두방향 필요할것 같고, 탄두 범위도 필요할것같고, 공기저항은 총알에 줄까? 이런과정이 추상화 -> 이렇게 하면 큰대포, 작은 대포 등등 추가하여 쓸수 있다. 추상화하였기에.

쉽게말해, 프로그래밍에 들어가기 앞서 설계하는 단계라고 생각하면 된다.

 

캡슐화 (Encapsulation)

  • 외부에서 객체를 손상시키는 일을 방지할 수 있도록, 객체 내부의 세부적인 동작에 대한 구현을 감추는 것이다. 예를 들어, 외부에서 접근할 필요 없는 것들은 접근 지정자를 private 으로 두어 접근에 제한을 둘 수 있다.정보은닉

상속성 (Inheritance)

  • 이미 정의된 상위 클래스 (부모 클래스)의 모든 속성과 연산을 하위 클래스가 물려 받는 것.
  • 기존 코드를 재활용해서 사용함으로써 코드의 생산성을 높여준다 (적은 코드로 원하는 기능 구현). 이미 작성된 클래스를 받아서 조금만 수정해 새로운 클래스를 생성하는 것을 예로 들 수 있다

다형성 (polymorphism)

  • 하나의 변수 또는 함수(클래스의 객체)가 명령을 받았을 때, 상황에 따라 서로 다른 방식으로 동작하는 것.
  • 동일한 명령을 각자 연결된 객체에 의존해서 해석하는 것을 뜻한다.
  • 오버라이딩(Overriding)과 오버로딩(Overloading)이 있다.

오버라이딩: 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것

오버로딩: 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것.


설계 5원칙 SOLID

  • SRP(Single Responsibility Principle): 단일 책임 원칙
  • OCP(Open Closed Priciple): 개방 폐쇄 원칙
  • LSP(Listov Substitution Priciple): 리스코프 치환 원칙
  • ISP(Interface Segregation Principle): 인터페이스 분리 원칙
  • DIP(Dependancy Inversion Principle): 의존성 역전 원칙

 

단일 책임 원칙(Single Responsibility Principle)

  • 하나의 객체는 반드시 한나의 책임만 가진다.
  • 한 클래스안에 다양한 경우의 역할을 주는게 아니라 공통 기능을 인터페이스나 상위 객체로 뺀후, 설계하는게 좋다.

개방 폐쇄의 원칙(Open Closed Priciple)

  • 확장은 개방적으로 수정은 폐쇄적으로

무슨말인가? 기능이 변하고 확장도 하는데 코드가 수정이 안된다?

-> 하나의 객체를 고치는데, 의존하는 다른 곳까지 고치는것이 좋지 않다는 의미이다.

(예: 라이브러리)

purchase 함수에서 새로운 케이스가 나올때마다 추가를 하는게 아니라 purchasable이라는 인터페이스로 뽑아서 사용하면, 다른 카드에서 사용하는 purchasable을 사용할수 있기 때문에 효율적이다.

 

리스코프의 치환 원칙(Listov Substitution Priciple)

  • 상속되는 객체는 부모 객체를 완전히 대체해도 문제 없도록 설계해야한다고 한다.
  • 올바르지 못한 상속 관계를 지양하고, 부모객체의 동작을 완전하게 대체 할수 있는 관계만 상속 하도록 해야한다.

예) 개 -> 늑대? 개가 늑대 과이니 늑대를 상속 받아 볼까? 하지만, 이제 늑대 와 개는 서로 다른 객체로서 존재하고 있으니 상속관계라고 보긴 어렵다.

 

인터페이스 분리의 원칙(Interface Segregation Principle)

  • 객체는 자신이 호출하지 않는 메소드에 의존하지 않는다. -> 필요한것만 가져다 쓸수 있게 설계해야한다는 의미이다

부모클래스에서 모든 메소드를 정의해서 만드는게 아니라, 정말로 공통된 그능만 부모클래스에서 상속받고 나머지는 기능 별로 interface로 받아서 사용한다.

 

의존성 역전 법칙(Dependancy Inversion Principle)

  • 저수준보다 고수준의 모듈에 의존해야한다.-> 즉, 객체는 객체보다 인터페이스나 추상을 의존해야한다.
  • 코드의 재사용성 및 확장성을 추구하기 위함이다. 하나로 경직된 객체보다 구현되지 않은 인터페이스가 더 유연하기에 확장 가능성이 더 높다.

사용하는 클래스에서는 필요한 것만 추출해서 쓸수있게, 즉, 인터페이스로 뽑아서 사용함으로서 확장성이 유연해지고 onehandsword뿐만이 아닌 다른 무기도 추가해서 사용할수 있게 되는 것이다.

profile

ved_Rony

@Rony_chan

검색 태그