객체 지향 프로그래밍이란?
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위인 객체들의 모임으로 파악하고자 하는 것이다. 객체는 서로 메시지를 주고받고, 협력하여 데이터를 처리할 수 있다. 객체 지향 프로그래밍은 프로그램을 유연하고 변경에 용이하게 만든다.
SOLID 원칙
단일책임원칙(SRP): 하나의 클래스는 하나의 책임만 가져야 한다. 변경이 일어날 때 파급력을 최소화해야 한다.
개방폐쇄원칙(OCP): 소프트웨어 요소는 확장에는 열려있고 변경에는 닫혀있어야 한다.
다형성을 이용해도 클라이언트 코드의 변경이 일어나기 때문에 OCP 원칙을 지키기 위해서는 객체를 생성해주고 연관 관계를 맺어주는 별도의 조립, 설정자가 필요하다.
리스코프치환원칙(LSP): 프로그램의 객체는 언제든지 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
하위 클래스는 상위 클래스(인터페이스)의 규약을 위반하지 않고 지켜야 한다.
즉, 오버라이딩을 할 때 잘못된 재정의를 하면 안 된다. 인터페이스를 구현한 구현체를 믿고 사용하기 위한 원칙.
인터페이스분리원칙(ISP): 특정 클라이언트를 위한 여러 개의 인터페이스가 하나의 범용 인터페이스보다 낫다.
의존관계역전원칙(DIP): 프로그래머는 추상화에 의존해야지 구체화에 의존하면 안 된다.
구현체에 의존하지 말고, 인터페이스에 의존하라
1. 캡슐화
필드와 메서드를 하나의 클래스로 묶는 것
객체 내부 구조를 감추고, 객체가 제공하는 (필드) 또는 메서드를 통해서만 접근 가능
객체를 모듈화할 수 있어서 독립성 및 이식성이 좋음
정보 손상 및 오용을 방지
- 접근제어자(modifier)
public | 모두 접근 가능 |
protected | 같은 패키지 내 또는 다른 패키지의 자손 클래스에서 조상 클래스의 protected 접근 가능 |
(default) | 같은 패키지 내 |
private | 같은 클래스 내 |
*클래스 앞: public, default
*멤버 앞: 모두 사용 가능
- Java Bean 규약
기본 생성자
private 속성
public으로 선언된 getter/setter 메서드를 통해 속성에 접근
2. 상속
이미 작성된 클래스(조상)의 모든 속성과 메서드를 물려받는 것
필요에 따라 새로운 멤버를 추가하거나, 재정의할 수도 있음
중복 코드 제거, 다형성 활용 가능
- 오버라이딩
상속 관계에서 조상클래스의 메서드를 자손클래스에서 재정의하는 것(구현을 재정의)
부모의 메서드와 이름, 매개변수, 반환타입이 같아야 함
접근제어자는 부모의 것보다 같거나 더 넓은 범위로 해야 함
부모보다 더 큰 예외를 선언할 수 없음
cf.오버로딩
과적하다 라는 의미
같은 이름의 메서드를 더 정의하는 것
메서드 이름은 같지만 매개변수 리스트가 다름(타입, 개수, 순서)
반환타입은 상관 없음
3. 추상화
복잡함을 간소화하기 위해 공통 부분, 핵심 부분을 추출하여 표현하는 것
추상클래스: abstract 키워드, 추상 메서드를 가질 수 있는 클래스, 인스턴스화 불가, 상속을 통해 하위 클래스가 구현
추상메서드: abstract 키워드, 선언부만 있고 구현부가 없는 메서드, 상속 받은 클래스는 반드시 구현을 해야 함
인터페이스: 관련 기능의 집합, 추상 메서드와 상수만으로 이루어진 개체, 클래스는 implements 하여 추상 메서드를 구체화
4. 다형성
여러 가지 형태를 가질 수 있는 것으로, 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 다형성을 구현
부모 클래스의 변수에 자식 클래스의 인스턴스를 할당할 수 있다.
동적바인딩: 실행 시에 변수가 실제로 참조하는 객체의 타입을 기준으로 메서드를 호출(오버라이딩)
다형성의 장점
인터페이스를 구현한 구현체를 실행 시점에 유연하게 변경할 수 있다.
(+클라이언트를 변경하지 않고, 서버의 구현을 유연하게 변경할 수 있다.)
+
그렇다면, 좋은 객체 지향 프로그래밍이란? 유연하고 변경에 용이하다는 것 = 다형성 극대화
인터페이스만 알면 구현체의 내부 로직을 몰라도 된다.
구현체 자체를 변경하거나 내부 구조의 변경이 일어나도 클라이언트는 영향을 받지 않음. (확장, 변경에 용이)
프로그램을 설계할 때 역할(인터페이스)과 구현(구현 클래스, 구현 객체)을 명확히 분리하여 설계
단, 인터페이스의 변경은 영향이 큼. 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
https://www.yes24.com/Product/Goods/24259565
https://abcdefgh123123.tistory.com/336
'Java' 카테고리의 다른 글
[Java] String, StringBuilder, StringBuffer의 차이 (0) | 2022.08.01 |
---|---|
[Java] 문자열 비교와 문자열 풀(String Pool) (0) | 2022.07.31 |
[Java] 객체의 생성과 사용 (0) | 2022.07.31 |
[Java] enum 사용해보기 (0) | 2022.07.29 |
[Java] for문 사용 시 유의해야 할 점 (0) | 2022.07.28 |