728x90
객체 지향 프로그래밍( Object-Oriented Programming, OOP)
프로그래밍 패러다임 중 하나로, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
OOP의 기본 구성 요소
- 클래스
- 같은 종류의 집단에 속하는 속성과 행위를 정의한 틀 같은 것.
- 다른 클래스와 독립적으로 디자인 해야한다.
- 객체
- 클래스의 인스턴스이다.
- 자신 고유의 속성을 가지며, 클래스에서 정의한 행위를 수행할 수 있다.
- 메서드
- 객체끼리 소통을 하는 방법
- 클래스로부터 생성된 객체를 사용하는 방법, 객체의 속성을 조작할 때 사용
인스턴스 : 소프트웨어 세계에서 구현된 실체
객체 : 소프트웨어 세계에서 구현해야 할 대상
장·단점
- 장점
- 재사용성이 높다.
- 다른 곳의 클래스를 가져와 사용하거나, 상속을 통해 추가,확장해서 사용할 수 있기때문
- 유지보수가 쉽다.
- 객체 단위로 코드가 분리되어 있기때문
- 대형 프로젝트에 적합하다
- 모듈화시켜 개발할 수 있으므로 여러 사람이 개발가능.
- 재사용성이 높다.
- 단점
- 실행 속도가 상대적으로 느리다.
- 절차지향 언어는 컴퓨터의 처리구조와 실행순서가 비슷하기 때문에 속도가 빠르다.
- 객체간에 메시지를 통해 실행하기 때문
- 설계 비용이 크다
- 객체간의 상호작용이 필수기 때문에 초기 설계에 많은 시간,비용이 필요하기 때문
- 실행 속도가 상대적으로 느리다.
4가지 특징
- 캡슐화
- 한 객체가 특정한 하나의 목적을 위해 필요한 변수,메서드를 하나로 묶는 것을 의미.
- 외부에서의 접근을 제한하고, 내부를 보호한다.
- 유지보수 효율, 재사용성을 높일 수 있다.
- 상속
- 상위 클래스의 기능을 물려받아 하위클래스의 기능을 정의하는 것
- 다형성
- 각기 다른 객체가 동일한 동작을 명령 받았을 때 각 객체의 특성에 맞게 동작하는 것
- 상속을 통해 기능 확장 및 변경을 가능하게 해준다. 이를 통해 코드의 재사용을 가능하게 하며, 유지보수가 용이하도록 도와줌
- 추상화
- 객체들이 공통적으로 필요로 하는 속성, 동작을 하나로 추출
- 객체의 복잡한 내부를 숨기고, 필요한 부분만 간추려 표현하는 것
객체 지향 프로그래밍 5원칙
- SRP (Single Responsibility) 단일 책임 원칙
- 클래스는 단 한개의 책임을 가져야 함
- 클래스를 변경하는 이유는 단 하나여야 함
- 이를 지키지 않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있음
→ 이렇게 되면 유지보수가 매우 비효율적
- OCP (Open-Closed) 개방-폐쇄 원칙
- 확장에는 열려있어야 하고, 변경에는 닫혀 있어야 함
- 즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함
- 이를 지키지 않으면 instanceof 와 같은 연산자를 사용하거나, 다운 캐스팅 발생
- LSP (Liskov Substitution) 리스코프 치환 원칙
- 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
→ 즉, 상위 타입 객체를 하위 타입 객체로 치환해도 정상적으로 동작해야 함 - 상속관계에서는 꼭 일반화 관계 (IS-A) 가 성립해야 한다는 의미 (일관성 있는 관계인지)
- 상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배됨 (재사용 목적으로 사용하는 경우)
- 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
- ISP (Interface Segregation) 인터페이스 분리 원칙
- 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
→ 하나의 통상적인 인터페이스보다는 차라리 여러 개의 세부적인 (구체적인) 인터페이스가 나음 - 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함
- DIP (Dependency Inversion) 의존 역전 원칙
- 의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에 의존해야 함
→ 구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻 - 즉, 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됨
- 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
- 저수준 모듈이 변경되어도 고수준 모듈은 변경이 필요없는 형태가 이상적
- 의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에 의존해야 함
728x90
'STUDY > JAVA' 카테고리의 다른 글
JAVA-동작 원리 (0) | 2023.12.28 |
---|