본문 바로가기
Etc/BootCamp : TIL

[Day 28] 기술 면접 실습

by 달의 조각 2022. 7. 19.
글 생성: 2022.07.19, 기술 면접 실습: 2022.07.20

 

학습 주제

기술 면접 대비
메타인지

 


 

  1. 자바 데이터 타입 중 기본형과 참조형의 차이
    • 기본형은 실제 값(Data)를 저장하고, 참조형은 어떤 값이 저장된 주소(memory address)를 값으로 갖습니다.
    • 기본형은 논리형, 문자형, 정수형, 실수형의 총 8가지의 타입으로 나눌 수 있으며, 반드시 사용하기 전에 선언(Declared)되어야 합니다.  비객체타입이기 때문에 null 값을 가질 수 없습니다. 만약 기본형 타입에에 Null을 넣고 싶다면 Wrapper Class(래퍼 클래스)를 활용합니다. 스택(Stack) 메모리에 저장됩니다. 
    • 참조형은 이 기본형의 8개를 제외한 나머지 타입을 말합니다. JAVA에서 최상위 클래스인 Object 클래스를 상속하는 모든 클래스들을 말합니다. 클래스 타입(class type),인터페이스 타입(interface type),배열 타입(array type),열거 타입(enum type)이 있습니다. 빈 객체를 의미하는 Null이 존재합니다. 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생합니다. 예를 들어 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수 값을 넣어야 합니다.
    • 래퍼 클래스란?
    • 기본형의 정수형 타입에서 표현할 수 있는 최대값을 벗어났을 때 어떤 현상이 발생하나요?
  2. 클래스와 객체에 대해 설명
    • 객체는 실세계에 존재하는 모든 것이라고 말할 수 있습니다. 여기서 모든 것이란, 주변에 보이는 시계나 연필 등과 같이 실재하는 것들을 말하며, 이러한 사물들 뿐만 아니라 사람이나 동물, 그리고 논리적인 개념들까지도 포함합니다. 우리가 보고 느끼며 인지하는 모든 것들을 말할 수 있습니다.  자바의 객체지향 개념도 이 '객체'라는 주요한 단어에서부터 시작됩니다. 실제 세계는 앞서 설명드린 객체라는 것으로 모두 구성되어 있고, 발생하는 모든 사건들은 이 객체들 사이의 상호작용으로 이루어진다는 게 객체 지향의 핵심 원리입니다. 실제 사물의 속성과 기능을 분석하여 이를 프로그래밍에서 변수와 함수로 정의하여 실제 세계를 컴퓨터 프로그래밍 세계에 반영하는 것입니다.  클래스는앞에서 설명한 객체를 만들기 위한 설계도라고 할 수 있습니다. 객체는 이 클래스에 정의되어 설계된 대로 생성됩니다. 클래스와 객체의 관계를 우리의 실생활에서 찾는다면 TV 설계도와 TV 제품 자체를 예로 들 수 있습니다. 클래스는 객체를 만들 뿐, 객체는 아니기 때문에 원하는 기능의 객체를 사용하려면 먼저 클래스로부터 객체를 생성해야 합니다. TV 설계도로부터 TV 제품을 만든 후 사용할 수 있다는 맥락과 같습니다.  클래스를 만든 후 객체를 사용하는 이유는 미리 설계도를 잘 만들어 놓으면 제품을 만드는 일이 쉬워지기 때문입니다.  객체에 메모리가 할당되어 실제로 활용되는 실체는 '인스턴스'라고 합니다.
  3. 객체 지향의 장점은?
    • 객체 지향의 기본 개념은 "실제 세계는 객체들로 이루어져 있으며, 모든 사건들은 객체들의 상호작용이다"라고 할 수 있습니다.  서로 관계를 맺어 줘서 유기적으로 프로그램을 구성하는 것이 가능합니다.  상속, 다형성, 캡슐화, 추상화의 개념을 가지며, 코드의 재사용성이 높고 관리가 용이하며, 신뢰성 있는 프로그래밍을 가능하게 합니다.
  4. 객체와 인스턴스의 차이
    • 클래스로부터 객체를 만드는 과정을 인스턴스화라고 하는데, 어떤 클래스로부터 만들어진 객체를 그 객체의 인스턴스라고 합니다
  5. 생성자에 대해 설명
    • 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'입니다. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시 실행되어야 할 작업을 위해서도 사용됩니다.  클래스 내에 생성이 되며, 메서드와 구조가 유사하지만 생성자는 리턴값을 갖지 않습니다. 생성자의 조건은 이름이 클래스의 이름과 같아야 하며, 리턴 값이 없다는 것입니다.  모든 클래스에는 반드시 하나 이상의 생성자가 있어야 하며, 생성자도 오버로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있습니다.
  6. 메서드 오버라이딩과 메서드 오버로딩의 차이
    • 오버라이딩(Overriding)의 사전적인 의미로 '~위에 덮어쓰다'라는 뜻을 가집니다. 프로그래밍에서 조상 클래스로부터 상속받은 메서드의 내용을 재정의하는 것을 말합니다. 상속을 받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우에 오버라이딩을 합니다.  내용만을 재정의하는 것이기 때문에 조상 클래스의 메서드와 이름이 같아야 하며, 매개변수와 반환 타입 또한 같아야 합니다.요약해서 메서드의 선언부가 일치해야 한다고 할 수 있는데, 접근 제어자와 예외의 경우는 제한된 조건 하에 다르게 변경할 수 있습니다. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없고, 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없습니다.  오버로딩(Overloading)은 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러 개 정의하는 것을 말합니다. 기존에 없는 새로운 메서드를 정의하는 것입니다.  메서드 이름이 같더라도 매개변수가 다르면 서로 구별되기 때문에 오버로딩이 가능한 것인데, 이를 만족시키지 못하는 메서드는 중복 정의로 간주됩니다.  메서드는 매개변수로만 구분될 수 있기 때문에 반환 타입은 영향을 주지 못합니다.
  7. 자바의 메모리 영역에 대해 설명
    • 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당됩니다.  메소드 영역에는 전역 변수와 static 변수를 저장하며, 프로그램의 시작부터 종료까지 메모리에 남아 있습니다. JVM이 동작해서 클래스가 로딩될 때 생성됩니다.  스택 영역은 지역 변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드 호출 시 메모리에 할당되고 종료되면 메모리가 해제됩니다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워집니다. 런타임 시 할당됩니다.  힙 영역은 new 키워드로 생성되는 객체(인스턴스), 배열 등이 저장되며, 가비지 컬렉션에 의해 메모리가 관리됩니다. 컴파일 타임 시 할당됩니다.
    • 컴파일 타임 : 소스코드가 기계어로 변환되어 실행 가능한 프로그램이 되는 과정
    • 런타임 : 컴파일 타임 이후 프로그램이 실행되는 때
  8. static 키워드에 대해 설명, static을 언제 사용해야 하는가?
    • static 키워드는 '클래스의' 또는 '공통적인'이라는 뜻을 가집니다. 이러한 의미와 같이 static 키워드를 가진 멤버 변수의 경우 인스턴스와 관계 없이 같은 값을 가지게 됩니다. 하나의 변수를 모든 인스턴스가 공유하기 때문입니다.  이 static 키워드를 붙인 변수나 메소드는 인스턴스 생성 시 생성되는 인스턴스 변수와는 달리 클래스가 메모리에 올라갈 때 자동으로 생성됩니다. 때문에 인스턴스 변수와는 달리 인스턴스를 생성하지 않고도 클래스 이름만으로 호출하여 사용이 가능합니다.  이처럼 인스턴스를 생성하지 않고도 호출이 가능하다는 편리함과 빠른 속도의 장점으로 인해 인스턴스 멤버를 사용하지 않는 메서드의 경우, static을 붙여서 static 메서드로 선언해 주는 것이 좋습니다.  GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.  static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용 자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일 수 있습니다.
  9. 클래스 메서드에서 인스턴스 변수를 사용할 수 있나요?
    • 불가능하다 인스턴스 변수는 인스턴스가 반드시 존재해야 사용할 수 있는데 클래스 메서드는 인스턴스 생성 없이 사용 가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다
  10. 자바 객체 지향 프로그래밍(OOP)에 대해 설명
    • 객체 지향의 기본 개념은 "실제 세계는 객체들로 이루어져 있으며, 모든 사건들은 객체들의 상호작용이다"라고 할 수 있습니다.  서로 관계를 맺어 줘서 유기적으로 프로그램을 구성하는 것이 가능합니다.  상속, 다형성, 캡슐화, 추상화의 개념을 가지며, 코드의 재사용성이 높고 관리가 용이하며, 신뢰성 있는 프로그래밍을 가능하게 합니다.
  11. 자바 접근 제어자의 특징과 종류
    • 접근 제어자는 변수 또는 메소드의 접근 범위를 설정하기 위해서 사용하는 Java의 예약어를 말합니다.  public은 접근 제한이 없어서 같은 프로젝트 내 어디서든 사용이 가능합니다. protected은 해당 패키지 안에서 사용 가능하고, 다른 패키지이더라도 자손 클래스에서 접근 가능하다. default는 기본 접근 제어자이며 해당 패키지 내에서만 접근 가능합니다 private은 해당 클래스에서만 접근이 가능합니다
  12. 추상 클래스와 인터페이스의 차이
    • 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말하고,인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.공통점new 연산자로 인스턴스 생성 불가능사용하기 위해서는 하위 클래스에서 확장/구현 해야 한다.  차이점인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함에 있고, 추상클래스는 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용한다.추상클래스는 다중상속이 불가능하지만, 인터페이스는 다중상속이 가능하다.
  13. 이너클래스의 장점
    • 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다.  2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.  3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.
  14. OOP의 장점과 단점
    • 객체지향언어의 장점은 크게 세 가지로 설명할 수 있습니다.  첫 번째로, 코드의 재사용성이 높습니다. 새로운 코드를 작성할 때 이전의 코드를 이용하여 쉽게 작성할 수 있습니다.  두 번째는 코드의 관리가 용이합니다 코드의 관계를 이용해서 적은 노력으로도 쉽게 코드를 변경할 수 있습니다.  세 번째는 신뢰성 높은 프로그래밍을 가능하게 합니다 제어자와 메서드를 이용해서 데이터를 보호하여 값을 유지하는 것이 가능합니다. 또한 코드의 중복을 제거해서 코드의 불일치로 인한 문제를 방지할 수 있습니다.
  15. List, Set, Map의 차이
    • List는 순서가 있는 데이터의 집합이며, 데이터의 중복을 허용합니다. 대표적인 구현체로는 ArrayList가 있고, LinkedList, Stack, Queue 등의 구현체가 있습니다.  Set은 순서가 없는 데이터의 집합이며, 데이터의 중복을 허용하지 않습니다. 대표적인 구현체로는 HashSet이 있고, 순서를 보장하기 위해서는 LinkedHashSet을 사용합니다.  LinkedHashSet, TreeSet  Map은 키와 값이 한 쌍으로 이뤄져 있고, 키를 기준으로 중복을 허용하지 않으며, 순서가 없습니다. key의 순서를 보장하기 위해서는 LinkedHashMap을 사용합니다.HashMap, TreeMap, HashTable, Properties  Stack 객체는 직접 new 키워드로 사용할 수 있으며, Queue 인터페이스는 LinkedList에 new 키워드를 적용해 사용할 수 있습니다.
  16. 컬렉션과 스트림의 차이
  17. 제네릭에 대해 설명, 컬렉션 클래스에서 왜 제네릭을 사용하는가?
    • 제네릭은 데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미입니다.  컴파일 시 강한 타입 체크를 통해,클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있습니다.  반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있습니다.  타입 변환을 제거해 전체 애플리케이션 성능을 높일 수 있다.

 

