Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

codingfarm

개발 상식(OOP) 본문

면접준비/직무면접

개발 상식(OOP)

scarecrow1992 2019. 10. 24. 11:34

OOP


-기존의 프로그래밍은 컴퓨터 사고 중심이었지만 oop는 인간 중심적 프로그래밍 기술이다.

-실제 세계를 모델링 한다.

-정보은닉에 대한것이다.

-모듈화에 대한것이다.

-코드 재사용을 위한것이다.

-메시지 전달에 대한것이다.

--메시지 전달이란 한 객체에서 다른 객체로 데이터를 전달하거나, 다른 객체의 메소드를 실행시키는 것이다.

-행위자(object)와 행위(method)에 대한것이다.

 

 


4대 특징

1.추상화(Abstraction)

-현실세계에 존재하는 사물을 객체라 보고 이들로 부터 개발하고자 하는
어플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는것이다.

즉, OOP란 실제 세계를 모델링 하는 것이다.

-절차지향적 프로그래밍에서도 구조체와 같은 형태로 존재했던 개념이다.

- 하나의 새로운 데이터형을 정의하는 데 그 안에는 여러개의 부속데이터를 둘 수 있다. 이 때 그 데이터를 추상화를 통해 정의한 것이다.

 

2.캡슐화(Encapsulation)

-데이터 구조(field)와 데이터를 다루는 방법(method)을 결합시켜 묶는 것을 말한다.
-객체가 맡은 역할을 수행하기 위한 하나의 목적을 위해 데이터와 기능들을 묶는 것이다.

-정보의 은닉을 통해 데이터의 오용과 손상을 막을 수 있다.

-데이터를 은닉하고 그 데이터를 접근하는 기능을 노출시키지 않는다는 의미로 사용할 때 캡슐화라는 용어를 사용한다. 즉, 정보은닉 모듈화를 가능하게 하며 플러그를 가능하게 한다.

 

 

 

3.상속성(Inheritance)

-사실상 OOP의 알파이자 오메가이다.

-상속이 없으면 객체지향은 절차지향과 별 다른 바가 없다.

-상속이랑 상위개념의 특징을 하위 개념이 물려받고 필요에 따라 재정의(오버라이딩) 하는것을 말한다.

즉, 코드 재사용성을 높인다.

 

 

4.다형성(Polymorphism)

-다른방법으로 일을하는 함수를 동일한 이름으로 호출해 주는것(오버로딩)

-부모 클래스의 오브젝트가 자식클래스의 인스턴스를 포인트하여 자식클래스인것 처럼 작동하는것

 

 

 

즉, 객체지향이란 캡슐화, 다형성, 상속성, 추상화를 통해 코드를 객체단위로 작성하여 코드재사용성을 증가시키고, 유지보수를 감소시키며, 분업을 쉽게하는 장점을 얻기위해 객체들을 연결시켜 프로그래밍 하는것이다.

 

 

OO와 non-OO

OO는 메서드가 데이터에 접근하는 방식이며 non-OO는 데이터가 메서드에 접근하는 방식이다.

non-OO : var = function(arg1, arg2);

OO       : var = obj.function(arg1, arg2);

 

 


 

OOP의 장점

1)재사용성이 높다 - 자주 사용되는 로직을 라이브러리로 만들어 사용 가능하며 신뢰성 확보가능
2)라이브러리를 예외사항에 맞게 잘 만들면 에러를 컴파일 단계에서 잡을 수 있다.
3)라이브러리가 내부적으로 작동하는 방식을 몰라도 기능들을 쓸 수 있으므로 생산성이 높아진다.
4)객체 단위로 코드가 나누어 작성되므로 디버깅이 쉽고 유지보수에 용이하다.

 

OOP의 단점

1)객체간의 정보교환이 메시지 교환을 통해 일어나므로 실행시 많은 overhead가 발생된다.
(이는 hw의 발전으로 많이 보완되었다)
2)함수형 프로그래밍 패러다임과는 달리 객체가 상태를 갖게되며 예측 불가능한 상태를 갖게되면 버그가 발생한다.

 


객체 지향적 설계 원칙


1.SRP(Single Responsibilty Principle) : 단일 책임 원칙
-클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 하나여야한다.

2.OCP(Open-Closed Principle) : 개방-폐쇄 원칙
-객체는 확장에는 열려있어야 하며 변경에는 닫혀있어야 한다.

3.LSP : 리스코프 치환 원칙
- 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정삭적으로 작동해야 한다.

4.ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
-인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.

5.DIP : 의존 역전 원칙
-고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.

 

https://codingfarm.tistory.com/46

https://codingfarm.tistory.com/47

 

 


추상화 클래스와 인터페이스

-객체를 생성 할 수 있지만 인스턴스를 만들 수 없다.

