면접준비

[면접 준비] 1. 개발 상식 (Development Common Sense)

크스디 2021. 9. 22. 18:21

 

1. 좋은 코드란 무엇입니까 ? (워밍업 질문)

  • 수행시간이 상대적으로 빠른 코드

  • 가독성이 좋은 코드

  • 내용의 중복이 없는 코드

  • 수정이 쉬운 코드

 

 

2. 객체 지향 프로그래밍 (Object Oriented Programming)

  • Q1 : 객체지향 프로그래밍 (OOP)란 무엇입니까?
  • A : 객체지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.



  • Q2 : 객체지향 프로그래밍을 했을 때 장, 단점이 무엇입니까?
  • A : 
    <장점> 
    1. 코드 재사용성이 좋습니다.
    남이 만든 클래스를 가져와서 이용할 수 있고, 상속을 통해서 확장할 수 있습니다.

    2. 유지보수가 쉽습니다.
    비교 대상인 절차 지향 프로그래밍에서는 코드를 수정할 때 일일이 찾아가며 수정해야 하는 반면, 객체 지향 프로그래밍에서는 수정해야할 부분이 클래스 내부에 멤버 변수 혹은 메소드로 있기 때문에, 해당 부분만 수정하면 됩니다.

    3. 대형 프로젝트에 적합합니다.
    클래스 단위로 모듈화 시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 업무 분담이 용이합니다.

    <단점>
    1. 처리속도가 상대적으로 느립니다.
    2. 객체가 많으면 용량이 커질 수 있습니다.
    3. 설계시 많은 시간과 노력이 필요합니다.



  • Q3 : 클래스와 인스턴스(객체)는 무엇입니까?
  • A :
    클래스란, 프로그래밍을 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것입니다.
    인스턴스(객체)란, 클래스에서 정의한 규격을 토대로 실제 메모리 상에 할당한 것 입니다.
    (변수, 자료구조, 함수 등이 될 수 있습니다)
    (실제 프로그램에서 사용되는 데이터 입니다)




  • Q4 : 객체지향 프로그래밍의 3요소는 무엇입니까?
  • A : 객체지향 프로그래밍의 3요소는 [ 캡슐화 / 상속 / 다형성 ] 입니다.




  • Q5 : 캡슐화는 무엇입니까?
  • A : (캡슐화 == 은닉성)
    캡슐화는 정보 은닉을 하는 것입니다. 연관된 데이터들을 클래스라는 캡슐에 묶는 것입니다.
    외부에서는 내부를 들여다 볼 수 없고, 은닉된 정보로의 접근은 접근지정자 (public / protected / private)를 통해서 조작 가능합니다.




  • Q6 : 상속이란 무엇입니까?
  • A : (상속 == 재사용 + 확장)
    상위 클래스의 특성을 하위 클래스에서 물려받아 재사용 할 수 있는것을 말합니다. 하위 클래스에서는 필요한 속성을 더 확장하여 사용할 수 있습니다.




  • Q7 : 다형성이란 무엇입니까?
  • A : (다형성 == 사용 편의)
    하나의 객체 ( 변수명 or 함수명 )가 상황에 따라 다른 의미로 해석될 수 있는것을 말합니다.
    구체적으로는 오버로딩과 오버라이딩을 말합니다. 
    - 오버로딩(Overloading) : 매개변수, 리턴타입을 다르게 해서 같은 이름의 함수를 다양하게 정의하는 것입니다.
    예를들어, 생성자 오버로딩, 연산자 오버로딩 등이 있습니다.
    - 오버라이딩(Overriding) : 상위 클래스의 메서드를 하위 클래스에서 가져와서 재정의 하는 것입니다. 




    < 객체지향의 5원칙 >
  • Q8 : SRP 원칙이란 무엇입니까?
  • A : 객체지향 프로그래밍 5원칙 중 하나로, Single Responsibility Principle (단일 책임의 원칙)입니다.
    클래스는 단 하나의 책임을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 합니다.
    (핵심은 변경이 있을 때 파급효과가 적어야 한다는 것)




  • Q9 : OCP 원칙이란 무엇입니까?
  • A : Open Closed Principle (개방-폐쇄 원칙)입니다.
    SW 구성요소는 확장에는 열려있고, 변경에는 닫혀있어야 합니다. 기존 코드의 변경은 일어나지 않으면서 기능을 수정하거나 추가 할 수 있도록 설계해야합니다.
    (핵심은 다형성을 활용하는 것)




  • Q10 : LSP 원칙이란 무엇입니까?
  • A : Liscov Substitution Principle (리스코프 치환 원칙)입니다. 
    상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 합니다.
    다형성에서 하위 클래스는 인터페이스 규약을 모두 지켜야 한다는 의미로 해석할수도 있습니다.




  • Q11: ISP 원칙이란 무엇입니까?
  • A : Interface Segregation Principle (인터페이스 분리 원칙)입니다.
    특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다는 것입니다.
    예를들어 '자동차'라는 인터페이스가 있을 때, 운전 / 정비 인터페이스로 분리하는 것이 좋습니다.
    다시 말해서, 자신이 사용하지 않는 기능(인터페이스)에는 서로 영향을 끼치지 않는 것이 좋습니다.




  • Q12: DIP 원칙이란 무엇입니까?
  • A : Dependency Inversion Principle (의존 역전 원칙)입니다.
    의존 관계를 맺을 땐, 변화하기 쉬운 것보단 변화하기 어려운 것에 의존해야 한다는 원칙입니다.
    여기서 변화하기 어려운 것이란 추상 클래스나 인터페이스를 말하고 변화하기 쉬운 것은 구체화된 클래스를 의미합니다. 
    따라서 DIP를 만족한다는 것은 구체적인 클래스가 아닌 인터페이스 또는 추상 클래스와 관계를 맺는다는 것을 의미합니다.

 

 

 

