객체를 주된 관심을 삼는 프로그래밍 방법론
데이터 흐름(flow)에 기반한 절차지향적 프로그래밍은 복잡한 로직을 갖는 큰 규모의 소프트웨어 개발에는 적합하지 않음.
고로, 함수(procedure)단위로 나누어 구조화하는 구조적 프로그래밍 방법이 대두되었고 top-down 방식으로 이루어짐.
하지만 함수는 데이터를 처리하는 부분은 구조화할 수 있었지만 데이터는 구조화하지 못해 전역 네임스페이스 포화 문제를 유발하게 됨.
—> 함수에 연향을 주는 변수를 어떻게 추적하냐고
객체지향 언어 두두 등장!!
얘는 bottom -up방식!!큰 문제를 잘게 쪼개는 방식이 아니라 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰문제를 해결하고자 하는 것
즉, 각각의 객체들은 다른 객체들과 독리적으로 운용이 가능하며, 객체 외부에서 접근이 가능한 인터페이스를 제한하여 잘못되어지는 경우를 최소화. 코드를 한꺼번에 수정해햐하는 일이 안생기는데 이걸 약한 결합관계(weak coupling)이라고 함.
결국 유지관리비용이 적게들고, 외부에서 사용하는 인터페이스 외에는 객체 내부로 숨겨(information hiding) 객체의 기능(method)이나 속성(property)이 설계와 다르게 동작할 위험을 최소화 할 수 있기 때문에 신뢰성이 높음. 이렇게 독립성/신뢰성을 높게 설계해놓으면 별다른 수정없이 재사용할 수 있고 수정도 간소화됨.
추상화를 통해 줄이고 줄여서 뽑아낸 공통적인 특징들은 크게 속성(attribute)과 행위로 나뉘게 되는데 이것들을 묶어놓은 것을 캡슐화라고함. 그리고 관련있는 것들을 하나로 묶는 추상적인 주체가 클래스임.
객체(object)는 클래스로부터 실체화된 것을 말함. 고양이라는 클래스가 있다면, 내친구 고양이 나비는 객체인것
속성과 행위들을 관련있는 것끼리 묶는 것, 외부에서 접근이 필요한 부분을 제외하고는 내부로 숨기는 것.(ex. 알약 성분을 굳이 알 필요 없는것처럼)
—> 세부 구현을 숨기는 목적은 내부구현의 응집도와 외부 다른 클래스와의 결합도를 낮추는데 있다.
public - 클래스 외부에서 제한없이 접근 가능
private - 클래스 외부에서 접근 불가(클래스 내부에서만 가능)
protected - 상속한 하위 클래스에서만 접급 가능
대상이 되는 클래스의 모든 특징들을 물려받는 것을 말함. 어떤 임의의 클래스 b가 다른 클래스 a를 상속받게 되면 a클래스의 속상과 행위들을 모두 물려받게 됨. 이때 a와b는 상속관계에 있다고 하며, 클래스 a를 부모클래스, b는 자식클래스라고한다.
어떤 클래스를 이미 상속받은 클래스를 다른 클래스가 상속받을 수 있다.
WheeledVehicle 클래스는 Vehicle클래스의 Child클래스인 동시에 Bicycle이나 Car클래스의 Parent클래스가 되는 것. 이러한 형태를 계층형 구조라고 한다. 아래로 내려갈수록 구체화된다고 하고 위로 갈수록 일반화된다고 한다. 이때 클래스가 구체화될수록 고유의 특징들이 많이 생겨나게 되고, 일반화될수록 더 많은 객체에 영향을 주게됨.
부모클래스로부터 특징을 물려받게 되면 이미 구현된 세부내용을 다시 구현할 필요가 없기 때문에 코드의 재사용성이 향상됨.
*상속관계가 성립하려면 두 클래스 간 관계가 is-a[은-이다]관계여야함. ex)사과는 과일이다???자식클래스를 부모클래스로 대체하여도 의미가 성립되어야 한다는 것.
***has-a관계 주의요망 - 사람,팔/자동차-바퀴 등 하나의 클래스가 다름 클래스의 일부로 속할 때!고로 얘는 재사용하기 어려움
여러 형태가 존재한다. 하나의 속성이나 행위가 상황에 따라 다른의미로 해석될 수 있다는 특징을 말함. 키패드로 다이얼을 누르기도하고, 문자를하기도하고, 게임을 하는것처럼!!모양은 같은데 다른 기능을 하는 것을 의미한다.
#overriding
#overloading
다형성을 구현하는 방법 중에 대표적인 방법이 바로 상속이다.
객체지향이란 프로그래밍 방법론이다. 바닥닦기 클래스, 창문닦기 클래스, 물걸래 클래스
클래스라느 아이템과 동작들이 묶어져서 캡슐화된 컴퓨터 자원의 묶음을 객체라고 한다.
은닉성도 참고 - 내부구조는 그닥 중요하지않은것 밖에서 간섭으로 인한 오류 방지
#######################FP란
FP는 프로그래밍을 함수의 조합으로 이해하려는 접근 방식
함수란, 데이터가 들어가면, 그 데이터에 따른 결괏값을 제공하는 도구. 이러한 함수를 재사용하기 좋은 방식으로 쪼개고 조합해서 사용하는 방식으로 중복을 해결함.
마치 컨베이어 벨트에 재료를 넣으면 각 공정을 거쳐서 제품이 나오는 것과 같음.
그럼 그냥 function을 쓰면 그게 FP냐? 라고 생각할 수 있지만 그건 아님. FP에서의 function은 순수함수(pure function)을 의미함. 순수함수란 함수가 함수 바깥의 세계에 미치는 영향이 없으며, 같은 인풋이 들어갔을 때 항상 같은 아웃풋이 기대되는 것을 말함
OOP랑 FP랑 그렇게 다른 야?
사실 둘 다 튜링 완전성을 가지고 있어서 구현하지 못하는 것은 없다고 함. 다만 프로그램을 대하는 방식이 다른 것뿐.
둘이 완전히 반대되는 개념도, 적대하는 개념도 아님. 둘 중에 하나에 특화된 프로그래밍 언어들이 있지만, 그런 언어에서조차 다른 프레임워크의 사고방식을 차용한 구현을 할 수 있다고 함. 예를 들어 FP적 사고로 만들어진 메서드가 사용되는 클래스가 있다면 이는 둘을 섞어서 사용했다고 볼 수 있음