CS & Interview

[CS] 기술 면접 준비 part1. 자바와 OOP의 기본

마손리 2023. 3. 13. 11:51

모르는 내용에 대해서 모르는 부분을 인정하고 아는 부분까지는 최선을 다해 설명하려고 노력 하였는가?

 

추측성 단어가 아닌 자신감 있는 단어로 답변하였는가?

 

한번 들었을 이해하기 쉬운 답변이었는가?

 

몸을 베베꼬거나 다른데를 보거나 하는 나쁜자세를 취하지 않았나?

 

질문을 이해하고 문제의 요지를 파악하였는가

 

해당 개념 설명이 간단 명료한가?

 

개념 설명과 예시가 단순 암기가 아니라 자신의 언어로 충분히 풀어 설명 되었나요?

 

두괄식으로 개념을 설명하고, 그에 따른 예시를 풀어서 설명하고 있나요?

 

개념 활용 예시가 구체적이고 풍부했는가?

 

모르는 내용에 대해 불명확하게 설명한 부분이 있었는가?

 

정확한 CS 용어(ex. 변수를 만들어서 값을 넣어요. → 변수를 선언하고 값을 할당합니다. ) 사용해서 답변했나요?

 

 

Part 1. Java

Q1. 자바 데이터 타입 중 기본형과 참조형의 차이에 대해 설명해주세요.

질문에 앞서 자바의 기본형 데이터 타입으로는 정수형(숫자 정수), 실수형(숫자 실수), 문자형, 논리형(불리안)이 존재하며 참조형으로는 클래스, 인터페이스, 배열과 같이 기본형 타입의 데이터를 여럿 담을 수 있는 구조로 되어있습니다.

 제가 생각하는 기본형과 참조형 타입의 가장 큰 차이점은 저장 방식이라 생각합니다.

 

기본형의 경우 해당 변수에 값 자체가 직접 저장되며 참조형의 경우 변수에 객체에 대한 참조, 즉 메모리 주소가 저장됩니다. 간단하게 *System클래스의 println() 메서드를 호출하여 변수들을 출력하면 기본형 변수의 경우 할당된 값이 출력되지만 참조형 변수의 경우 해당 변수의 저장된 메모리 주소가 출력됩니다. 

 

이외에도 저장되는 *메모리 공간, 기본 초기화 값, 크기등에서 차이를 보입니다.

 

*System 클래스 : java.lang 패키지에 속하는 static 객체로서 System 클래스를 직접 import 하지 않아도 사용할 수 있으며 모든 멤버가 static이기 때문에 별도의 인스턴스화를 진행할 필요가 없다. System 클래스는 운영체제 시스템과 관련된 기능을 제공하는 클래스로 이중 out이라는 static 필드는 PrintStream 객체를 담고있는 out이라는 static 필드를 가지고 있으며 PrintStream의 println() 메서드를 이용하여 특정 값을 출력할 수 있다.

 

*메모리 공간, 기본 초기화, 크기

  1. 메모리 공간:
    • 기본형: 스택 메모리에 저장됩니다.
    • 참조형: 실제 데이터는 힙 메모리에 저장되고, 스택 메모리에는 힙 메모리 주소가 저장됩니다.
  2. 초기화:
    • 기본형: 자동으로 기본값으로 초기화됩니다.
    • 참조형: null로 초기화됩니다.
  3. 크기:
    • 기본형: 고정된 크기를 가지며, 모두 같은 크기를 갖습니다.
    • 참조형: 객체의 크기는 가변적이며, 객체마다 다를 수 있습니다.

 

Q2. 클래스와 객체에 대해 설명해주세요.

클래스와 객체는 객체 지향 프로그래밍의 가장 기본이 되는 개념이라 생각됩니다. 

클래스는 객체를 생성하기 위한 설계도로써 클래스는 필드(데이터)와 메서드로 구성되어 있습니다. 클래스는 객체를 생성하기 위한 틀로, 객체의 상태(속성)와 행동(메서드)을 정의합니다.

 

