객체지향 프로그래밍
데이터를 객체로 추상화시켜서 이러한 객체 간의 상호작용으로 로직을 구성하는 프로그래밍 방법
객체 지향 프로그래밍의 특징 : 캡상추다
- 캡슐화 : 외부로부터 데이터를 보호하는 것.
- 예를 들어 인스턴스 변수의 접근 제어자를 private으로 바꿔 외부의 접근을 막는 것.
- 상속 : 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.
- 추상화 : 객체들의 공통적인 특징을 뽑아내는 것.
- 예를 들어 인터페이스, 추상 클래스가 있다.
- 코드의 중복을 줄일 수 있고, 유지보수에 용이하게 된다. : 추상화된 존재에 의존하도록 프로그램을 설계하면 하위 클래스드르이 변경에도 영향이 덜 끼치게 된다
- 다형성 : 프로그래밍 언어의 요소들이 다양한 자료형 type에 속할 수 있는 성질
자바 객체 지향 원칙 SOLID
- 단일 책임 법칙 : 한 클래스는 하나의 책임만 가져야한다.
- 책임이라는 것은 모호.
- 중요한 기준은 변경이다. 변경이 있을 때 파급효과가 적으면 단일 책임 원칙을 잘 따른 것.
- 개방 폐쇄 법칙 : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 확장하려면 당연히 기존 코드를 변경해야하는 것 아님? → 다형성 활용
- ex) 인터페이스를 구현한 새로운 구현 클래스를 만들어서 기능을 구현
- 새로운 클래스를 통해 확장
- 기존 코드의 변경이 일어나지 않음.
- 리스코프 치환 법칙 : 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것.
- ex) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능, 뒤로 가게 구현하면 LSP 위반, 느리더라도 앞으로 가야함
- 인터페이스 분리 법칙 : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 자동차 인터페이스 → 운전 인터페이스, 정비 인터페이스로 분리
- 사용자 클라이언트 → 운전자 클라이언트, 정비사 클라이언트로 분리
- 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음.
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.
- 의존관계 역전 법칙 : 추상화에 의존해야지, 구체화에 의존하면 안된다.
- 의존관계 주입은 이 원칙을 따르는 방법 중 하나
- → 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻. 덕분에 유연하게 구현체를 변경할 수 있다. 구현체에 의존하게 되면 변경이 어려워진다.
앨런 케이가 말하는 객체지향 프로그래밍의 본질!!
- 캡슐화 : 관련있는 데이터와 프로시져(조건문, 반복문과 같은 것을 포함한 절차)를 찾아서 묶고 다른 객체가 내부를 건드리지 못하게 한다.
- 메시징 : 다른 객체의 데이터나 프로시저가 필요할 때는 메시지 요청을 한다. 메시지를 받는 객체는 스스로 처리 방법을 선택한다.
- 동적 바인딩 : 메시지를 받는 객체는 그 때 그 때 달라질 수 있다.
캡슐화, 메시징, 동적 바인딩을 통한 장점
- 변경 가능한 공유 데이터가 최소로 줄어든다.
- 관련 있는 프로시져와 데이터를 묶은 다음, 다른 객체는 접근할 수 없다.
- 다른 객체의 상태를 알아내거나 바꾸려면, 해당 객체가 정해놓은 형식으로 메시지를 보내는 방식밖에 없다.
- 이걸 캡슐화라고 한다.
- 구현 부분을 쉽게 바꿀 수 있다.
- 메시지를 받는 부분만 일관되게 유지하면, 실제로 그걸 처리하는 코드는 바뀌어도 실행에 문제가 없다.
- 메시지를 보내는 것은 단순히 함수를 호출하는 것과는 다르다.
- 다른 객체가 돈을 달라는 메시지를 보내면, 지갑에서 돈을 꺼내주는, 옆에 있는 친구한테 돈을 빌리든 받는 객체가 알아서 결정한다.
- 메시지를 실제로 처리하는 객체를 쉽게 바꿀 수 있다.
- 기능의 변경이 쉬워진다.
- 메시지를 보내는 코드는 컴파일 타임에 이미 결정되지만, 실제로 어떤 객체가 그 메시지를 받아서 처리할지는 런타임에 결정된다. 이걸 동적 바인딩이라고 한다.
메시징과 다형성
여러 곳에서 메시지를 통해 소통이 가능한 것이다. 메시지 처리 방법은 메시지를 받는 객체가 스스로 처리 방법을 결정한다.
이는 곧 다형성으로 가능하다고 생각한다. 다형성은 프로그래밍 요소들이 다양한 자료형으로 변하는 성질이다. 대표적으로 오버라이딩, 오버로딩이 있다.
메시징이란 것은 결국에는 구현 내용을 정확히 몰라도 각자가 알아서 기능을 처리할 수 있어야 하는데, 각자 알아서 내용을 구성한다는 것은 오버라이딩과 오버로딩처럼 다형성이 있기 때문에 가능하다고 생각한다.
캡슐화에 대해 설명해주세요
관련있는 데이터와 프로시져를 찾아서 묶고 다른 외부 객체가 내부를 건드리지 못하게 한다. 외부로부터 데이터가 보호된다. 이를 캡슐화라고 한다.
예를 들어 private 인스턴스 필드로 접근 제어자를 설정해 외부의 접근을 막는 것이 있다.
다른 객체들은 오직 메시징을 통해서만 소통이 가능하다. 메시징으로만 통신하니까 기능 변경 시에도 메시지 구현 내용만 바꾸면 된다.
또 단일 책임 법칙과 관련해서 관련있는 데이터나 프로시저가 하나의 클래스로 묶여있는 것이기 때문에 즉, 변경이 일어날 부분이 하나의 클래스에 모아져있는 것이기 때문에 코드 변경이 쉬워진다. 주위에 다른 클래스에 변경의 파급 효과가 퍼지지 않도록 해준다.
참고
인프런 JPA 인강
https://velog.io/@eddy_song/alan-kay-OOP
자바의 신