TIL

108일차(모험 17일차) - OOP란? & SOLID

haedal-uni 2021. 12. 30. 00:32
728x90

아직 시계를 고치지 못했지만 오늘도 시간을 측정할 의미가 없어서 하지 않았다.

오늘은 스프링 입문용 강의를 완강했고 오늘부터 JPA 활용 부분에 대해서 공부할 예정이다.

초반에 setting을 하고 test 코드를 실행시켰더니 에러가 떴다.

 

102일차(모험11일차) 안녕하세요 흙먹는 delight입니다

덕분에 바로 gradle에서 intellij idea로 바꿨고 에러가 뜨지 않았다.

 

그런데 왜 에러가 뜨지 않는건지 궁금해져서 검색해봤지만 해결방법만 뜨고 왜 그런지는 나오지 않아서

튜터님께 여쭤봤다.

 

🅰️ : 로컬 Gradle의 버전에 따라 잘될수도 있고 안될수도 있는 부분이어서
일반적으로 Run tests using 부분은 intellij로 맞춰놓고 사용한다고 하셨다.

 

 

 

그리고 다음주에 이력서 첨삭과 모의면접 2번이 예정되어 있어서미리 이력서를 작성하고 있다.

이력서에 별로 쓴건 없는데 시간이 너무 빠르게 가는 것 같다.

 

팀 프로젝트를 하나만 적고 나머지는 쓸게 없어서 내 개인 프로젝트로 대체해서 넣으려고 했다.

내가 꽤 오랜 시간에 공을 들인 프로젝트 2개만 쓰기로 했는데

그 2개 모두 웹사이트가 아니라 기능적으로 구현을 했고 코드가 단순할 것 같아서 걱정이 든다.

 

작성할 때는 내가 기능 구현하면서 문제나 어떻게 해결했는지를 기록해왔기 때문에

이를 참고해서 이력서에 넣으면 되지 않을까 싶다.

 

그리고 아래는 어제 말한대로 AOP를 공부하면서 OOP를 보게 되었고 SOLID를 보게 되어서

정리를 해봤다. 캡슐화와 추상화, 다형성, 상속은 알고 있었는데 OOP의 특성으로는 알고 있지 않았다.

그리고 SOLID 부분에서 아직 이해를 하지 못한 부분들이 있어서

이후에 이해가 되면 이해한 대로 작성을 할 예정이다. 

 

예시에서 내가 생각한 대로 적은 것도 있으니 무조건 맞다고는 할 수 없어서 검증이 필요할 것 같다.


OOP란? 객체지향프로그래밍 OOP(Object Oriented Programming)

OOP → 4가지(캡슐화,추상화,다형성,상속)

 

 

캡슐화

외부에 노출할 필요가 없는 정보들은 은닉 (정보은닉)

더보기

캡슐화를 하는 중요한 목적은 바로 정보의 은닉화이다.  

잔고라는 변수가 만약 public 으로 선언되어있다고 치면 누군가 접근에 의해 0원이 될 수도 있다.

따라서 잔고라는 변수를 바로 접근할 수 없도록 private로 선언하고 데이터를 보호하는 것이다.

 

이렇게 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이

바로 캡슐화의 중요한 목적이다.

 

 

 

추상화

객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법

더보기

자동차들의 공통적인 요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어 내면,

바퀴, 핸들, 차문, 유리창 등 필수적인 부품이 있고 바퀴는 굴러가야하며,

핸들은 좌우로 돌아가야하고 차문은 열려야한다는 공통적인 행동

즉, 어떤 차든 필수적으로 필요한 메서드가 추출된다. 

 

이러한 과정이 추상화하는 과정이다.

이렇게 추상적으로 끄집어 낸 개념들을 큰 틀에서 클래스로 만든것이 바로 추상클래스이다. 

 

 

 

다형성

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다.

이를 통해 코드의 재사용, 코드길이 감소가 되어 유지보수가 용이하도록 도와준다.

더보기

 

같은 동작이지만 다른 결과물이 나올 때 이를 다형성이라고 생각하면 된다.

 

크게 자바프로그래밍 객체지향에서 다형성의 개념을 녹여내는 방법은 두가지로,

오버라이딩(Overriding) 과 오버로딩(Overloading) 이다.

 

 

오버라이딩은 부모클래스에서 상속받은 서브클래스

즉, 자식클래스에서 부모클래스,

즉, 상위클래스에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.

 

오버로딩은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만

각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념인데

오버로딩이 가능하려면 메서드끼리 이름은 같지만

매개변수의 갯수나 데이터타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 

문법 에러가 나지않는다.

 

 

-> 같은 행위를 하지만 용도와 목적에 부합하여 다양한 기능수행과 처리, 결과를 낳을 수 있는 것이다.

 

 

 

상속

상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념

더보기

기존클래스에 기능을 가져와 재사용할 수 있으면서도

동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.

 

 

 

[출처] 

[Java] 객체지향프로그래밍 (OOP)란?

OOP란


객체 지향 설계 (SOLID)

 

객체지향의 4대특성인 캡슐화, 상속, 추상화, 다형성 을 이용하여 

객체 지향을 올바르게 설계할 수 있도록 도와주는 원칙들을 알아본다.

 

  • SRP (Single Responsibility Principle) 단일 책임 원칙
  • OCP (Open Closed Principle) 개방 폐쇄 원칙
  • LSP (Liskov Substitution Principle) 리스코프 치환 원칙
  • ISP (Interface Segregation Principle) 인터페이스 분리 원칙
  • DIP (Dependency Inversion Principle) 의존 역전 원칙

 

더보기

SOLID 원칙들은 결국 자기 자신 클래스 안에 응집도는 내부적으로 높이고,

타 클래스들 간 결합도는 낮추는 High Cohesion - Loose Coupling 원칙을 객체 지향의 관점에서 도입한 것이다.

좋은 소프트웨어는 응집도가 높고 결합도가 낮기 때문이다.

결국 모듈 또는 클래스 당 하나의 책임을 주어 더욱더 독립된 모듈(클래스)을 만들기 위함이다.

이렇게 설계된 소프트웨어는 재 사용이 많아지고, 수정이 최소화 되기 때문에 결국 유지 보수가 용이해진다. 


 

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

 

사람이라는 클래스에 모든 사람에 관련된 모든 기능을 다 때려 박기보다 

목적과 취지에 맞는 속성과 메서드로 구성 해야 한다. (관련된 책임만 준다.)

이 말은 결국 SRP(단일 책임 원칙)은 추상화와 깊은 관련이 있다. 

 

예시)

더보기

class 사람() {
    String 이름
    Long 나이
    Long 키
    ....
    String 개발 언어
    Long 개발 경력
}

 

class 병원() {
    String 이름
    Long 나이
    Long 키
}

 

class 개발 회사() {
    String 개발 언어
    Long 개발 경력
}

 

 

 

 

OCP (Open Closed Principle) 개방 폐쇄 원칙

더보기

 

OCP(개방 패쇄 원칙) 의거하여 상위클래스 또는 인터페이스를 중간에 두어 직접적인 연동은 피하게 설계한다.

상위클래스나 인터페이스는 일종의 완충 장치인 것이다.

 

 

 

LSP (Liskov Substitution Principle) 리스코프 치환 원칙

 

 

 

ISP (Interface Segregation Principle) 인터페이스 분리 원칙

 

 

 

DIP (Dependency Inversion Principle) 의존 역전 원칙

 

 

 

 

[출처]

[Java] 객체 지향 설계란? (SOLID)

 

 

 

 

 

728x90