For Example
아래와 같이 사람을 모델링 한다고 가정했을 경우 다음과 같이 속성/행위를 나누어 모델링 할 수 있다.
- 속성 :
- 이름
- 성별
- ...
- 행위 :
- 컴퓨터를 켠다.
- 자바 프로젝트를 생성한다.
- 스프링 프로젝트를 생성한다.
- 저장.
- 컴퓨터를 종료한다.
- ...
위에서 사람을 모델링 했는데 모델링 된 사람은 실체가 없는 그저 '사람'이라는 개념에 지나지 않는다.
위에서 정의된 사람이 탄생하고 그 이름이 부여되는 등 일련의 '생산'과정을 거치면 비로소 하나의 객체
라고 볼 수 있다.
예를 들어 사람이 알약을 입에 넣었을 때 알약 겉부분이 녹기 전까진 안에 든 내용물의 쓴 맛을 느낄 수 없는것 처럼 관련있는 속성들을 한곳에 모아 관리, 보호하는 것이다. Java
에서는 다음과 같이 접근제한자를 통해 정보를 은닉/보호할 수 있다.
public class Human {
// 'private' 접근제한자를 사용해 다른 클래스에서 멤버변수로의 접근을 제한한다.
private String name;
private String nationality;
private int age;
// 'public' 접근제한자로 모든 클래스에서 'move'메서드에 대한 접근을 허용한다.
public void move() {
...
}
...
}
🧐 정보은닉
캡슐화 != 정보은닉
캡슐화하면 불필요한 정보를 숨길 수 있어 정보은닉의 특성이 있다는 것이지 둘은 같은 개념이 아니다.
어떠한 존재가 가지는 여러 속성 중 특정한 속성을 파악하는 것.
스마트폰
추상화 한다고 가정해보자.
속성 :
- 제조사
- 생산지
- ...
행위 :
- 전화를 건다
- 문자메세지를 보낸다.
- ...
위 처럼 여러가지 속성을 정의 할 수 있다. 각 속성과 행위들은 다른 기종의 휴대전화
와도 공유한다. 이 때 휴대전화
이라는 상위 개념을 만들어 공통되는 행위와 속성들을 추출할 수 있는데 이를 추상화라 한다.
아래 기술할 상속에서 좀 더 자세하게 다뤄보자.
상속이란 기존의 클래스를 재활용해 새로운 클래스를 만들어내는 방법이다.
위에서 스마트폰
에 대해 추상화했는데 좀 더 세분화 시켜 보면 아이폰
, 갤럭시
등 제조사별로 세분화가 가능하다.
속성 :
- 기종 : 아이폰
- 색상 : 스페이스그레이
- ...
행위 :
- 밀어서 잠금 해제
- ...
이 때 상위 개념과 겹치는 속성이나 행위를 다시 재정의 할 필요 없이 상위개념의 속성과 행위에 접근해 재사용 할 수 있게 하는것을 상속이라 한다.
특정 속성이나 행위가 여러가지 형태를 가질 수 있는 성질을 다형성이라 한다.
비유적으로 어떤 사람이 있다고 볼 때 누군가의 애인, 자식, 부모가 될 수 있는것과 비슷하다.
자바에서는 메서드 오버로딩, 오버라이딩으로 설명될 수 있다.
public class Main {
public static void main(String[] args) {
...
SmartPhone myPhone = new Iphone();
SmartPhone yourPhone = new Galaxy();
...
}
}
public class Iphone extends SmartPhone {
...
@Override
public void sendMessage() {
System.out.println("imessage를 전송합니다.");
}
...
}
public class Galaxy extends SmartPhone {
...
@Override
public void sendMessage() {
System.out.println("메세지를 전송합니다.");
}
...
}
좋은 소프트웨어 설계를 위해 만들어진 원칙. 시스템상 예상치 못한 변경사항에 유연하게 대처가능하고 확장성을 확보한 시스템 구조를 만들 수 있고 생산성을 높이기 위해 고안됨.
Q1. 5원칙 중 우선순위가 있나요?
A1. 없다. 한눈에 들어올 수 있게 정한 것이라 'SOLID' 라는 단어로 배열된것 뿐, 우선순위도, 순서도 없다.
Q2. 모든 프로젝트에 반드시 적용해야하나요?
A2. 반드시 적용할 필요는 없다. 다만 문제 대응에 용이성과 유지보수를 용이하게 하기 위함.
SRP 단일 책임 원칙
이 클래스 단일 책임을 강조한다면 ISP
는 인터페이스 단일 책임을 강조.ex)
public class SmartPhone implements WirelessChargeable, BiometricalAuthenticatable {
void call() {
...
}
void message() {
...
}
@Override
void wirelessCharge() {
...
}
@Override
void biometricalAuthenticate() {
..,
}
}