[개체지향] 개체지향 프로그래밍의 필요성
개체지향 프로그래밍의 필요성
구조체의 한계
절차적 언어의 아쉬운 점
- 데이터의 비인간화
- 데이터가 많아지면 관리가 힘듬
구조체의 등장
- 데이터를 그룹으로 묶어 새로운 데이터 형을 만드는 방법
- 하나의 변수처럼 사용
struct Human //구조체의 선언
{
int age;
float height;
}
Human dave; //구조체 변수의선언
Human fioan
구조체의 한계
- 데이터와 동작이 분리되어 있음.
- 어떤 구조체가 어떤 함수란 연관 있는지 찾기 복잡함.
보완 : 파일 단위로 분리
하지만 언어자체에서 지원이 아님
보다 근본적인 문제
실세계에서 사람은 어떻게 생각하고 행동할까?
- 누구에게 말하고 있는가? : 실세계에서 누군가에게 이 말을 함.
- 미용사가 아이의 모든 정보를 알아야 하나? : 필요한 정보만 공개
사람은 세상을 물체(object)의 집합으로 인지.
일반적인 이야기 : 모든 것을 물체로 보진 않음 object를 프로그래밍에서는 객체 또는 개체라 번역. 물체는 상태를 가질뿐만 아니라 동작도 할 수 있음.
상태와 동작
- 프로그래밍에서 변수는 상태를 저장
- 동작 : 함수
- 개체란 상태(변수 데이터) 외에 동작(함수)까지 포함
모든것이 개체는 아니다.
개체지향 프로그래밍
- object oriented programming
- 프로그래밍 패러다임 중 하나
- 프로그램을 구성하는 기본 요소를 개체로 보려는 노력.
- OOP에서 프로그램이란?
- 상호작용하는 개체들의 집합
- 절차적 프로그래밍은 실행할 명령어의 목록을 프로그램으로 봤음
절차적 프로그래밍은 매우 객관적
- 기계어는 위에서 아래로 차례대로 실행됨
- 어셈블리 명령어는 거의 모든 경우 기계어로 1:1 치환가능
- C 언어로 작성한 코드 한 줄은 보통 어셈블리 명령어 몇 개로 치환 가능
- 함수 호출은 특정 메모리 위치로 jmp해서 순서대로 명령어를 실행하는 것
- 그 명령어 실행 결과에 따라 레지스터 또는 메모리에 저장된 데이터가 변경
어떤 프로그램이라도 최종적으로는 절차적으로 돔
- OOP는 기계처럼이 아니라 사람처럼 생각하자는 운동
- 주관적
- 사회와 기술이 발전함에 따라 사람들이 사고방식도 변함
oop는 주관적
- 70+년 역사 동안 다양한 학설 및 의견이 등장하고 사라짐
- object에 대한 정의조차 다양했음
- 오늘날에도 어떤 자료를 보고 배웠냐에 따라 정의가 달라짐
다수가 따르는 OOP 개념이 있음
- JAVA C# C++등 주류 OOP언어들이 교통정리를 끝냄
- 많은 사람들이 따르고있음
OOP 토론 시 피해야 할 사람
올바른 OOP가 아니야!
- 특정 소수설의 관점을 지지하는 사람
- 역사적 가치가 있는 주장도 있음
- 특수한 상황에서 올바른 방법이기도함.
- 일반적으로 해가 되기 쉬움
- 남들이 신경 안 쓰는 내용을 안다고 자신이 똑독한 사람은 아님
- 진실을 전파하는 유일한 방법 : 장점을 최대한 객관적으로 보여준다.
순수 OOP 언어가 아니야!
- 순수 OOP 정의는 존재하지 않음.
- 모두가 동의하는 최소한의 특성은 있음
- 순수 OOP를 주장하는 사람들의 흔한 패턴
모든 프로그램은 OOP로 만들어야 해!
- OOPO가 절차적 프로그래밍을 완전히 대체할 거라는 주장도 있었음
- 새로운 기법이 처음 등장할 때 많이 보이는 잘못된 주장
- 요즘에는 다른 패러다임이 OOP를 완전히 대체할 거란 주장도 종종보임
- 역사적으로 사실이 아님이 증명됨
- OOP가 주류고 한동안 이어질것
~한 ~가 이리 말했으니 너는 틀려!
- 그릇된 권위에 호소
- 용어 처음 주창한 사람에 따르면~
- ~책에 따르면
- 제대로 된 실무자 또는 학자라면 ‘과학적 사고방식’을 따름
이 방법만 따르면 문제가 해결돼!
- 훌륭한 프로그래머는 해결하려는 문제에 적절한 도구를 사용
믿고 거르자
OBJECT
- 개체란 서로 연관 있는 상태와 동작을 가지고 있다.(캡슐화)
- 사람들은 기본적으로 세상을 개체들의 모음으로 본다.
oop의 4대 특성
7대 개념
- encapsulation
- inheritance
- polymorphism
- abstraction
- association
- composition
- aggregation
캡슐화
- 데이터와 그 데이터에 작용하는 메서드를 하나로 묶음
- 정보 숨기기 개체 안에 있는 데이터를 외부로부터 보호
상속
진화
- 이미 존재하는 개체를 기반으로 확장된 개체(클래스)를 만드는 방법
- 확장된 개체
- 기존의 개체에 속한 데이터와 동작을 모두 물려 받음
- 여기에 다른 데이터나 동작을 추가할 수 있음
- 코드의 중복을 막음
- 사람에게는 점진적 학습이 가장 효율적
다형성
같은 지시를 내렸는데 다른 종류의 개체가 동작을 달리하는 것.
- 동일한 함수 시그내처 호출
- 개체에 따라 달리 동작.
함수 구현이 실행될지는 실행 중에 결정됨 늦은 바인딩late binding이라 함
일반적인 함수 호출은 이른 바인딩early binding 컴파일중에 결정됨
다형성의 혜택을 받으려면 상속 관계가 필요
- 부모 개체에서 함수 시그내처를 선언
- 자식 개체에서 그 함수를 다르게 구현
-실용적인 용도: 다른 종류의 개체를 편하게 저장 및 처리 가능 bird cat dog등을 animal배열에 저장
- subtype 다형성 다형성은 99%이것을 지칭
다른 다형성
- 애드혹ad-hoc 다형성
- 함수 오버로딩, 연산자 오버로딩
- 함수명은 같은데 매개변수 목록이 다름
- 매개변수 다형성
- C#과 java의 제네릭
- C++의 템플릿
허나 둘 다 일반적으로 다형성이라고 안 부름 OOP하고도 상관없음
데이터 추상화
- 수학 : 일반화란 의미(반의어 : 구체화)
-
OOP : 개체 속에 있ㄴ느 실제 데이터나 함수 구현 방법에 종속되지 않겠단 뜻
- 데이터 추상화 : 개체 사용 시 그 안에 정확히 어떤 데이터가 있는지 알 필요 없음, 개체 안에 잇는 데이터에 직접 접근 불가
- 캡슐화는 데이터 추상화를 이루는 방법 중 하나
- 추상화
- 다형성을 통한 추상화
- 추상 클래스(abstract class)나 인터페이스(interface)를 사용하는 추상화
연관
어떤 개체가 제공하는 기능을 다른 개체가 이용하는 관계 상속과 비교해서 설명
- 상속은 자식 개체가 부모 개체의 모든 것을 내포하는 관계
- 연관은 한 개체가 다른 개체를 참조하는 관계
-
실세계에서 개체들이 상호작용하는 모습은 보통 연관과 비슷함
- 세부적으로 다시 집합과 컴포지션으로 나누기도 함
- 특히 UML이란 다이어그램을 그릴때
- 이 셋을 구분하지 않고 다 합쳐서 컴포지션이라 하기도 함.
컴포지션
부품
집합과의 차이 : 부품 그 자체로는 존재 의의가 없음 조립품이 소멸할때 부품도 같이 소멸
집합
A대학에 등록한 학생들
역시 여러개체를 모아 다른 개체를 만들지만 별도로도 존재 가능