OOP [Java] 객체지향 프로그래밍 - 상속 상속을 통해 클래스를 구현하다 보면 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있어서 코드 추가나 변경이 편해요. 여기서 ParentApp 그리고 ChildApp은 상속 관계에 있다고 하고, 상속을 해주는 ParentApp을 부모 클래스, 상속을 받는 ChildApp을 자식 클래스라고 해요. 부모 클래스 자식 클래스 상속 관계를 그림으로 표시하면 아래와 같... Javasuperhas aOverridingOOPinheritanceObject classis-aObject Oriented ProgrammingJava [Java] 객체지향 프로그래밍 - 역사와 클래스 실제 사물의 속성과 기능을 분석한 다음, 데이터(변수)와 함수로 정희하여 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현하고 이 가상세계에서 모의실험을 함으로써 많은 시간과 비용을 절약할 수 있게 되요. 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있어요. 그리고 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있어요. 객체는 TV, 에어컨 ... JavainstancevariablesOOPobjectObject Oriented ProgrammingmethodclassJava Java 프로그래밍 : 객체지향 (1) 자바의 특징 Windows, Android, MacOS, UNIX 등 다양한 환경에서 동작한다. Object-Oriented Programming, 조립식 프로그래밍. 자바의 장점 객체를 재사용할 수 있다. 프로그램 확장이 편리하다. 클래스와 객체 클래스(Class)는 자바 프로그래밍의 최소 단위이며, 객체(Object)를 만들기 위한 설계도라고 할 수 있다. 또한 오브젝트를 인스턴스라고 부... static자바클래스객체생성자메소드OOPJavaJava [Java] 객체지향 프로그래밍 - 오버로딩 메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 해요. 하지만 한 '클래스' 내에서 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있어도 매개변수 개수 또는 타입이 다르면 같은 이름을 사용해서 정의가 가능해요. 이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩Overloading, 또는 오버로딩O... Object Oriented ProgrammingVarargsOOPJavaoverloadingJava [Java] 객체지향 프로그래밍 - 생성자 App 클래스를 예로 들어 인스턴스 생성하는 과정은 아래와 같아요. 컴파일을 할 때 소스 파일*.java의 클래스가 생성자가 하나도 없다면 컴파일러는 자동적으로 아래와 같은 생성자를 추가해서 컴파일해요. 아무 기능도 수행하지 않기 때문에 생성과 동시에 초기화가 필요한 인스턴스는 반드시 생성자를 선언해줘야 해요. 근데 만약에 매개변수가 있는, 기본 생성자가 아닌 생성자가 선언되어 있고, 기본 ... Object Oriented ProgrammingConstructordeep copyshallow copyOOPJavaConstructor Spring 객체지향 원칙 Open-Closed Principle 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 구현 객체를 변경 할 때 클라이언트 코드(interface부)를 변경해야하면 안된다. Dependency Inversion Principle 추상화에 의존해야지, 구체화에 의존하면 안된다. 클라이언트가 구현 클래스에 의존하지 말고, 인터페이... 객체지향SpringOOPOOP [Java] 객체지향 프로그래밍 - 클래스 내 변수 초기화 변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 해요. 변수의 초기화는 경우에 따라 필수 또는 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 좋아요. 클래스에선 인스턴스 변수는 따로 초기화하지 않고 사용해도 되요. 자료형에 따라 적절한 값으로 초기화를 해주기 때문이에요. 하지만 지역 변수는 반드시 사용하기 전에 초기화해야 해요. 참고로 각 타입의 기... Constructor InitializationObject Oriented ProgrammingExplicit initializationinitialization blockinstance variableOOPJavaConstructor Initialization Java 프로그래밍 : 객체지향 (3) 상속 (extends) 상속을 사용하면 코드 중복을 제거하고, 기존 클래스를 확장하기 쉬워 프로그램 확장성을 증가시킬 수 있다. class A extends B {} 와 같은 형식으로 사용한다. B 클래스를 A가 상속받는 것이다. 이 경우 B가 부모 클래스, A가 자식 클래스가 된다. 해당 클래스의 필드는 물론이고 메소드를 그대로 사용할 수 있다. 업캐스팅이란, 자식 객체를 부모의 타입으로 ... 자바객체지향protected상속그룹화super인터페이스접근제어자업캐스팅오버라이딩다형성OOPJavaJava [Java] 객체지향 프로그래밍 - 제어자 제어자Modifier는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여할 수 있어요. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있어요. 접근 제어자 : public, protected, default, private 단, 접근 제어자의 경우 한번에 네 가지 중 하나만 사용할 수 있어요(public, private을 동시에 적용할 수 없다는 의미에... abstractstaticObject Oriented ProgrammingencapsulationfinalAccess ModifierOOPJavaAccess Modifier [Java] 객체지향 프로그래밍 - 다형성 객체지향 개념에서 다형성이란 여러가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 하여 다형성을 프로그래밍적으로 구현했어요. 위 예제처럼 Person과 NoobNoob이 상속 관계에 있으면 부모 클래스 타입의 변수에 자식 클래스 인스턴스를 참조할 수 있게 해요. 그래서 자식 타입의 참조 변수로 부모 타입의 인스턴스를 참조하는 ... Up castingDown CastingObject Oriented ProgrammingPolymorphisminstanceofOOPJavaDown Casting [Java] 객체지향 프로그래밍 - 추상 클래스 클래스를 설계도에 비유하면, 추상 클래스Abstract Class는 미완성 설계도에 비유할 수 있어요. 미완성 설계도로 제품을 완성할 수 없듯이, 추상 클래스를 통해 인스턴스를 생성할 수 없어요. 추상 클래스는 상속을 통해 자식 클래스에 의해서만 완성될 수 있어요. 제품에 공통으로 사용하는 기능들을 naive하게 구현을 하고 작업하게 된다면 추후 다른 파생 제품을 만들 때도 이런 기반을 숙지... Object Oriented ProgrammingOOPJavaabstract classJava [Java] 객체지향 프로그래밍 - 인터페이스 인터페이스Interface는 추상 메서드를 가지지만 추상화 정도가 높아서 추상 클래스와 달리 구체화된 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없어요. 오직 추상 메서드와 상수만을 멤버로 가질 수 있고 그 외에 다른 어떤 요소도 허용하지 않아요. 그리고 접근 제어자로 public 또는 default만 사용할 수 있어요. (클래스 메서드와 디폴트 메서드 제외) 원래 인터페이스의 모든 ... Object Oriented ProgramminginterfaceOOPJavaJava [Java] 객체지향 프로그래밍 - 내부 클래스 내부 클래스Inner Class는 클래스 내에 선언된 클래스에요. 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감추면서 코드의 복잡성을 줄일 수 있어요(캡슐화). 내부 클래스 선언 위치에 따라 구분을 지을 수 있어요. 1. 인스턴스 클래스 외부 클래스의 멤버 변수 선언 위치에 선언해요. 외부 클래스의... Static classObject Oriented Programminganonymous classlocal classinner classInstance ClassOOPJavaInstance Class 16) React의 전적들... 실무가고싶으면 class형태의 component도 알아야 해 ! useEffect와 axios까지! 실무중심주의 코드캠프의 커리큘럼 체고야!!!! (Code Camp FE 6기) 스프레드 연산자를 잘 활용하면 코드를 간략하고 한 눈에 보기쉽게 리팩토링 할 수 있으니 포트폴리오에도 적용해보시길 바랍니다! state, props, refs, 컴포넌트 메서드와 생명주기 메서드를 this로 참조할 수 있었습니다. 이렇게 컴포넌트 생명주기를 함수형 컴포넌트에서 그려주기 위해서 저희는 useEffect를 사용해서 그려주었습니다. 오늘 새로 배운 react-Hook 두 가지 us... 컴포넌트생명주기updateboardidclassuseEffect내장객체OOP의존성배열렉시컬디스inputcomponentdidupdate스프레드연산자componentWillUnmount()extends componentClass ComponentcomponentDidMountcomponent-lifecycleState객체지향프로그래밍dependency arraythisClass Component 더 객체지향적인 Rails 다음과 같은 코드를 본 적이 있나? 아마 모든 코드가 그렇지는 않겠지만, 저런 코드를 본 적이 있을 것이다. 위 코드는 장황하고 읽기 어렵다. 또한 새로 기능추가를 하는 경우, 수많은 if~else 사이를 왔다갔다해야한다. 어떻게 고칠 수 있을까? 메소드의 이름인 role_name과 role_description에 힌트가 있다. 바로 Role이라는 PORO(Plain Old Ruby Obje... 객체지향Ruby on RailsOOPPOROOOP 오브젝트-코드로 이해하는 객체지향 설계 : Part 4 이번 장에서는 우리가 지금까지 해왔던 책임 중심의 설계가 아닌 상태 중심의 설계를 살펴보며 훌륭한 객체지향 설계는 어떤 특징이 있는지, 그리고 설계의 품질을 향상시키는 것에는 어떤 것들이 필요하며 동시에 어떤 것을 포기해야하는지를 알아보겠습니다. 데이터 중심의 관점에서 객체는 자신이 포함하고 있는 데이터를 조작하는데 필요한 오퍼레이션을 정의하지만, 책임 중심의 관점에서 객체는 다른 객체가 요... OOPOOP 2022년 03월 22일 TIL 1. 객체지향 프로그래밍 객체 개념적인 용어 : 객체 type은 class로 만들 수 있다. implements Runnable 객체는 스스로 동작할 수 있어야 한다. 밖에서 객체 내의 저옵를 접근하지 못하도록 한다. 객체 소유 상속된 객체에서도 접근 가능 같은 패키지 내에서 접근 가능(패키지 가능성, 패키지 내에서만 특정 객체의 접근을 허용하는 경우) 누구든지 접근 가능 추상화된 객체 추상... SOLIDOOP데브코스TILClass DiagramClass Diagram (ch3) - Loops, random numbers 그냥 프로그램 종료 ex. 에러만남 pseudorandom numbers: 진짜 랜덤은 아님, by a seed value same seed -> same sequence of random numbers math 는 import 없이 사용할수있음... JavaOOPJava 오브젝트-코드로 이해하는 객체지향 설계 : Part 5 따라서 첫번째 원칙은 우린 책임을 수행할 정보를 알고 있는 객체에게 책임을 할당하는 것이다. 따라서 Screening 객체는 '예매하라' 라는 메시지를 수신할 수 있다. 하지만 우리는 할인 정책이 있다. 따라서 우리는 할인 여부를 판단하라 메시지를 전송해 외부의 도움을 요청해야한다. 이처럼 메시지(책임)를 처리하기 위해 정보 전문가 객체들을 선택하며, 처리 불가능한 부분은 다른 정보 전문가에... OOPOOP 객체 지향 원리 적용(1) 💡객체지향의 원리 스프링을 사용하지 않고 순수 자바코드로만 개발을하면 객체지향의 원리중 OCP(Open Closed Principle)개방 폐쇄 원칙과 DIP(Dependency Inversion Principle)의존 역전 원칙을 지키지 못하게된다. 할인정책 변경을 위한 코드를 살펴보고 스프링 프레임워크를 사용해 리팩토링해본다. 💡할인정책의 변경 FixDiscountPolicy를 RateD... OOPSpringOOP
[Java] 객체지향 프로그래밍 - 상속 상속을 통해 클래스를 구현하다 보면 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있어서 코드 추가나 변경이 편해요. 여기서 ParentApp 그리고 ChildApp은 상속 관계에 있다고 하고, 상속을 해주는 ParentApp을 부모 클래스, 상속을 받는 ChildApp을 자식 클래스라고 해요. 부모 클래스 자식 클래스 상속 관계를 그림으로 표시하면 아래와 같... Javasuperhas aOverridingOOPinheritanceObject classis-aObject Oriented ProgrammingJava [Java] 객체지향 프로그래밍 - 역사와 클래스 실제 사물의 속성과 기능을 분석한 다음, 데이터(변수)와 함수로 정희하여 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현하고 이 가상세계에서 모의실험을 함으로써 많은 시간과 비용을 절약할 수 있게 되요. 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있어요. 그리고 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있어요. 객체는 TV, 에어컨 ... JavainstancevariablesOOPobjectObject Oriented ProgrammingmethodclassJava Java 프로그래밍 : 객체지향 (1) 자바의 특징 Windows, Android, MacOS, UNIX 등 다양한 환경에서 동작한다. Object-Oriented Programming, 조립식 프로그래밍. 자바의 장점 객체를 재사용할 수 있다. 프로그램 확장이 편리하다. 클래스와 객체 클래스(Class)는 자바 프로그래밍의 최소 단위이며, 객체(Object)를 만들기 위한 설계도라고 할 수 있다. 또한 오브젝트를 인스턴스라고 부... static자바클래스객체생성자메소드OOPJavaJava [Java] 객체지향 프로그래밍 - 오버로딩 메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 해요. 하지만 한 '클래스' 내에서 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있어도 매개변수 개수 또는 타입이 다르면 같은 이름을 사용해서 정의가 가능해요. 이처럼 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩Overloading, 또는 오버로딩O... Object Oriented ProgrammingVarargsOOPJavaoverloadingJava [Java] 객체지향 프로그래밍 - 생성자 App 클래스를 예로 들어 인스턴스 생성하는 과정은 아래와 같아요. 컴파일을 할 때 소스 파일*.java의 클래스가 생성자가 하나도 없다면 컴파일러는 자동적으로 아래와 같은 생성자를 추가해서 컴파일해요. 아무 기능도 수행하지 않기 때문에 생성과 동시에 초기화가 필요한 인스턴스는 반드시 생성자를 선언해줘야 해요. 근데 만약에 매개변수가 있는, 기본 생성자가 아닌 생성자가 선언되어 있고, 기본 ... Object Oriented ProgrammingConstructordeep copyshallow copyOOPJavaConstructor Spring 객체지향 원칙 Open-Closed Principle 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 구현 객체를 변경 할 때 클라이언트 코드(interface부)를 변경해야하면 안된다. Dependency Inversion Principle 추상화에 의존해야지, 구체화에 의존하면 안된다. 클라이언트가 구현 클래스에 의존하지 말고, 인터페이... 객체지향SpringOOPOOP [Java] 객체지향 프로그래밍 - 클래스 내 변수 초기화 변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 해요. 변수의 초기화는 경우에 따라 필수 또는 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화하는 것이 좋아요. 클래스에선 인스턴스 변수는 따로 초기화하지 않고 사용해도 되요. 자료형에 따라 적절한 값으로 초기화를 해주기 때문이에요. 하지만 지역 변수는 반드시 사용하기 전에 초기화해야 해요. 참고로 각 타입의 기... Constructor InitializationObject Oriented ProgrammingExplicit initializationinitialization blockinstance variableOOPJavaConstructor Initialization Java 프로그래밍 : 객체지향 (3) 상속 (extends) 상속을 사용하면 코드 중복을 제거하고, 기존 클래스를 확장하기 쉬워 프로그램 확장성을 증가시킬 수 있다. class A extends B {} 와 같은 형식으로 사용한다. B 클래스를 A가 상속받는 것이다. 이 경우 B가 부모 클래스, A가 자식 클래스가 된다. 해당 클래스의 필드는 물론이고 메소드를 그대로 사용할 수 있다. 업캐스팅이란, 자식 객체를 부모의 타입으로 ... 자바객체지향protected상속그룹화super인터페이스접근제어자업캐스팅오버라이딩다형성OOPJavaJava [Java] 객체지향 프로그래밍 - 제어자 제어자Modifier는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여할 수 있어요. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있어요. 접근 제어자 : public, protected, default, private 단, 접근 제어자의 경우 한번에 네 가지 중 하나만 사용할 수 있어요(public, private을 동시에 적용할 수 없다는 의미에... abstractstaticObject Oriented ProgrammingencapsulationfinalAccess ModifierOOPJavaAccess Modifier [Java] 객체지향 프로그래밍 - 다형성 객체지향 개념에서 다형성이란 여러가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 하여 다형성을 프로그래밍적으로 구현했어요. 위 예제처럼 Person과 NoobNoob이 상속 관계에 있으면 부모 클래스 타입의 변수에 자식 클래스 인스턴스를 참조할 수 있게 해요. 그래서 자식 타입의 참조 변수로 부모 타입의 인스턴스를 참조하는 ... Up castingDown CastingObject Oriented ProgrammingPolymorphisminstanceofOOPJavaDown Casting [Java] 객체지향 프로그래밍 - 추상 클래스 클래스를 설계도에 비유하면, 추상 클래스Abstract Class는 미완성 설계도에 비유할 수 있어요. 미완성 설계도로 제품을 완성할 수 없듯이, 추상 클래스를 통해 인스턴스를 생성할 수 없어요. 추상 클래스는 상속을 통해 자식 클래스에 의해서만 완성될 수 있어요. 제품에 공통으로 사용하는 기능들을 naive하게 구현을 하고 작업하게 된다면 추후 다른 파생 제품을 만들 때도 이런 기반을 숙지... Object Oriented ProgrammingOOPJavaabstract classJava [Java] 객체지향 프로그래밍 - 인터페이스 인터페이스Interface는 추상 메서드를 가지지만 추상화 정도가 높아서 추상 클래스와 달리 구체화된 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없어요. 오직 추상 메서드와 상수만을 멤버로 가질 수 있고 그 외에 다른 어떤 요소도 허용하지 않아요. 그리고 접근 제어자로 public 또는 default만 사용할 수 있어요. (클래스 메서드와 디폴트 메서드 제외) 원래 인터페이스의 모든 ... Object Oriented ProgramminginterfaceOOPJavaJava [Java] 객체지향 프로그래밍 - 내부 클래스 내부 클래스Inner Class는 클래스 내에 선언된 클래스에요. 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감추면서 코드의 복잡성을 줄일 수 있어요(캡슐화). 내부 클래스 선언 위치에 따라 구분을 지을 수 있어요. 1. 인스턴스 클래스 외부 클래스의 멤버 변수 선언 위치에 선언해요. 외부 클래스의... Static classObject Oriented Programminganonymous classlocal classinner classInstance ClassOOPJavaInstance Class 16) React의 전적들... 실무가고싶으면 class형태의 component도 알아야 해 ! useEffect와 axios까지! 실무중심주의 코드캠프의 커리큘럼 체고야!!!! (Code Camp FE 6기) 스프레드 연산자를 잘 활용하면 코드를 간략하고 한 눈에 보기쉽게 리팩토링 할 수 있으니 포트폴리오에도 적용해보시길 바랍니다! state, props, refs, 컴포넌트 메서드와 생명주기 메서드를 this로 참조할 수 있었습니다. 이렇게 컴포넌트 생명주기를 함수형 컴포넌트에서 그려주기 위해서 저희는 useEffect를 사용해서 그려주었습니다. 오늘 새로 배운 react-Hook 두 가지 us... 컴포넌트생명주기updateboardidclassuseEffect내장객체OOP의존성배열렉시컬디스inputcomponentdidupdate스프레드연산자componentWillUnmount()extends componentClass ComponentcomponentDidMountcomponent-lifecycleState객체지향프로그래밍dependency arraythisClass Component 더 객체지향적인 Rails 다음과 같은 코드를 본 적이 있나? 아마 모든 코드가 그렇지는 않겠지만, 저런 코드를 본 적이 있을 것이다. 위 코드는 장황하고 읽기 어렵다. 또한 새로 기능추가를 하는 경우, 수많은 if~else 사이를 왔다갔다해야한다. 어떻게 고칠 수 있을까? 메소드의 이름인 role_name과 role_description에 힌트가 있다. 바로 Role이라는 PORO(Plain Old Ruby Obje... 객체지향Ruby on RailsOOPPOROOOP 오브젝트-코드로 이해하는 객체지향 설계 : Part 4 이번 장에서는 우리가 지금까지 해왔던 책임 중심의 설계가 아닌 상태 중심의 설계를 살펴보며 훌륭한 객체지향 설계는 어떤 특징이 있는지, 그리고 설계의 품질을 향상시키는 것에는 어떤 것들이 필요하며 동시에 어떤 것을 포기해야하는지를 알아보겠습니다. 데이터 중심의 관점에서 객체는 자신이 포함하고 있는 데이터를 조작하는데 필요한 오퍼레이션을 정의하지만, 책임 중심의 관점에서 객체는 다른 객체가 요... OOPOOP 2022년 03월 22일 TIL 1. 객체지향 프로그래밍 객체 개념적인 용어 : 객체 type은 class로 만들 수 있다. implements Runnable 객체는 스스로 동작할 수 있어야 한다. 밖에서 객체 내의 저옵를 접근하지 못하도록 한다. 객체 소유 상속된 객체에서도 접근 가능 같은 패키지 내에서 접근 가능(패키지 가능성, 패키지 내에서만 특정 객체의 접근을 허용하는 경우) 누구든지 접근 가능 추상화된 객체 추상... SOLIDOOP데브코스TILClass DiagramClass Diagram (ch3) - Loops, random numbers 그냥 프로그램 종료 ex. 에러만남 pseudorandom numbers: 진짜 랜덤은 아님, by a seed value same seed -> same sequence of random numbers math 는 import 없이 사용할수있음... JavaOOPJava 오브젝트-코드로 이해하는 객체지향 설계 : Part 5 따라서 첫번째 원칙은 우린 책임을 수행할 정보를 알고 있는 객체에게 책임을 할당하는 것이다. 따라서 Screening 객체는 '예매하라' 라는 메시지를 수신할 수 있다. 하지만 우리는 할인 정책이 있다. 따라서 우리는 할인 여부를 판단하라 메시지를 전송해 외부의 도움을 요청해야한다. 이처럼 메시지(책임)를 처리하기 위해 정보 전문가 객체들을 선택하며, 처리 불가능한 부분은 다른 정보 전문가에... OOPOOP 객체 지향 원리 적용(1) 💡객체지향의 원리 스프링을 사용하지 않고 순수 자바코드로만 개발을하면 객체지향의 원리중 OCP(Open Closed Principle)개방 폐쇄 원칙과 DIP(Dependency Inversion Principle)의존 역전 원칙을 지키지 못하게된다. 할인정책 변경을 위한 코드를 살펴보고 스프링 프레임워크를 사용해 리팩토링해본다. 💡할인정책의 변경 FixDiscountPolicy를 RateD... OOPSpringOOP