객체지향프로그래밍 OOP
- 상속, 다형성, 추상화, 캡슐화
- 사용 목적 : 코드의 재사용성을 극대화, 특정 모듈의 변경이 다른 모듈에 영향을 미치지 않는다
- 객체 : 구체적, 추상적 데이터의 단위. 여러 명사들
절차 지향 프로그래밍 vs 객체 지향 프로그래밍
- 절차 지향 프로그래밍
시간이나 사건의 흐름에 따라 프로그래밍
C
- 객체 지향 프로그래밍
객체를 정의한 후 객체들과의 관계를 통해 프로그래밍
C++, C#, Python, JS
객체 지향 프로그램을 구현하는 법
- 객체를 정의하고
- 각 객체가 제공하는 기능을 구현하고
- 각 객체가 제공하는 기능들 간의 소통을 통하여 객체 간의 협력을 구현
객체지향의 요소
- Class : 같은 종류의 집단에 속하는 속성과 행위에 대한 정의, 객체를 만들기 위한 설계도, 설명
- Object : 클래스의 인스턴스(실제 메모리 할당), 자신의 고유 데이터를 갖고 행위를 수행
객체지향프로그래밍의 특징 4가지
- 상속 - 하나의 클래스와 상속관계를 통해 상위 클래스의 필드와 메서드르르 획득하여 상위 클래스의 필드, 메서드를 재사용
- 다형성 - 상황에 따라 메서드의 성질을 변화시키는 것
메서드의 오버라이딩
- 추상화 - 객체들이 가진 공통 특성을 파악하고 불필요한 특성을 제거하는 과정으로, 단순화하여 세부 정보를 숨기고 기능을 표시하는 것
추상 클래스 - 상속 클래스/인터페이스 - 인터페이스 구현. 그리고 클래스/인터페이스를 리모컨으로 사용
- 캡슐화 - 하나의 문제해결을 위한 데이터와 메서드의 묶음으로, 외부 접근을 차단한다
클래스와 객체
- 클래스로 모델링한 객체를 정의
- 클래스는 필드, 메소드, 생성자, 블럭, 중첩 클래스 및 인터페이스를 포함할 수 있다
- 객체는 클래스의 인스턴스
- 객체는 메모리의 주소를 포함하고 있다
객체지향 설계 5대 원칙
- SRP(단일 책임 원칙)
- 모든 클래스는 각각 하나의 책임만 가지고 단일 기능을 수행
- 코드가 정확하고 코드를 쉽게 유지/관리할 수 있다
- OCP(개방-폐쇄의 원칙)
- 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계
- 확장을 통해 모듈에 새로운 기능을 구현할 수 있다
- LSP(리스코프 치환 원칙)
- 자식 클래스는 언제나 부모 클래스를 대체하여 동작하는데 문제가 없어야 한다 (다형성)
- ISP(인터페이스 분리 원칙)
- 한 클래스는 자신이 사용하지 않는 인터페이스를 구현하면 안된다
- 여러 개의 구체적인 인터페이스로 분할한다
- DIP(의존석 역전 원칙)
- 의존 관계를 구체적인 구현 클래스 대신 추상화된 추상 클래스나 인터페이스에 의존해야 하며,
고수준 모듈에서 저수준 모듈에 의존해서는 안된다(?)
SOLID원칙 사용 이유
- 다른 코드 블록에 영향을 주지 않고 코드 블록을 변경할 수 있도록 종속성을 줄일 수 있다
- 디자인을 더 쉽고 이해하기 쉽게 만들기 위한 원칙
- 시스템을 유지 관리, 테스트, 확장 및 재사용할 수 있다
제어자
- 클래스, 변수, 메소드의 선언부에 사용되며 부가적인 의미를 부여한다
- 접근 제어와 그외 제어자로 나뉜다
- 접근 제어자 : public, protected, default, private
- 그 외 : static, final, abstract, native, transient, synchronized, volatile,
strictfp
접근제어자
- public
특별히 공용 상수로 정의하는 것 외에 public으로 선언하는 경우는 없다
- private
클래스 외부에서 접근할 수 없다
클래스 선언 시에 사용이 안된다
상속관계의 하위 클래스에서도 접근할 수 없다
캡슐화 보장, 클래스의 데이터 필드 보호에 사용
생성자에 선언하여 상속을 제한할 때도 사용
- protected
상속 관계인 하위 클래스 간의 접근이 허용
상속 관계의 다른 패키지의 클래스에서도 접근 가능
- default
별도 접근 제어자 지정이 없을 경우
동일 패키지에서만 접근 가능
생활 속의 객체를 클래스로 구현해보기
- 클래스는 객체의 청사진
- 객체의 속성은 클래스의 멤버변수로 선언한다
- 학생 클래스
public class Student{
int ~;
String~;
}
- 하나의 클래스 파일 안에 여러 개의 클래스가 만들어질 수 있지만 public은 단 한 개만 붙어야 하고
public 클래스와 .java파일 명은 동일하다
- 클래스는 대문자로 시작
- 낙타 표기법을 사용