객체는 클래스에 정의된 설계에 따라 생성된 인스턴스로 실제 메모리에 할당된 것이며 실제 프로그램에 사용됩니다.

 

Q3. 생성자에 대해 설명해주세요.

생성자란 객체를 생성할 때 호출되는 특별한 종류의 메서드입니다. 생성자는 객체의 초기화를 담당하며, 주로 필드의 초기값을 설정하거나 객체를 사용하기 전에 필요한 설정을 수행합니다.

생성자는 메소드와 비슷한 형태를 가저 해당 클래스의 인스턴스화시 매개변수를 정할 수 있으며 *오버로딩이 가능하지만 리턴타입이 없습니다. 

 

*오버로딩 : 오버로딩은 같은 이름의 메서드나 생성자를 여러 번 정의하되 매개변수의 타입, 개수, 순서등을 다르게하여 다양한 상황에서 호출할 수 있게 하는 객체 지향 프로그래밍의 특징입니다.

 

Q4. 메서드 오버라이딩과 메서드 오버로딩의 차이는 무엇인가요?

메서드 오버라이딩과 메서드 오버로딩은 둘 다 자바에서 *다형성을 구현하는 방법이지만 목적과 방식에서 큰 차이점을 나타냅니다. 

 

오버라이딩의 경우 부모 클래스에서 정의된 특정 메서드를 하위 클래스에서 재정의 하는 것으로 해당 메서드의 시그니처(이름, 매개변수 타입, 개수, 순서, 리턴 타입)들이 동일해야 합니다.

오버로딩의 경우 메서드의 이름은 같지만 해당 메서드의 시그니처들이 다르게 정의된 것이며 경우에 따라 이름만 같은 전혀 다른 메서드가 될 수도 있습니다.

 

쉽게말해 오버라이딩의 경우 부모 클래스에 정의된 특정 메서드를 자식 클래스에서 재정의하며 오버로딩의 경우 같은 클래스 내에서 메서드의 이름만 같을 뿐 메서드의 시그니처가 다른 매서드입니다.

 

*다형성 : 같은 코드가 여러가지 형태를 가질 수 있는 개념으로 객체 지향 프로그래밍의 특징 중 하나입니다. 

 

Q5. 자바의 메모리 영역에 대해 설명해주세요.

자바 프로그램이 실행될 때, 시스템은 메모리를 여러 영역으로 나누어 사용합니다. 각 영역은 다용한 목적으로 사용되며, 각각의 역할과 특징이 있습니다. 

 

Heap 메모리 영역은 객체와 배열이 생성되며 가비지 컬렉터에 의해 관리되어 더이상 사용되지 않는 객체들을 정리합니다.

Stack 메모리는 메서드 호출과 관련된 정보를 저장합니다. 지역 변수, 매개변수 값, 메서드 주소 등이 여기 저장되며 메서드가 호출될 때마다 스택 프레임이 생성되며 제거됩니다. 

메서드 영역은 클래스 정보와 정적 변수들을 저장하며 JVM이 시작될 때 클래스의 정보를 이 영역에 저장합니다. 

 

이외에도 현재 수행 중인 스레드의 주소를 가리키는 PC 레지스터 등, 다른 영역들이 존재합니다. 

 

*자바의 메모리 영역 : Heap, Stack, 메서드, 상수 풀, PC 레지스터, 네이티브 메서드 스택, 직렬화된 객체 영역, 다이렉트 메모리 영역

 

Q6. static 키워드에 대해 설명하고, static을 언제 사용해야 하는 지 설명해주세요.

static은 정적 변수, 정적 메서드, 정적 내부 클래스를 생성할 때 사용되며 최상위 클래스와 같이 JVM이 시작될 때 메서드영역에 저장됩니다. 이로 인해 static 정보들은 해당 클래스를 인스턴스화 하지않고도 접근이 가능합니다.

 

