객체지향 프로그래밍의 특성과 SOLID

고승원·2022년 10월 18일
0

TIL

목록 보기
1/24

1. 객체지향 프로그래밍 (OOP)

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();

2. 객체 지향의 특성

  1. 캡슐화

    → 객체는 스스로 동작할 수 있는 환경을 갖고 있어야 한다.

    → 외부에 의존/침략 X

    • 완성도가 있다. 기능을 수행하는 단위로써 완전함을 갖는다.
    • 정보가 은닉되어 있다. 객체의 정보가 밖에서 접근하거나 밖에서 객체 내의 정보에 접근하지 못하게 한다.
    public class Human {
    	private Heart heart;
    	private Blood blood;
    	protected Gene gene;
    
    	Blood donation() {
    		return null;
    	}
    }

    접근 지정자

    • private : 객체 내에서만 접근
    • protected : 상속된 객체까지만 접근
    • (package friendly) : 같은 패키지 내에서 접근 가능. / default값
    • public : 모두 접근 가능
  2. 상속

    → 추상과 구체를 위해 사용된다. / 공통 기능 전달과는 조금 다르다.

    상위(부모, super, [추상])

    하위(자식, this, [구체])

    원자 > 물질 > 생물 > 동물 > 포유류 > 사람 > 남자 > 짱구

  3. 추상화

    • 추상화된 객체 : 추상체
    • 구체적인 객체 : 구상체
    • 객체간의 관계에서 상위에 있는 것은 항상 하위보다 추상적이어야 한다.

    의미적 추상체

    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 classinterface
    메서드추상 및 비추상 메서드를 가진다.추상메서드와 정적메서드를 가질 수 있다.
    상속단일상속다중상속
    변수모든 변수를 가질 수 있음static, final변수만 가질 수 있다.
    구현인터페이스를 구현할 수 있다.추상클래스를 구현할 수 없다.
    확장성다른 클래스/인터페이스 구현 가능다른 인터페이스만 확장 가능
    접근 제한자private, protected등 사용가능public
  4. 다형성

    → 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(); //불가능

    3. 객체지향 설계

    (1) UML

    OOP에서 객체의 구분과 연관관계를 설명하기 위한 도구

    • Usecase Diagram
    • Sequence Diagram
    • Package Diagram
    • Class Diagram

    Tool

    • https://app.diagrams.net/

    • https://staruml.io/

    • PPT / Visio

      (2) 객체지향 설계 5원칙

      SOLID

    • SRP(단일 책임 원칙) : 수정이 필요할 경우 수정되는 이유는 하나 때문이어야 한다.

    • OCP(개방 폐쇄 원칙) : 수정에는 닫히고, 확장에는 열어라.

    • LSP(리스코프 치환 원칙) : 추상 객체로 사용되는 부분에 구상 객체가 들어가도 아무 문제 없어야 한다.

    • ISP(인터페이스 분리 원칙) : 특정 클라이언트를 위한 인터페이스 하나보다 여러개로 나눠써라

    • DIP(의존관계 역전 원칙) : 추상화에 의존하고 구체화에 의존하지 마라

      SOLID에 따라 설계를 할 경우 여러 케이스에서 공통점이 생긴다.

      공통점을 모아놓은 것 → GoF 디자인 패턴 • https://refactoring.guru/

      디자인 패턴정리

정리

OOP의 등장 배경

OOP의 특성 4가지

  • 캡슐화 (접근 제한자)
  • 상속 (추상, 구상)
  • 추상화 (추상 클래스, 인터페이스의 차이점)
  • 다형성 (type의 표현)

SOLID 원칙 5가지

  • SRP (단일 책임 원칙)
  • OCP (개방 폐쇄 원칙)
  • LSP (리스코프 치환 원칙)
  • ISP (인터페이스 분리 원칙)
  • DIP (의존관계 역전 원칙)

GoF 디자인 패턴을 보려면 여기를 클릭하세요

profile
봄은 영어로 스프링

0개의 댓글