회고

 

  페어와 함께 기술 면접 대비 시간을 가졌다. 미리 문제가 주어지고 어떤 문제의 답변을 할지 미리 정하고 한 활동이지만 '면접'이라는 이름에 녹화도 한다고 하니 떨렸다.

전날 각 문제들의 답변을 생각해 보면서 답변에 대한 꼬리질문도 떠올려 봤다. 정말 완벽하게 답변할 수 있다! 싶은 질문보다 그렇지 않은 질문의 수가 더 많았다. ㄱ- 분명 머릿속으로는 아는 개념인데도 설명할 때는 애매한 부분들이 있었다. 더군다나 이를 전달력 있게 말로 설명하려면 많은 연습이 필요할 것이다.

준비 시간이 많지 않기도 했고, 떨려서 횡설수설 전달력 없이 얘기를 하게 될까 봐 모니터에 내용을 띄워 뒀는데 결국에는 다 보고 얘기했다  ^^ ... 이전부터 '~인 것 같아요' 같은 추측성 말 끝맺음이 좋지 않다고 들어서 이를 많이 신경 썼고, 말의 속도가 빨리지는 것도 의식하며 말했다.

내가 정말 즉석에서 답변을 떠올리고 답변한 게 아니라서 어떤 점들을 고쳐야 할지 다 파악하지 못했지만 Section 1에서 공부했던 내용을 정리할 수 있는 시간이었다.

미니 잡서칭의 추천 도서에서 '한 권으로 읽는 컴퓨터 구조와 프로그래밍 -  조너선 스타인하트' 책을 읽기로 했다.

Java를 공부하면서 컴퓨터의 전체적인 구조에 대해 잘 파악한다면 컴퓨터와 더 쉽게 소통할 수 있겠다는 생각이 들었다. 웹에 대한 전반적인 내용을 학습할 때에도 우선 컴퓨터 자체를 잘 알고 이 기반 위애 학습해 나가면 더 이해가 쉬울 것이다. 컴퓨터를 다루는 입장에서 꼭 다뤄야 할 내용이라고 생각해서 이 책을 선택했다.

 

★★★★☆

댓글