static은 여러 객체간에 동일한 데이터를 공유해야 할 때, 혹은 유틸리티 메서드를 만들어 객체의 특정 상태에 의존하지 않고 클래스 수준에서 작업을 수행해야 할 때 사용됩니다.

 

Q7. 자바 객체지향 프로그래밍(OOP)에 대해 설명해주세요.

객체지향 프로그래밍이란, 캡슐화, 상속화, 다형성, 추상화를 통해 객체 중심적인 프로그래밍을 함으로써 코드의 재사용성과 유지보수성을 향상시키는 방법입니다.

 

캡슐화란 데이터와 해당 데이터를 다루는 메서드들을 하나로 묶어서 클래스로 정의하여 *데이터의 무결성을 보장하게 됩니다.

상속화는 하나의 클래스가 다른 클래스의 특성을 상속받아 확장하는 개념입니다. 이를 통해 코드의 재사용율을 줄이고 가독성을 향상시킵니다.

다형성은 메서드 오버로딩, 오버라이딩, 제네릭등을 이용하여 연산자가 다양한 상황에서 다르게 동작하는 능력을 의미합니다. 

추상화는 추상 클래스와 인터페이스를 통해 클래스나 객체의 중요한 특성을 강조하고 불필요한 세부 정보를 숨김으로써 복잡한 시스템을 단순화 시키고, 필요한 부분에 중점을 두는 것을 의미합니다. 

 

*데이터의 무결성 : 데이터의 정확성, 일관성, 유효성이 유지되는 상태를 의미합니다. 캡슐화를 통해 자체적으로 데이터에 접근하는 메서드를 만들고 외부에서의 접근을 막아 데이터의 무결성을 보장할 수 있습니다.

 

Q8. OOP의 장점과 단점에 대해 설명해주세요.

객체지향 프로그래밍의 장점으로는 클래스와 객체를 모듈화하고 재사용이 가능한 구성요소로 만들어 개발시간을 단축하고 유지보수성, 가독성, 유연성을 높입니다.

 

실제로 Node.js와 자바를 공부했을때 차이점으로 OOP의 경우 각각의 기능에 맞게 클래스들을 분리하여 작성함으로써 코드의 가독성과 유지보수성이 크게 늘어났습니다. 

 

OOP의 단점으로는 첫번째로 학습 당시 처음 개념을 이해하기 어려웠고 프로젝트의 규모에 따라 개발자의 설계 능력이 다소 요구됩니다. 또한 객체 지향 프로그래밍은 객체가 메모리 상에 생성되어야 하므로 일반적으로 더 많은 메모리를 소요할 수 있습니다.

 

Q9. 자바 접근 제어자의 특징과 종류에 대해서 설명해주세요.

자바의 접근 제어자를 통해 클래스, 변수, 메서드 등의 멤버들의 접근 권한을 제어하여 정보 은닉과 모듈화가 가능해 집니다. 

 

접근 제어자의 종류로는 public, protected, default, private이 존재합니다. 

public은 어디에서나 접근이 가능하며, protected는 같은 패키지 혹은 부모 클래스의 멤버들만 접근 가능합니다. default의 경우 같은 패키지 내에서만 접근이 가능하며 private은 오직 해당 클래스 내부에서만 접근이 가능합니다. 

 

접근 제어자를 통해 코드의 안정성과 가독성을 높여줄 수 있으며 유지보수에 도움을 줄 수 있습니다. 

예를 들어 접근 제어자를 통해 회원 정보만을 다루는 모듈을 생성하였을 경우 나중에 코드의 수정이 필요 하더라도 해당 모듈의 코드만을 수정하여 유지보수의 시간을 빠르게 줄일 수 있습니다.

 

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

추상 클래스와 인터페이스는 모두 자바에서 추상화를 구현하는 방법이지만 몇가지 차이점이 존재합니다.

 

