💡객체지향 프로그래밍(OOP)에 대해 설명해주세요
기능이 아닌 객체가 중심인 프로그래밍 방식입니다. 현실 세계의 개체와 그들 간의 상호작용을 모델링하는 방식으로 소프트웨어를 설계하고 구현하는 개념입니다.
OOP의 특징으로는 캡슐화, 상속, 다형성, 추상화 등이 있고 모듈 재사용으로 확장 및 유지보수가 용이합니다.
캡슐화는 클래스 안의 서로 연관되어 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말합니다.
상속은 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 합니다.
다형성은 어느 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질을 말합니다.
추상화는 중요한 부분을 강조하기 위해 객체가 갖는 본질적이고 공통적인 부분만을 추출하여 표현하는 행위를 말합니다.
💡Java는 무엇인가요?
Java는 객체지향 프로그래밍 언어입니다. Java는 JVM(Java Virtual Machine)자바 가상 머신)을 사용하여 운영체제와 독립적으로 동작할 수 있어 어느 운영체제에서나 같은 형태로 실행 되어 이식성이 높은 언어입니다. 하지만 JVM 위에서 동작하기 때문에 실행속도가 다른 언어에 비해 상대적으로 느립니다. GabageCollector를 통해 자동적인 메모리 관리가 가능한 것이 장점입니다.
💡Java의 컴파일 과정에 대해 설명해주세요
- 개발자가 Java 파일을 작성한다
- 작성한 Java 파일을 Build 한다
- 자바 컴파일러를 통해 Java 파일에 대한 바이트코드(.class)를 생성한다
- Class Loader를 통해 JVM 메모리로 로드한다
- 실행엔진을 통해 각 운영체제에 맞게 컴퓨터가 읽을 수 있는 기계어로 해석된다
💡클래스와 객체의 차이에 대해서 설명해주세요
클래스는 객체를 생성하기 위한 틀 또는 설계도로, 생성할 객체의 속성과 행동을 정의합니다.
객체는 클래스를 기반으로 실제 메모리에 생성된 인스턴스입니다.
💡Java의 메모리 영역에 대해 설명해주세요
자바의 메모리 영역은 크게 메소드, 스택, 힙 영역으로 나눌 수 있습니다
메소드 영역은 전역 변수와 상수가 저장이 됩니다. JVM 시작 시에 메모리에 할당이 되며 저장된 정보는 모든 객체에 공유되고
프로그램이 종료될 때까지 메모리에 남아있습니다.
스택 영역은 지역 변수와 메소드 호출 스택이 저장됩니다. 메소드가 완료되면 제거됩니다.
힙 영역은 인스턴스와 배열이 저장됩니다. 가비지 컬렉션이 자동으로 참조되지 않는 객체를 제거합니다.
💡오버라이딩과 오버로딩에 대해 설명해주세요
오버라이딩은 상위 클래스에 있는 메소드를 하위 클래스에서 재정의 하는 것을 말하고
오버로딩은 같은 이름의 메소드를 매개변수를 다르게 하여 여러개 정의하는 것을 말합니다.
💡추상클래스와 인터페이스를 설명해주시고 차이에 대해 설명해주세요
추상클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말하고
인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.
공통적으로 new 연산자로 인스턴스 생성이 불가능하고 사용하기 위해서는 하위 클래스에서 확장이나 구현해야 합니다.
차이점으로는 인터페이스를 구현받은 클래스에는 추상 메소드가 반드시 존재해야 된다는 강제성이 특징이 있고
다중 구현이 가능합니다. 추상클래스는 다중 상속이 불가능합니다.
💡객체 지향의 설계원칙에 대해 설명해주세요
1. SRP - 단일 책임 원칙 : 하나의 클래스는 하나의 책임만 가져야 한다
2.OCP - 개방 폐쇄 원칙 : 확장에는 열려있고 수정에는 닫혀있어야 한다
3.LSP - 리스코프 치환 원칙 : 하위 타입은 항상 상위 타입을 대체할 수 있어야 한다
4.ISP - 인터페이스 분리 원칙 : 견고한 인터페이스 보다는 메소드가 최소화 된 여러개의 인터페이스가 좋다
5.DIP - 의존관계 역전의 원칙 : 구체적인 클래스보다 상위 클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라
💡접근 제어자에 대해 설명해주세요
변수나 메소드의 접근 범위를 설정해주는 기능으로 4가지 예약어로 구분 됩니다.
public : 접근 제한이 없음
protected : 해당 패키지 내 접근 또는 다른 패키지에서 상속 가능
default : 해당 패키지 내에서 만 접근 가능
private : 해당 클래스에서만 접근 가능
💡static에 대해 설명해주세요
static 키워드를 사용한 변수나 메소드는 클래스가 로드될 때 초기화되며 프로그램 실행 동안 유지됩니다.
모든 객체간에 데이터를 공유할 수 있는 것이 특징입니다.
💡equals()와 ==의 차이
==는 해당 변수의 주소 값을 비교하고, equals()는 해당 변수의 값에 대한 비교를 합니다.
💡hashcode()에 대해 설명해주세요
객체를 식별하는 하나의 정수값을 말합니다.
객체가 동일한지 확인하고자 할 때, 값이 같더라도 주소가 다를 수 있기 때문에 객체의 동일성을 확인하는데 중요한 역할을 합니다.
💡Error와 Exception의 차이를 설명해주세요
Error는 실행 중 일어날 수 있는 치명적인 오류를 말합니다. 컴파일 시점에 체크할 수 없고 오류가 발생하면 프로그램은 종료되며 예측 불가능 UncheckedException에 속합니다.
반면, Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다.
💡synchronized에 대해 설명해주세요
여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다. 변수와 메소드에 적용해서 동기화 할 수 있으며, 남발하게 되면 오히려 프로그램의 성능 저하를 일으킬 수 있습니다.
💡Wrapper Class란 무엇이며 Boxing과 UnBoxing은 무엇인지 설명해주세요
기본 자료형에 대한 객체 표현을 래퍼 클래스(Wrapper class)라고 합니다.
기본 자료형을 Wrapper class로 변환하는 것을 boxing이라고 하며, Wrapper class를 기본 자료형을 변환하는 것을 UnBoxing이라고 합니다.
💡Seriallize에 대해 설명해주세요
직렬화(Serialiize)는 시스템 내부에 사용되는 객체 또는 데이터를 외부 시스템에서도 사용할 수 있도록 바이트(byte)형태로 데이터 변환하는 기술
💡SerialVersionUID를 선언해야 하는 이유에 대해 설명해주세요
JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여하는데, 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당하게 됩니다. 그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때 버전 번호가 다르면 역직렬화가 불가능하게 될 수 있기 때문에 이런 문제를 해결하기 위해 SerialVersionUID를 사용합니다
💡new String()과 리터럴("")의 차이에 대해 설명해주세요
new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고
""는 Heap 안에 있는 String Constant Pool 영역에 저장됩니다.
💡String, StringBuffer, StringBuilder에 대해서 설명해주세요
String은 불변의 속성을 가지며, StringBuffer과 StringBuilder는 가변의 속성을 가집니다.
StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용하며
StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용합니다
💡Inner Class(내부 클래스)의 장점에 대해 설명해주세요
내부 클래스는 클래스 내에 정의된 클래스를 말합니다. 내부클래스는 외부클래스의 멤버 변수 및 메소드에 접근할 수 있으며, 코드의 구조를 조직화하고 캡슐화를 강화하는데 사용됩니다. 외부에서는 내부 클래스에 접근할 수 없으므로 코드의 보안성을 높일 수 있습니다.
💡리플렉션(Reflection)이란 무엇인지 설명해주세요
리플렉션이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 도와주는 자바 API 입니다.
💡OptionalAPI에 대해 설명해주세요
Java8부터 지원하는 API로 null로 인한 예외가 발생하지 않도록 도와주고, 해당 클래스의 메소드를 통해 null을 컨트롤 할 수 있게 해줍니다.
💡가비지컬렉션에 대해 설명해주세요
가비지 컬렉션은 JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.
개발자 기술면접 질문 정리 - Java
개발자 기술면접 질문 정리 - DB
개발자 기술면접 질문 정리 - 자료구조
개발자 기술면접 질문 정리 - 알고리즘
개발자 기술면접 질문 정리 - 네트워크
개발자 기술면접 질문 정리 - 운영체제
개발자 기술면접 질문 정리 - 백엔드
개발자 기술면접 질문 정리 - 프로그래밍 공통/기타
'CS > 개발지식' 카테고리의 다른 글
[CS] 개발자 기술면접 질문 정리 - DB (1) | 2023.11.05 |
---|---|
[CS] 객체 지향 프로그래밍(OOP) (0) | 2023.03.23 |
[CS] 클래스, 인터페이스 (0) | 2023.03.23 |