728x90
❓OOP란
- 우리가 보고 인지하는 실제 세계를 흉내내어 가장 기본적인 단위인 객체들을 만들고, 그것들 간의 유기적인 상호 작용을 규정하여 프로그램을 발전시키는 프로그래밍 방법론
1. 추상화
- 객체의 공통적인 속성(변수)와 기능(메서드)를 추출하여 정의하는 것
- 자바에서 추상화를 구현할 수 있는 문법 요소로는 추상 클래스와 인터페이스가 있다.
- 객체 지향적 설계에 있어서 인터페이스는 어떤 객체의 역할만을 정의하여 객체들간의 관계를 보다 유연하게 연결하는 역할을 담당한다.
- 인터페이스에는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 프로그램을 설계하는 것이다.
- 역할과 구현의 분리
- 객체 지향 프로그램에서는 보다 유연하고 변경에 열려있는 프로그램을 설계하기 위해 역할과 구현을 분리하는데, 여기서 역할에 해당하는 부분이 인터페이스를 통해 추상화될 수 있다.
2. 상속
- 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소
- 상속은 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 사용할 수 있도록 한다.
- 상속 관계의 경우 인터페이스를 사용하는 구현에 비해 추상화의 정도가 낮다.
- 공통점: 상속과 인터페이스를 통한 구현 모두 상위 클래스 - 하위 클래스의 관계를 전제하면서 공통적인 속성과 기능을 공유할 수 있다.
- 차이점
- 상속: 상위 클래스의 속성과 기능들을 하위 클래스에서 그대로 받아 사용하거나 오버라이딩을 통해 선택적으로 재정의할 수 있다.
- 인터페이스를 통한 구현: 반드시 인터페이스에 정의된 추상 메서드의 내용이 하위 클래스에서 정의되어야 한다.
3. 다형성
- 객체 지향 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것이다. 좀 더 구체적으로, 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있도록 하는 것이다.
- 하위 클래스의 객체를 생성하여 상위 클래스 타입의 참조변수 car2에 할당해준다.
Vehicle car2 = new Car();
- 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성
- 대표적인 예로 메서드 오버라이딩과 메서드 오버로딩이 있다.
- 메서드 오버라이딩: 각각의 클래스의 맥락에 맞게 재정의. 즉, 같은 이름의 메서드가 상황에 따라 다른 역할을 수행하는 것.
- 메서드 오버로딩: 하나의 클래스 내에서 같은 이름의 메서드를 여러 개 중복하여 정의하는 것.
📌 장점
- 다형성을 활용하면 여러 종류의 객체를 배열로 다루는 일이 가능해진다.
- 즉, 하나의 타입만으로 여러 가지 타입의 객체를 참조할 수 있어 보다 유연하게 코드 작성이 가능하다.
- 메서드의 매개벼수로 인터페이스 타입의 참조변수를 전달한다.
- 그러면 각각의 클래스 내부의 변경이나 다른 객체가 새롭게 교체되는 것을 신경쓰지 않아도 인터페이스에만 의존하여 수정이 있을 때마다 코드 변경을 하지 않아도 된다.
🎯 여전히 남은 문제
- 실행 클래스의 코드에서 객체를 생성할 때, 객체에 직접적으로 의존하고 있어서 해당 객체를 다른 객체로 변경할 시 코드의 변경이 불가피하다. 즉, 객체 간 높은 결합도를 보이는 상황이 초래된다.
- 이 문제를 해결하기 위해 등장한 것이 의존관계 주입이라고 부르는 스프링 프레임워크의 핵심적인 개념이다.
4. 캡슐화
- 클래스 안에 서로 연관있는 속성들과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것이다.
- 자바 객체 지향 프로그래밍에서 캡슐화를 구현하기 위한 방법
- 접근제어자를 활용
- getter/setter 메서드
- 클래스 내 모든 속성값들이 private 접근 제어자로 선언되어 있고, getter/setter 메서드의 접근제어자만이 public으로 열려있으면, 선택적으로 외부에 접근을 허용할 속성과 그렇지 않을 속성을 getter/setter 메서드를 통해 설정해줄 수 있다.
- 캡슐화를 활용해 하나의 객체가 해당 객체의 속성과 기능에 대한 독점적인 책임을 담당하게 만들고, 이를 통해 객체 간의 결합도를 낮게 유지할 수 있다.
인용
728x90
'디자인 패턴 > OOP' 카테고리의 다른 글
OOP (0) | 2023.09.07 |
---|---|
SOLID (좋은 객체 지향 설계의 5가지 원칙) (0) | 2023.06.07 |
인터페이스와 다형성(polymorphism) 그리고 추상클래스 (0) | 2023.06.07 |