추상클래스의 경우 메서드 및 변수를 포함할 수 있으며 단일 상속만을 지원하지만 인터페이스의 경우 메서드만 포함할 수 있으며 다중 상속을 지원합니다. 

 

Q11. 이너클래스의 장점에 대해 설명해주세요.

이너클래스를 사용하면 코드를 논리적으로 그룹화할 수 있습니다. 

 

예를 들어 로그인 기능을 만들시, 소셜 로그인과 일반 로그인의 코드를 각각 다른 클래스에 구현하는 것이 아닌 로그인이라는 클래스에 두개의 이너클래스를 만들어 구현할 수 있습니다.

이를 통해 이너클래스는 외부클래스의 멤버(변수, 메서드)에 쉽게 접근하여 코드 재사용성을 높이고 중복된 코드를 줄여 가독성과 유지보수성 또한 높일 수 있습니다.

 

Q12. List, Set, Map의 차이에 대해서 설명해주세요.

List, Set, Map 모두 자바의 컬렉션 프레임워크의 인터페이스들로써 여러 자료구조들을 구현합니다.

 

List의 특징으로는 순서가 있으며, 중복된 요소를 허용하고 인덱스를 이용해 요소에 빠르게 접근할 수 있습니다. 

Set의 경우 순서를 보장하지 않으며 중복된 요소 또한 불가능합니다. 하지만 LinkedHashSet의 경우 저장순서를 보장받습니다.

Map의 경우 기본적으로 키와 값 형태로 저장되며 키는 중복이 불가능하지만 값은 중복이 가능합니다. 다만 MultiValueMap을 사용한다면 키의 중복도 허용됩니다. 

 

Q13. 컬렉션과 스트림의 차이에 대해서 설명해주세요.

 

 

Q14. 제네릭에 대해서 설명하고, 컬렉션 클래스에서 왜 제네릭을 사용하는 지 설명해주세요.

 

 

 

 

HTTP란?

HTTP는 웹브라우저와 서버간의 통신을 위한 프로토콜로, 클라이언트가 요청을 보내고 서버가 응답을 반환하는 규약입니다.

헤더와 바디로 구성된 텍스트 기반으로 이루어저 있으며 HTTP 메서드를 통해 서버에게 수행할 작업을 알려줍니다.

 

HTTP 메서드란?

클라이언트가 웹서버에게 요청을 보낼 때 어떤 동작을 수행할지를 지정하는 명령어로 GET, POST, PUT, DELETE, PATCH 등이 있습니다.

 

URL과 URI의 차이점

URI는 어떠한 자원을 식별하기 위한 문자열이며 URI는 해당 자원의 위치를 지정합니다.

URN 또한 자원을 식별하기 위한 문자열 이지만 URI와의 차이점으로는 URL 이후의 문자열을 URN이라 칭하며 URL과 URN을 통합한 문자열 전체를 URI라 합니다.

 

REST API란?

두 컴퓨터 시스템이 인터넷을 통해 정보를 교환하기 위해 사용하는 인터페이스입니다. 

HTTP 프로토콜 기반으로 자원을 고유한 URI로 표현합니다. 

 

 

 

 

 

11 - 사용해 클라우드 인프라 서비스에 대해 소개해 주세요.

제가 사용해본 클라우드 서비스로 서버 개설을 위해 aws s3, ec2, rds 사용하였고 자동 배포화를 위해 AWS code pipeline, code deploy, code build 사용하였습니다.

 

S3 rds ec2 경우 백엔드 서버를 배포하기위해 사용되는 기본적인 클라우드 서비스 입니다. 서비스의 역할로는 먼저 S3 정적인 데이터, 이미지파일, 텍스트파일, 동영상파일과 같은 데이터를 저장하기 위해 사용해 줍니다.

RDS 관계형 데이터배이스 서비스로 저의 경우에는 mysql 기반으로 하는 데이터베이스 서버로 개설하여 사용해 주었습니다.

Ec2 동적인 데이터를 처리하기 위한 클라우드 서비스로 빌드된 코드파일을 배포해주는 역할을 합니다.  

 

