2024. 6. 5. 20:28ㆍ단순답변정리
1. Java에 관해서 설명해주세요.
Java 언어의 이념은 "Write Once Run Anywhere"입니다. 이 이념에는 운영체제에 대해서 종속적이지 않아. 프로그래머가 코드를 한번만 작성하면 플랫폼에 관계없이 동작할 수 있게 만들겠다는 의미가 담겨있습니다. 그래서 Java에서는 운영체제별 JRE와 가상머신인 JVM을 가지고 있습니다. 운영체제별 JRE로 JVM용 바이트 코드를 생성하면 JVM 머신에서 해당 바이트 코드가 작동되게 됩니다. 이를 통해 운영 체제에 종속적이지 않은 코드를 만들 수 있게 도와줍니다.
참고 가능 자료: https://intellectum.tistory.com/81
2. 오버로딩과 오버라이딩에 관해서 설명해주세요.
오버로딩은 동일한 이름을 가진 메서드의 타입이나 파라미터를 다르게 작성할 수 있게 해주는 것입니다. 반대로 오버라이딩은 상속을 통해 부모의 메서드를 재정의하는 것을 말합니다. 오버라이딩의 경우, 인터페이스 메서드 상속이냐 구체 클래스의 메서드 상속이냐에 따라 정의할 수도 그대로 사용할 수도 있습니다.
3. 객체지향에 관해서 설명해주세요.
객체지향은 보통 절차지향과 함께 비교가 됩니다. 데이터 중심의 확장을 하는 절차지향은 사람이 보통 인식하는 것과 동일하여 초기 코드를 작성하기가 쉽지만 프로젝트가 커짐에 따라, 해당 데이터에 의존이 커지게 되고 수정의 어려움이라는 문제를 겪습니다.
하지만 객체지향은 특정한 객체가 본인만의 데이터 처리 역할을 가지고 외부에서는 메시지로 해당 객체에게 요청하는 방식으로 데이터를 처리합니다 이를 통해 얻을 수 있는 건 객체의 구체적인 방법에 관해 다른 객체는 알 수 없고 단지 메시지를 통해서 요청을 전달하고 응답결과를 받는다는 것입니다. 객체지향의 이러한 특성은 프로젝트가 커졌을 때, 유연한 설계를 할 수 있도록 해줍니다.
※ SOLID 원칙에 관해서 설명해주세요.
SOLID는 객체지향을 더 잘 쓰기 위한 법칙이라 생각합니다. 객체지향에서 제공하는 캡슐화, 상속, 추상, 다형을 잘 사용하기 위한 방법이기도 합니다.
S는 단일 책임 원칙으로 역할 분리에 관한 내용입니다. O는 폐쇄-개방 원칙으로 변경에는 닫혀있고 확장에는 닫혀있다는 것을 의미합니다. L은 리스코프-치환 원칙으로 상속을 받을 때에 있어 부모 클래스가 설정해놓은 규칙을 어기지 말라는 것을 의미합니다. I는 인터페이스 분리 원칙으로, 인터페이스 내부의 역할을 작게 분리하여 가져가라는 것을 의미합니다. D는 의존 역전 원칙으로 고수준의 모듈이 저수준의 모듈에 의존하면 안된다는 것을 의미합니다.
SOLID 원칙에 관해 자세히 알고 싶다면?: https://intellectum.tistory.com/230
4. 인터페이스와 추상 클래스의 차이는 무엇인가요?
추상클래스와 인터페이스의 차이를 한 마디로 요약하자면, 내부의 모든 메서드가 추상화가 되어있냐, 일부가 추상화가 되어있냐라고 말씀드리고 싶습니다. 추상 클래스의 경우는 일부가 추상화된 경우로 abstract 키워드를 통해서 클래스에 표현을 합니다. 예시로는 템플릿 메서드 패턴 같은 디자인 패턴으로 로깅 시스템을 만드는 상황을 들고 싶습니다. 공통 로직이 될 부분을 미리 작성해놓고, 그 사이에 들어갈 메서드를 추상화해서 미리 만들어놓으면, 해당 클래스를 상속 받았을 때, 추상화된 메서드만 오버라이딩으로 처리해주면 문제를 해결이 가능합니다. 인터페이스는 모든 게 추상화가 되어있습니다. 보통 쿠폰 정책 같은 걸 선택해야 할 때, 전략 패턴 같은 디자인 패턴에 적절하게 사용할 수 있으며, 모든 메서드가 추상화가 되어있기 때문에 반드시 오버라이딩해야합니다. 그런데 문제는 인터페이스의 경우 상속 받은 클래스가 커질 수록 변경이 어렵기 때문에, 최대한 작게 만들어야 합니다.
답변이 부족하지만, 과거에 직접적으로 작성했던 것과 해당 이해에 도움이 됐던 강의를 남기고자 한다.
Extends와 Implements 삽질 일기: https://intellectum.tistory.com/177
강의 추천: 스프링 핵심 원리 by 김영한(인프런)
5. JVM에 관해서 설명해주세요.
JVM의 큰 역할에는 두 가지가 있다고 생각을 합니다. 첫 번쨰는 운영체제에 비종속적인 개발 환경을 만들 수 있게 해줍니다. 자바로 개발자가 만든 코드는 JRE에 있는 자바 컴파일러에 의해서 바이트 코드로 변환이 됩니다. 그 코드는 JVM 내에 있는 JIT 컴파일러에 의해서 기계어로 번역돼 실행됩니다. JRE는 운영체제에 종속적이지만, JVM은 그렇지 않습니다. 그렇기 때문에 "Write Once Run Anywhere"이라는 자바의 철학을 구현할 수 있습니다. 두 번째는 GC(Garbage Collection)입니다. JVM 내에서 GC는 자동으로 할당된 메모리가 더이상 참조되지 않을 때, 메모리를 해제하는 역할을 해줍니다. 이를 통해, C언어에서 신경 써야할 Use after free, Double free, Memory leak과 같은 현상에 크게 신경 쓰지 않아도 되게 해줍니다.
※ 그러면 자바를 쓰면 메모리 문제는 일어나지 않겠네요?
아닙니다. 자바를 쓰더라도 메모리 문제는 일어납니다. GC 알고리즘에 관해서는 정확하게 모르지만 과거 별도로 클래스를 만들기 귀찮아서 내부 클래스로 구현한 적이 있는데, static 키워드가 없다는 오류 메시지가 뜬 적이 있었습니다. 이는 내부 인스턴스 클래스를 만들 때, 외부 클래스를 초기화한 뒤 내부 클래스를 초기화하는 과정에서 내부 클래스와 외부 클래스가 서로 참조하기 때문에, GC의 대상이 되지 않아 Memory Leak이 일어날 수 있음을 의미하기 때문이라 들었습니다.
6. 기본형 클래스와 래퍼 클래스에 관해서 설명해주세요.
기본형 클래스는 고정된 데이터 비트를 가진 데이터를 저장하는 타입으로 예시로 byte, boolean, char, float 같은 값이 있습니다. 이런 타입은 타입 캐스팅에 대해 자유롭지 못하고 내장된 함수가 없어서 사용성이 불편합니다. 그렇기 때문에, 이를 한 번 감싸서 사용성을 높인 클래스들이 있습니다. 예를 들면 Integer 같은 타입이 있습니다. Collection이나 null 허용, Generic 사용성 등을 고려해서 보통은 래퍼 클래스로 코딩을 하는 경우가 더 많습니다.
7. 제네릭에 관해서 설명해주세요.
제네릭은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미합니다.
'단순답변정리' 카테고리의 다른 글
CS 면접 준비 - 네트워크(지속 업데이트 예정) (0) | 2024.06.06 |
---|---|
CS 면접 준비 - 운영체제(지속 업데이트 예정) (0) | 2024.06.05 |
CS 면접 준비 - 알고리즘(지속 업데이트 예정) (0) | 2024.05.29 |