객체지향

  1. 객체지향 vs 절차지향

    절차지향 프로그래밍은 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식이다.

    객체지향 프로그래밍은 반대로 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행순서와 흐름을 짜는 방식이다.

    이상적인 객체지향 설계는 시스템의 책임을 세분화하고 협력을 찾아 협력에서의 역할과, 주고 받는 메시지를 자율적인 객체들에게 적절히 할당하여 협력적인 공동체를 구성하는 것이다.

    Untitled

  2. 객체지향 SOLID 원칙에 대해서 설명해 주세요.

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

    소프트웨어 시스템이 가질 수 있는 최적의 구조는 시스템을 만드는 조직의 사회적 구조에 커다란 영향을 받는다. 따라서 각 소프트웨어 모듈은 변경의 이유가 단 하나여야만 한다.

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

    코드를 수정하기보단 반드시 새로운 코드를 추가하는 방식으로 시스템의 행위를 변경할 수 있도록 설계해야만 소프트웨어 시스템을 쉽게 변경할 수 있다는 원칙이다.

    확장에는 열려있어야 하며, 수정에는 닫혀있어야 한다.

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

    상호 대체 가능한 구성요소를 이용해 소프트웨어 시스템을 만들 수 있으려면, 이들 구성요소는 서로 치환 가능해야 한다.

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

    소프트웨어 설계자는 사용하지 않는 것에 의존하지 않아야 한다.

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

    고수준 정책을 구현하는 코드는 저수준 세부사항을 구현하는 코드에 절대로 의존해선 안된다.

    대신 세부사항이 정책에 의존해야 한다.

    1. 단일 책임 원칙 (Single Responsibility Principle, SRP): 클래스는 하나의 책임만 가져야 합니다. 클래스가 변경되어야 하는 이유는 오직 하나여야 합니다. 이를 통해 클래스는 한 가지 기능에 집중되어 있고, 변경사항이 발생할 때 해당 클래스만 수정하면 되므로 유지보수가 쉬워집니다.
    2. 개방-폐쇄 원칙 (Open-Closed Principle, OCP): 소프트웨어 요소(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 폐쇄적이어야 합니다. 즉, 새로운 기능을 추가할 때 기존의 코드를 변경하지 않고 확장할 수 있어야 합니다.
    3. 리스코프 치환 원칙 (Liskov Substitution Principle, LSP): 하위 클래스는 상위 클래스를 대체할 수 있어야 합니다. 즉, 어떤 클래스의 인스턴스가 있다면 그 클래스의 하위 클래스의 인스턴스로 대체해도 프로그램의 동작이 변하지 않아야 합니다.
    4. 인터페이스 분리 원칙 (Interface Segregation Principle, ISP): 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 합니다. 즉, 인터페이스는 클라이언트가 필요로 하는 기능에 따라 여러 개의 세분화된 인터페이스로 분리되어야 합니다.
    5. 의존성 역전 원칙 (Dependency Inversion Principle, DIP): 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 객체는 구체적인 객체가 아닌 추상화에 의존해야 한다.
  3. 객체지향 4가지 특징에 대해서 설명해 주세요.

    - 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법

    - 클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현하는 것

    - 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것

    - 다양한 형태로 표현이 가능한 구조를 말한다.

    1. 캡슐화 (Encapsulation): 캡슐화는 객체의 상태(데이터)와 행위(메서드)를 하나로 묶고, 외부에서의 접근을 제어하는 것을 의미합니다. 캡슐화를 통해 객체의 내부 구현을 외부에 감추고, 객체 간의 상호작용을 인터페이스를 통해 수행함으로써 시스템의 유연성과 보안성을 높입니다.
    2. 상속 (Inheritance): 상속은 클래스가 다른 클래스의 특성(속성과 메서드)을 상속받는 것을 의미합니다. 상속을 통해 기존 클래스의 재사용성을 높이고, 클래스 간의 계층 구조를 형성하여 코드의 구조화와 유지보수를 용이하게 합니다.
    3. 다형성 (Polymorphism): 다형성은 같은 이름의 메서드가 다른 기능을 수행하도록 하는 특성을 의미합니다. 다형성을 통해 같은 인터페이스를 갖는 객체가 다른 구현을 가지도록 함으로써 코드의 유연성과 확장성을 높입니다. 다형성은 오버로딩(Overloading)과 오버라이딩(Overriding)으로 구현될 수 있습니다.
    4. 추상화 (Abstraction): 추상화는 객체들이 공통적인 특성을 추출하여 클래스로 정의하는 과정을 의미합니다. 추상화를 통해 현실 세계의 복잡성을 단순화하여 모델링할 수 있고, 프로그램의 복잡성을 줄이고 개발 과정을 간소화할 수 있습니다. 추상화는 인터페이스와 추상 클래스를 통해 구현될 수 있습니다.
  4. 대표적인 객체지향 언어에는 어떤 것들이 있나요?

  5. 클래스, 객체, 인스턴스 차이에 대해서 설명해 주세요.

    📖 클래스(Class)란?

    📖 객체(Object)란?

    📖 인스턴스(Instance)란?

  6. 순수 추상 클래스와 인터페이스의 차이는 무엇인가요?

    Untitled

  7. 인터페이스와 추상클래스 사용처

    인터페이스나 추상클래스나 둘이 똑같이 추상 메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다.다만 이 둘은 각각 고유의 몇몇 특징들을 가지고 있는데, 이러한 특징으로 인해 각각 사용처가 갈리게 된다.

    또한 기능적인 부분 뿐만 아니라 인터페이스와 추상클래스가 내포하고있는 논리적인 의미로서도 사용처가 나뉜다.예를들어 이 둘은 대표적으로 '다중 상속' 기능 여부의 차이가 있지만, 이것이 포인트가 아니라 이에 따른 사용 목적이 다르다는 것에 포인트를 맞춰야 한다.

    인터페이스 :implements 라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌

    추상 클래스:extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장 시키는 느낌

  8. 오버로딩과 오버라이딩의 차이는 무엇인가요?

    오버로딩(Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

    오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용

  9. 업캐스팅과 다운캐스팅이란?

    업캐스팅(Upcasting)

    업캐스팅이란 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것을 말한다.

    다운캐스팅(Downcasting)

    업캐스팅과 반대로 캐스팅 하는 것을 다운캐스팅이라고 한다. 업캐스팅된 것을 다시 원상태로 돌리는 것을 말한다. 하위 클래스로의 다운캐스팅을 할때는 타입을 명시적으로 지정해줘야한다는 특징이 있다.

함수형

  1. 함수형 프로그래밍에 대해서 설명해 주세요.
  2. 부수효과와 순수함수가 무엇인가요?
  3. 1급 객체란?
  4. 참조 투명성이란?

디자인패턴 및 아키텍처

  1. 디자인 패턴이란 무엇인가요?
  2. 추상 팩토리 패턴이란?