코린이 부트캠프 일상

객체지향 프로그래밍

게발인개발자 2023. 11. 27. 20:36

객체지향 프로그래밍 특징

1. 추상화

  • 공통된 특징, 본질을 모아 추출
  • 설계(역할)와 구현을 분리
  • 인터페이스 등을 이용해서, 어떤 객체가 가져야 할 핵심적 기능을 규정 (설계)
  • 인터페이스를 상속받은 클래스에서 구현한다. (구현)

2. 상속

  • 기존의 클래스를 재활용하여 새로운 클래스를 만든다.
  • 반복적인 코드를 최소화, 오류를 줄여줌.
  • 메서드 오버라이딩(Method Overriding)을 통해 재정의.

3. 다형성

 

어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질

 

4. 캡슐화

  • 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하게 은닉
  • 접근제어자(public, private, protected, getter, setter etc.)

 

객체지향 SOLID 원칙

  • SRP (Single Responsibility Principle, 단일책임의 원칙)
    • 하나의 클래스는 하나의 책임만 갖는다.
    • 너무 많은 기능을 넣지 않는다.
    • 기준이 모호하다는 비판, 각자의 SRP 기준은 다를 수 밖에 없다.
    • 변경사항이 있을 때, 애플리케이션의 파급 효과가 적으면 SRP 원칙을 잘 따른 것으로 볼 수 있다.
  • 지금 필요한 건 기능을 줄이는 용기 (출처 : SBS 골목식당)
  • OCP (Open Closed Principle, 개방폐쇄의 원칙)
    • 높은 응집도와 낮은 결합도
    • 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적
    • 유연한 코드 수정, 쉽게 확장할 수 있게 설계
    • 객체를 직접 수정하는 것을 제한
  • LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
    • 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스(객로 변환
    • 하위클래스는 인터페이스의 규약을 잘 지켜야 한다.
    • 자식 객체는 부모 객체를 완전히 대체할 수 있어야 한다.
    public class Rectangle
    {
    	protected int width;
    	protected int height;
    	
    	public int getWidth()
    	{
    		return width;
    	}
    	
    	public int getHeight()
    	{
    		return height;
    	}
    	
    	public virtual void setWidth(int width)
    	{
    		this.width = width;
    	}
    	
    	public virtual void setHeight(int height)
    	{
    		this.height = height;
    	}
    	
    	public int getArea()
    	{
    		return width * height;
    	}
    }
    
    public class Square : Rectangle
    {
    	public override void setWidth(int width)
    	{
    		super.setWidth(width);
    		super.setHeight(getWidth());
    	}
    
    	public override void setHeight(int height)
    	{
    		super.setHeight(height);
    		super.setWidth(getHeight());
    	}
    }
    
    public class Main
    {
    	public static void main(String[] args)
    	{
    		Rectangle rectangle = new Square();
    		rectangle.setWidth(10);
    		rectangle.setHeight(5);
    		
    		System.out.println(rectangle.getArea());
    	}
    }
    
  • ISP (Interface Segragation Principle, 인터페이스 분리 원칙)
    • 범용 인터페이스 하나보다는 특정 클라이언트를 위한 여러 개의 인터페이스 분리가 더 좋다.
      • ex. 스마트폰 인터페이스(전화, 문자, 무선충전, AR, 생체인식)로 갤럭시 S23을 만들 때, 갤럭시 S2를 만들 때
    • 출처 : Inpa 티스토리 (inpa.tistory.com)
  • DIP (Dependency Inversion Principle, 의존관계 역전 원칙)

SRP (Single Responsibility Principle, 단일책임의 원칙)

    • 하나의 클래스는 하나의 책임만 갖는다.
    • 너무 많은 기능을 넣지 않는다.
    • 기준이 모호하다는 비판, 각자의 SRP 기준은 다를 수 밖에 없다.
    • 변경사항이 있을 때, 애플리케이션의 파급 효과가 적으면 SRP 원칙을 잘 따른 것으로 볼 수 있다.
  • 지금 필요한 건 기능을 줄이는 용기 (출처 : SBS 골목식당)
  • OCP (Open Closed Principle, 개방폐쇄의 원칙)
    • 높은 응집도와 낮은 결합도
    • 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적
    • 유연한 코드 수정, 쉽게 확장할 수 있게 설계
    • 객체를 직접 수정하는 것을 제한
  • LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
    • 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스(객로 변환
    • 하위클래스는 인터페이스의 규약을 잘 지켜야 한다.
    • 자식 객체는 부모 객체를 완전히 대체할 수 있어야 한다.
    public class Rectangle
    {
    	protected int width;
    	protected int height;
    	
    	public int getWidth()
    	{
    		return width;
    	}
    	
    	public int getHeight()
    	{
    		return height;
    	}
    	
    	public virtual void setWidth(int width)
    	{
    		this.width = width;
    	}
    	
    	public virtual void setHeight(int height)
    	{
    		this.height = height;
    	}
    	
    	public int getArea()
    	{
    		return width * height;
    	}
    }
    
    public class Square : Rectangle
    {
    	public override void setWidth(int width)
    	{
    		super.setWidth(width);
    		super.setHeight(getWidth());
    	}
    
    	public override void setHeight(int height)
    	{
    		super.setHeight(height);
    		super.setWidth(getHeight());
    	}
    }
    
    public class Main
    {
    	public static void main(String[] args)
    	{
    		Rectangle rectangle = new Square();
    		rectangle.setWidth(10);
    		rectangle.setHeight(5);
    		
    		System.out.println(rectangle.getArea());
    	}
    }
    
  • ISP (Interface Segragation Principle, 인터페이스 분리 원칙)
    • 범용 인터페이스 하나보다는 특정 클라이언트를 위한 여러 개의 인터페이스 분리가 더 좋다.
      • ex. 스마트폰 인터페이스(전화, 문자, 무선충전, AR, 생체인식)로 갤럭시 S23을 만들 때, 갤럭시 S2를 만들 때
    • 출처 : Inpa 티스토리 (inpa.tistory.com)
  • DIP (Dependency Inversion Principle, 의존관계 역전 원칙)