-상속받은 자식이 구현을 반드시 하도록 하는 명세라 볼 수 있다.

 

차이점

-추상화 클래스는 말그대로  추상화이고, 인터페이스는 구현하기 전에 메소드에 대한 명세이다.
-그래서 상속을 받음에도 추상화 클래스는 상속, 인터페이스는 implements(구현)이라 쓴다.
-추상클래스는 단일상속을 받지만, 인터페이스는 다중상속이 가능하다.
-추상클래스는 내부 필드를 가지지만, 인터페이스는 필드가 없다
-추상 클래스는 생성자가 virtual로 있지만 인터페이스는 생성자는 없고 소멸자만 virtual로 있다.
https://igotit.tistory.com/1325
-C++은 자바나 c#과는 달리 이 둘을 공식적으로 구분하지는 않기 때문에 개념적으로 구분해야한다.
-추상 클래스는 내부에 field를 통해서 최소한의 데이터는 가질 수 있다 그렇기에 생성자를 가질 수 있다.
객체를 만든후에 하위 객체를 참조 할 수 있다.
데이터가 있기에 죽음의 다이아몬드에 따른 데이터의 모호성에 의해 다중상속이 불가능하다
-인터페이스는 내부에 일절 데이터가 없기에 생성자를 가질 수 없으며 
객체를 만드는것 조차 불가능 하다.
모든 메서드에 대해서 하위 클래스에서는 구현을 해야한다.
데이터가 없기때문에 모호성이 없어서 다중 상속이 가능하다.
다형성이 필요하다 - 인터페이스
범용성이 필요하다 - 추상클래스

 

하지만 이 정보는 언어에 따라서 그 특징이 상이할 수 있기 때문에 무작정 이론으로만 익히지 말고 사용예를 잘 파악 하는것이 보다 더 중요하다.

 

추상 클래스

-abstract 메소드가 하나라도 있는 클래스
-이를 상속받는 클래스는 반드시 추상메서드를 구현해야한다.

 

 

인터페이스

-구현체 없이, 메소드에 대한 명세만 있다.
-이를 상속받는 클래스는 인터페이스에 있는 메소드를 다 구현해야한다.

 

 

 


 

상속을 통한 재사용의 단점

-데이터의 수정이 어려워진다

-클래스의 불필요한 증가

-상속의 오용

--객체 조립(composite)를 통해 이런 문제를 해결 할 수 있지만 런타임 구조가 복잡해진다. 하지만 수정의 유연함이 더 용이하다.

 

-상속을 사용해야 할때 = 사실상 "재사용"이 아닌 "확장"에 초점을 맞추어야 한다.

 


객체체지향 프로그래밍의 종류

 

1. 클래스 기반

클래스기반 언어에서 객체는 일반적으로 두 가지 형태가 있다. '클래스'는 객체의 기본적인 만듦새와 기능을 정의하고, '인스턴스'는 "사용할 수 있는" 객체로 특정 클래스의 양식을 기반으로 한다. 클래스기반 언어에서 '클래스'는 동작 방식인 메소드의 모임으로 동작하고, 모든 인스턴스의 구조는 동일하고, 인스턴스는 객체의 자료를 가지고 있다. 한쪽에는 구조와 동작 방식, 다른 한쪽에는 상태로 구분된다.

 

객체 생성

클래스기반 언어에서, 클래스의 생성자를 통하거나 필요하다면 생성자와 생성자의 매개변수를 통하여 인스턴스를 새로 만든다. 결과로 만들어진 인스턴스는 선택된 클래스의 설계와 행동을 따르게 된다.

 

 

 

2. 프로토타입 기반

ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85_%EA%B8%B0%EB%B0%98_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67

클래스가 없으므로 상속성도 없다.

객체를 원형(prototype)으로 하여 복제의 과정을 통하여 객체의 동작방식을 다시 사용할 수 있게 한다.

프로토타입기반 프로그래밍은 클래스리스(class-less), 프로토타입 지향(prototype-oriented) 혹은 인스턴스 기반(instance-based) 프로그래밍이라고도 한다.

 

 

객체 생성

프로토타입기반 체계에서, 새 객체를 만드는 두 가지 방법이 있다. 하나는 원래 있던 객체를 '복제(cloning)'하는 방법이고, 다른 하나는 '무(無)에서(ex nihilo)' 객체를 생성하는 방법이다. 대부분 다양한 복제 방식을 제공하기 때문에, 무에서 객체를 생성하는 것은 흔하지 않다.

'면접준비 > 직무면접' 카테고리의 다른 글

[DB] DB, DBMS, 스키마  (0) 2021.03.30
C++  (0) 2019.11.09
C  (0) 2019.10.27
정렬  (0) 2019.10.25
배터리  (0) 2019.09.08
Comments