[ 절차지향과 객체지향의 비교 ]

  • 절차지향 : 기능을 중심으로 함수를 구현한다.

    장점 : 컴퓨터의 처리구조와 유사해 실행속도가 빠르다.

    단점 : 유지보수가 어렵다.
            실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다 -> 디버깅이 어렵다.

 

  • 객체지향 : 데이터 중심으로 함수를 구현한다.

    장점 : 코드의 재활용성이 높다.
            절차지향보다 상대적으로 디버깅이 쉽다.

    단점 : 처리속도가 절차지향보다 느리다.
            설계에 많은 시간이 소요된다.

 

 

 

[ 객체(object)란? ]

컴퓨터 과학에서 객체 또는 오브젝트는 클래스에서 정의한 것을 토대로 메모리에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료구조, 함수 또는 메소드가 될 수 있다. 메모리가 할당되기 전까지 객체는 존재하지 않는다.

-> 컴퓨터에서 메모리를 할당받은 공간들을 객체라고 부를 수 있다. 변수, 자료구조, 함수 등이 될 수 있다.

객체지향 프로그래밍에서 객체는 클래스의 인스턴스이다.
인스턴스는 일반적으로 실행 중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트를 말한다.

 

출처 : https://jeong-pro.tistory.com/95

 

 

3. 함수형 프로그래밍 (Functional Programming)

  • Q1 : 함수형 프로그래밍이란 무엇입니까?
  • A : 함수형 프로그래밍이란 컴퓨터 프로그래밍 패러다임 중에 하나입니다. 함수를 이용해서 side effect가 생기지 않도록 선언형 프로그래밍 하는 것입니다.




  • Q2 : 함수형 프로그래밍을 함으로써 사라지는 side effect는 무엇입니까?
  • A : 멤버 변수를 사용하는 객체지향 프로그래밍과 달리, 함수형 프로그래밍은 변경될 가능성이 있는 변수의 가능성을 제외합니다. 같은 input에 대해서는 항상 같은 output을 보장합니다.




  • Q3 : 선언형 프로그래밍이란 무엇입니까?
  • A : 선언형 프로그래밍은 "어떤 과정을 통하는가" 가 아닌, "어떤 결과를 얻는가" 에 초점을 두는 프로그래밍 방식입니다.

 

 

4. API (Application Programming Interface)

  • Q : API란 무엇입니까?
  • A : API란 Application Programming Interface의 줄임말입니다. 말 그대로 Application(응용 프로그램)에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 말합니다.
    (쉽게 말하면, 개발자들이 프로그램을 만들기 위해 필요한 대용량 데이터들을 쉽게 제공해주는 수단
    또는, 데이터를 가진 프로그램으로부터 데이터를 호출해주는 것) 

 

 

5. 인터페이스(Interface)와 추상 클래스(abstract class)

  • Q1 : 인터페이스란 무엇입니까?
  • A : 인터페이스란 밑그림만 있는 기본 규격 설계도와 같습니다. 구체적인 일반 메서드, 일반 변수를 가지는 것이 아닌, 추상메서드와 상수만을 멤버로 가질 수 있습니다. 인터페이스는 표준, 약속, 규칙입니다.





  • Q2 : 인터페이스를 이용한 코드를 작성했을 때 장점은 무엇입니까?
  • A : 표준화가 가능합니다. 규약을 정하는 것이기 때문에 빠뜨리는 기능없이 구현을 할 수 있습니다. 






  • Q3 : 추상 클래스란 무엇입니까?
    • A : 미완성 설계도에 비유할 수 있습니다. 실체 클래스의 공통적인 부분을 추출해서 선언한 클래스입니다. 추상 클래스와 실체 클래스는 상속 관계입니다. 추상클래스는 객체를 생성할 수 없습니다. (인스턴스화 할 수 없습니다.) 규격에 맞는 실체 클래스를 구현할 수 있도록 도와줍니다.




  • Q4 : Java 에서, 인터페이스와 추상 클래스의 차이점을 설명해보세요
  • A : 추상클래스와 달리, 인터페이스는 다중 상속을 지원합니다.
    추상클래스는 미완성 설계도, 인터페이스는 기본 설계도에 비유할 수 있습니다. 

 

 



6. MVC 아키텍처

  • Q : MVC 패턴이란 무엇입니까?
  • A : MVC 패턴은 디자인 패턴 중 하나입니다. 디자인 패턴이란 프로그램을 효율적으로 개발하는 규약입니다.
    Model / View / Controller 로 이루어져 있습니다.
    Model은 애플리케이션의 정보, 데이터를 나타냅니다. 
    View는 사용자에게 직접 보여지는 인터페이스 요소입니다. 
    Controller는 Model과 View를 잇는 다리역할을 합니다. 사용자에 이루어지는 이벤트를 처리하는 부분입니다.

 

 

 

 

ref :
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Development_common_sense

https://velog.io/@neity16/series/%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%84

https://dev-momo.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99