OOP → 프로그램을 객체로 구성하는 것.
객체 → 작은 기능을 수행 하는 것.
객체와 객체는 서로 협력
핵심은 일을 잘게 쪼개서 객체에게 위임하고, 서로 협력한다.
등장 배경
프로그램의 거대화 → 작게 나눠서 만들고 합치자 → OOP 탄생
객체의 구분
객체는 type으로 구분한다.
String str = "Hello World"
타입 만들기
class를 만든다.
class MyObject extends Object implements Runnable{
//필드 영역
private int a = 0;
//메서드 영역
public void run() {
a += 1;
}
}
MyObject obj = new MyObject();
캡슐화
→ 객체는 스스로 동작할 수 있는 환경을 갖고 있어야 한다.
→ 외부에 의존/침략 X
public class Human {
private Heart heart;
private Blood blood;
protected Gene gene;
Blood donation() {
return null;
}
}
접근 지정자
상속
→ 추상과 구체를 위해 사용된다. / 공통 기능 전달과는 조금 다르다.
상위(부모, super, [추상])
하위(자식, this, [구체])
원자 > 물질 > 생물 > 동물 > 포유류 > 사람 > 남자 > 짱구
추상화
의미적 추상체
class Login() {
void login() {}
}
class KakaoLogin extends Login {
void login() {}
}
추상 기능을 가진 객체
abstract class Login() {
abstract void login();
}
class KakaoLogin extends Login{
void kakao() {}
@Override void login() {}
}
객체 전부가 추상적일 때(interface)
interface Login(){
void login();
}
class KakaoLogin implements Login{
void kakao() {}
@Override void login() {}
}
인터뷰를 할 때 인터페이스와 추상클래스의 차이점에 대해 명쾌한 답변을 하지 못했었다.
abstract class | interface | |
---|---|---|
메서드 | 추상 및 비추상 메서드를 가진다. | 추상메서드와 정적메서드를 가질 수 있다. |
상속 | 단일상속 | 다중상속 |
변수 | 모든 변수를 가질 수 있음 | static, final변수만 가질 수 있다. |
구현 | 인터페이스를 구현할 수 있다. | 추상클래스를 구현할 수 없다. |
확장성 | 다른 클래스/인터페이스 구현 가능 | 다른 인터페이스만 확장 가능 |
접근 제한자 | private, protected등 사용가능 | public |
다형성
→ type을 여러가지고 표현할 수 있다.
classs KakaoLogin implements Login {
void kakao() {}
@Override void login() {}
}
interface Portal {
void portal();
}
class NaverLogin implements Login, Portal{
void naver() {}
@Override void login() {}
@Override void portal() {}
}
KakaoLogin k = new KakaoLogin();
Login k = new KakaoLogin(); //이게 다형성
다형성을 가진 객체는 본인 타입의 메서드만 호출 가능.(캡슐화)
Login login = new Login();
Login login - new kakaoLogin();
Login login = new NaverLogin();
login.login();
login.naver(); //불가능.
Portal portal = new NaverLogin();
portal.portal();
portal.login(); //불가능
(1) UML
OOP에서 객체의 구분과 연관관계를 설명하기 위한 도구
Tool
PPT / Visio
(2) 객체지향 설계 5원칙
SOLID
SRP(단일 책임 원칙) : 수정이 필요할 경우 수정되는 이유는 하나 때문이어야 한다.
OCP(개방 폐쇄 원칙) : 수정에는 닫히고, 확장에는 열어라.
LSP(리스코프 치환 원칙) : 추상 객체로 사용되는 부분에 구상 객체가 들어가도 아무 문제 없어야 한다.
ISP(인터페이스 분리 원칙) : 특정 클라이언트를 위한 인터페이스 하나보다 여러개로 나눠써라
DIP(의존관계 역전 원칙) : 추상화에 의존하고 구체화에 의존하지 마라
SOLID에 따라 설계를 할 경우 여러 케이스에서 공통점이 생긴다.
공통점을 모아놓은 것 → GoF 디자인 패턴 • https://refactoring.guru/
OOP의 등장 배경
OOP의 특성 4가지
SOLID 원칙 5가지