✔️ 객체 지향 프로그래밍
객체 지향 프로그래밍이란?
- 객체란 현실 세계의 실체 및 개념을 반영하는 상태와 행위를 정의한 데이터의 집합
- 객체 지향 프로그래밍이란 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고
그 객체들 간에 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 - 누군가가 만든 클래스를 가져와 사용할 수 있고 상속을 통해 확장할 수도 있어 코드의 재사용성이 높음
- 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메소드로 존재하기 때문에 해당 부분만 수정할 수 있어 유지보수가 쉬움
- 클래스 단위로 모듈화시켜 개발할 수 있으므로 강한 응집력과 약한 결합력을 가져 업무 분담이 쉬워 대형 프로젝트에 적합
- 반면, 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로
실행 시스템에 많은 오버헤드가 발생하여 처리 속도가 C/C++에 비하여 상대적으로 느리며, 객체가 많으면 용량이 커질 수 있음 - 또한 객체가 상태를 갖기 때문에 예상치 못한 부작용이 발생하여
애플리케이션 내부에 버그를 발생시킬 수 있으므로 설계 시 많은 노력과 시간이 필요함
객체 지향 프로그래밍과 절차 지향 프로그래밍의 차이
- 객체 지향 프로그래밍
- 실세상의 물체를 객체로 표현하고, 이들 사이의 관계, 상호 작용을 프로그램으로 나타냄
- 객체를 추출하고 객체들의 관계를 결정하고 이들의 상호 작용에 필요한 함수(메소드)와 변수(필드)를 설계 및 구현함
- 객체 지향의 핵심은 연관되어 있는 변수와 메소드를 하나의 그룹으로 묶어서 그룹핑하는 것
- 사람의 사고와 가장 비슷하게 프로그래밍을 하기 위해서 생성된 기법
- 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 됨
- 절차 지향 프로그래밍
- 실행하고자 하는 절차를 정하고, 이 절차대로 프로그래밍하는 방법
- 목적을 달성하기 위한 일의 흐름에 중점을 둠
객체 지향 프로그래밍의 특징
- 추상화
- 불필요한 정보는 숨기고 필요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 구체적인 사물의 공통적인 특징을 파악해서 이를 하나의 개념으로 다루는 것
- 캡슐화
- 속성과 기능을 정의하는 멤버 변수와 메소드를 클래스라는 캡슐에 넣는 것
- 관련된 기능(메소드)과 속성(변수)을 한 곳에 모으고 분류하기 때문에 재활용이 원활
- 높은 응집도와 낮은 결합도를 유지하여 유연함과 유지보수성이 증가
- 또한 캡슐화를 통해 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 정보 은닉이 가능
- 상속
- 부모 클래스의 속성과 기능을 그대로 이어 받아 사용할 수 있게 하고
기능의 일부분을 변경해야 할 경우, 상속 받은 자식 클래스에서 해당 기능만 다시 정의하여 사용할 수 있게 하는 것 - 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있음
- 또한 코드를 공통적으로 관리하여 코드 추가 및 변경이 용이
- 부모 클래스의 속성과 기능을 그대로 이어 받아 사용할 수 있게 하고
- 다형성
- 하나의 변수명, 함수명 등이 상황에 따라서 다른 의미로 해석될 수 있는 것
- 오버라이딩(매개변수의 유형과 개수가 다른 같은 이름의 메소드 정의),
오버로딩(상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의)이 가능
객체 지향 설계 원칙
- 단일 책임 원칙 (SRP : Single Responsibility Principle)
- 클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 함
- 개방 폐쇄 원칙 (OCP : Open Closed Principle)
- 확장(기능의 추가)에는 열려 있고, 변경(기존 코드의 변경)에는 닫혀있어야 함
- 리스코프 치환 원칙 (LSP : Liskov Substitution Principle)
- 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 함
- 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 함
- 인터페이스 분리 원칙 (ISP : Interface Segregation Principle)
- 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 함
- 의존 역전 원칙 (DIP : Dependency Inversion Principle)
- 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존해야 함
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됨
'Tech Interview > Language' 카테고리의 다른 글
[Language] 값에 의한 호출 & 참조에 의한 호출 (0) | 2024.03.11 |
---|---|
[Language] Java의 데이터 타입 (0) | 2024.03.06 |
[Language] 가비지 컬렉션 (0) | 2024.03.05 |
[Language] Java 컴파일 과정 (0) | 2024.03.04 |
[Language] 자바 가상 머신 (0) | 2024.02.21 |