객체지향 프로그래밍과 활용

금은체리·2024년 1월 17일
0

면접

목록 보기
12/15
  1. 객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?

공통의 관심 사항을 적용해서 발생하는 의존 관계의 복잡성과 코드 중복을 해소해줍니다.
각 클래스에서 공통 관심 사항을 구현한 모듈에 대한 의존관계를 갖기 보단, Aspect를 이용해 핵심 로직을 구현한 각 클래스에 공통 기능을 적용합니다.
간단한 설정만으로도 공통 기능을 여러 클래스에 적용할 수 있는 장점이 있으며 핵심 로직 코드를 수정하지 않고도 웹 애플리케이션의 보안, 로깅, 트랜잭션과 같은 공통 관심 사항을 AOP를 이용해 간단하게 적용할 수 있습니다.


순차적, 비구조적 프로그래밍

  • 필요한게 있으면 순서대로 추가해가며 구현하는 방식
    • 규모가 커진다면..?
  • 비구조적 프로그래밍에서는 goto문을 활용
    • 코드가 어떻게 연결되어 있는지 확인하기 힘들기 때문에 비추

절차적, 구조적 프로그래밍

  • 반복될 가능성이 있는 것들을 재사용이 가능한 함수(프로시저)로 만들어 사용하는 프로그래밍 방식

프로시저

  • 반환값(리턴)이 따로 존재하지 않는 함수
    • printf와 같은 함수는 반환값을 얻기 위한 것 보단 화면에 출력하는 용도로 사용되는 함수
      • printf는 int형을 리턴해주기는 하지만 목적 자체는 프로시저에 가깝다
  • 추상적이라는 문제점 존재
  • 도서관리 프로그램을 예로 들면
    • 책에 대한 자료형, 책에 대한 함수가 물리적으로 같이 있을 수 있지만 논리적으로는 함께 할 수 없다

객체지향 프로그래밍

  • 특정한 개념의 함수와 자료형을 함께 묶어서 관리하기 위해 탄생
    • 클래스마다 필요한 필드를 선언하고, getter와 setter로 구성된 느낌
    • 가장 중요한 것은 객체 내부에 자료형(필드)와 함수(메소드)가 같이 존재하는 것
  • 객체 간의 독립성이 생기고 중복코드의 양이 줄어드는 장점 존재
  • 독립성이 확립되면 유지보수에도 도움이 됨

특징

  1. 추상화
    • 필요로 하는 속성이나 행동을 추출하는 작업
    • 사물들의 공통적인 특징을 파악한 후 하나의 집합으로 만들어내는 것
  2. 캡슐화
    • 낮은 결합도를 유지할 수 있도록 설계하는 것
    • 한 곳에서 변화가 일어나도 다른 곳에 미치는 영향을 최소화 시키는 것
    • 객체 안의 모듈 간의 요소가 밀접한 관련이 있는 것으로 구성하여 응집도를 높이고 결합도를 줄여야 요구사항 변경에 대처하는 좋은 설계 방법
    • 캡슐화는 정보은닉을 활용해서 높은 응집도와 낮은 결합도를 가짐
      • 객체안에 필드를 선언할 때 priavate로 선언하는 이유
  3. 상속
    • 일반화 관계라고도 하며, 여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정
    • 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종이라 할 수 있음
    • 상속 재사용의 단점
      1. 상위 클래스(부모 클래스)의 변경이 어려워진다
      2. 불필요한 클래스가 증가할 수 있다
      3. 상속이 잘못 사용될 수 있다
    • 해결책
      • 객체 조립: 필드에서 다른 객체를 참조하는 방식
      • 같은 종류가 아닌 클래스를 상속하고 싶을 때는 객체 조립을 우선적으로 적용하는 것이 좋다
    • 재사용의 관점이 아니라, 기능의 확장 관점일 때 상속을 사용하자
  4. 다형성
    • 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
    • 부모 클래스의 메소드를 자식 클래스가 오버라이딩해서 자신의 역할에 맞게 활용하는 것이 다형성

객체지향 설계 원칙

  1. SRP - 단일 책임 원칙
    • 클래스는 단 한개의 책임을 가져야 한다
    • 클래스를 변경하는 이유는 단 한개여야 한다
  2. OCP - 개방-폐쇄 원칙
    • 확장에는 열려 있어야하고 변경에는 닫혀있어야 한다
    • 기능을 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않는다
    • 이를 지키지 않으면 Instanceof와 같은 연산자를 사용하거나 다운 캐스팅이 일어난다
  3. LSP - 리스코프 치환 원칙
    • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야한다
    • 상속 관계가 아닌 클래스들을 상속 관계로 설정하면 이 원칙이 위배된다
  4. ISP - 인터페이스 분리 원칙
    • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다
    • 각 클라이언트가 필요로하는 인터페이스들을 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야한다
  5. DIP - 의존 역전 원칙
    • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다
    • 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다
    • 즉, 저수준 모듈이 변경돼도 고수준 모듈은 변경할 필요가 없는 것이다
profile
전 체리 알러지가 있어요!

0개의 댓글