code pipeline, code deploy, code build 경우 서버의 자동 배포화 ci/cd 위한 클라우드 서비스 입니다.

자동 배포화를 위해선 github 같은 리파지토리의 변화를 감지하고 변경된 코드를 빌드한 ec2 배포하는 과정이 필요한데 과정들을 codepipeline 감독해 주게 됩니다. 만약 github 리파지토리에 변경된 코드가 push된다면 codepipline 이를 감지하고 codebuild에게 변경된 코드를 넘겨주게 됩니다. Codebuild 의해 .jar 같은 소스파일이 빌드가되면 해당 파일을 codepipline 주도하에 codedeploy 넘겨받게 됩니다. 이후 codedeploy 개설된 ec2서버를 이용하여 배포를 시도하게 됩니다.

 

 

 

 

 

 

 

 

 

 

12 - vmware 같은 가상머신이랑 Docker 무슨 차이가 있는지 설명해 주세요.

먼저 버추얼머신과 docker 역할은 비슷합니다. 둘다 프로세스, 네트워크, 파일 시스템을 격리하여 독자적인 개발 환경을 제공합니다만 둘의 가장 큰차이는 작동원리에서 나타납니다.

 

버추얼 머신의 경우 각각의 가상 공간에 windows 같은 os 설치해야하는 과정을 반드시 거처야만 합니다. 이렇게 하나의 컴퓨터에 여러 개의 os 관리하다보니 리소스 관리가 힘들어저 속도저하 혹은 시스템 다운과 같은 단점이 생깁니다.

하지만 docker 경우에는 컨테이너들이 호스트의 os 공유 하고 개발 환경만을 따로 관리 하게 됩니다. 서버를 가동시키는 직접적으로 필요한 실행파일들만을 컨테이너로 격리시키고 자원 관리 등의 커널 역할을 하는 하나의 메인 os만을 두어 자원을 효율적으로 사용하게 됩니다.

 

커널: 자원 관리와 같이 os 핵심 기능을 구현한 프로그램

컨테이너에 OS 올리지 않는데, Docker Hub 존재하는 각종 OS 이미지는 무엇인가요?

알려진 리눅스 배포판인 우분투, CentOS 등은 결국 동일한 리눅스 커널 위에서 만들어진 것입니다. 각자가 고유의 디렉토리 구조, 패키지 시스템(apt, yum), (bash, zsh) 등을 사용했을 뿐입니다. OS 이미지는 컨테이너 애플리케이션 구성의 편의를 위해 존재하는 이미지입니다. 우분투, CentOS 이미지를 사용한다고 해도 결코 컨테이너에 커널 수준의 OS 올라가지 않습니다.

 

 

 

 

 

 

 

 

 

13 - CI/CD 무엇이라고 생각하시나요? CI CD 차이점이 무엇인지 설명해 주세요.

Ci/cd에서 Ci 지속적 통합을 의미합니다. 애플리케이션 개발을 여러 개발자들이 하나의 애플리케이션을 위해 각기 다른 기능을 작업을 각자 작성한 소스코드를 병합하는 방식으로 작업이 진행 됩니다. 이때 각각의 소스코드를 직접 수작업으로 병합해주는 것이 아닌 공유 브랜치를 통해 변경사항을 애플리케이션에 적용해주고 변경된 사항을 적용시켜 자동으로 애플리케이션을 구축하고 자동으로 테스트를 실행하여 하나의 애플리케이션을 완성합니다. 이후 완성된 애플리케이션은 cd 통해 자동화 배포를 진행합니다.

 

Cd 자동화 제공, 자동화 배포라는 의미이며 앞에서 언급드린 aws codepipe라인이 하는 작업을 진행합니다. ci 통해 애플리케이션이 완성 혹은 수정이되면 이를 감지하여 빌드 배포작업을 수행합니다.

 

https://www.redhat.com/ko/topics/devops/what-is-ci-cd