CS - Java

jm·2022년 12월 21일
1

Java

목록 보기
1/2

Q. Java란 무엇인가?

객체지향적 프로그래밍 언어입니다.

Q. 자바의 특징은?

JVM에서 동작 되므로 플랫폼(OS)에 독립적입니다. 객체지향적 프로그래밍 언어이고, GC를 지원해서 메모리 관리가 쉽습니다.


Q. 객체지향이란?

우선 객체란 주체가 아닌 주체가 활용하는 것을 말합니다.
이는 주변에 존재하는 모든 것들이 해당됩니다. 상태가 될수도 있고, 행위가 될수도 있습니다.
객체지향 프로그래밍이란 상태와 행위로 이뤄진 객체들간의 상호작용을 통해 프로그램을 설계하고 개발하는 것입니다.


Q. Java 접근제한자 설명

자바 접근제한자는 클래스, 메소드, 변수 등의 접근을 제한하는 지시어를 말합니다.
접근 제한자를 사용하여 외부객체의 접근(부적절한 접근)을 제어하여 내부 데이터를 보호할 수 있습니다.

public - 모든 패키지, 클래스 접근 허용
protected - 같은 패키지의 모든 클래스 접근 허용(단, 다른패키지 자식클래스의 접근은 허용한다)
default(package) - 같은 패키지의 클래스만 허용한다.
private - 같은 클래스에서만 접근을 허용한다.


Q. Final 이란?

변수나 메소드, 클래스에 사용되며 변경을 제한하게 만드는 키워드 입니다.
final로 선언하면 반드시 초기화를 해야 하며 도중 값 수정이 불가능합니다.
변수에서는 값이 수정되지 않도록 제한하며
메소드에서는 상속받은 클래스의 메소드를 수정하지 못하게 제한합니다.(Override 제한)
클래스에서는 이미 완벽한 클래스이기 때문에 다른 클래스에서 재정의를 하지 못하게 제한하여 상속 불가능한 확장 불가능 클래스로 만듭니다. 예로 Object 클래스가 있습니다.


Q. 인터페이스와 추상클래스의 차이는?

추상 클래스는 클래스이기 때문에 하나만 상속할 수 있고, 하위 클래스에게 구현을 강제하는 메소드를 가진 클래스 입니다. 하위 클래스의 공통으로 사용되는 메서드를 상위 클래스에서 구현부 없이 선언부만 만든 것을 의미합니다. abstract 키워드를 통해 하위 클래스에게 공통 메소드 구현을 강제합니다. 상속 강요

인터페이스는 구현객체가 같은 동작을 한다는 것을 보장하기 위해 사용됩니다. 다중상속이 가능하고 자식 클래스에 모든 메서드의 구현을 강제합니다.


Q. 오버라이딩과 오버로딩의 차이는?

오버로딩이란 같은 클래스내에서 매개변수의 타입, 개수가 다른 동일한 이름의 메소드를 여러개 생성할 수 있는 것을 말합니다. 코드가 간결해져서 가독성이 좋아집니다.

오버라이딩이란 하위 클래스에서 상위 클래스의 메소드를 적절하게 재정의하는 것을 말합니다. 오버라이딩을 통해 코드의 중복을 줄이고, 기능을 확장할 수 있습니다.

오버라이딩 오버로딩은 하나의 이름으로 여러 역할을 할 수 있도록 해주기 때문에 객체지향언어의 특징인 다형성을 가지게 됩니다.


Q. Generic이란?

데이터 타입을 일반화해서 다양한 타입의 객체를 다룰 수 있게 해줍니다. 미리 사용할 타입을 명시해서 컴파일 시 타입을 체크해주기 때문에 객체 타입에 대한 안정성이 향상되고 형 변환의 번거룸을 줄여줍니다.


Q. static 이란?

정적 멤버(클래스 멤버)를 만들 수 있게 해주는 키워드 입니다.
정적 멤버는 클래스에 고정되어 클래스를 메모리 영역에 적재할 때 자동적으로 생성되기 때문에 객체 생성없이 사용할 수 있습니다.
따라서 유틸리티 클래스나 변하지 않고 자주 사용하는 변수를 정의해서 사용합니다.
하지만 메모리영역에 올리기 때문에 GC의 관리를 받을 수 없어 프로그램이 종료 될 때까지 유지됩니다. 이로인해 메모리 낭비가 생겨서 남용하면 안됩니다.

  • 유틸리티 클래스 : 데이터 처리를 위한 정적메서드만 있는 클래스를 의미함. ex) Math 클래스, 상수 외의 인스턴스 변수가 하나도 없음
  • Java main이 static인 이유 : 처음 메모리가 초기화 된 상태일 때 객체는 하나도 존재하지 않기 때문에 객체 존재 여부 상관없이 사용하기 위해서입니다.

Q. JVM의 구조와 동작 과정 설명

JVM이란 자바 가상머신의 약자로 자바 어플리케이션을 운영체제에 맞게 실행시켜 주는
역할
을 합니다. 그래서 Java가 OS 종류에 상관없이 독립적으로 실행가능하게 해줍니다. 또한 메모리를 관리해주는 GC를 제공합니다.
+ 가상 머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것

JVM의 구조는 크게 ClassLoader, Exection Engine, Runtime Data Area, GC로 이루어져 있습니다.

JVM 구조개념
ClassLoader컴파일 된 .class 파일(클래스)이 생성되면 이 파일들을 Runtime Data Area라는 JVM이 운영체제로 부터 할당 받은 메모리 영역에 적재하는 역할
Exection Engine(실행 엔진)Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행 해주고 운영체제에 맞게 해석해주는 역할 인터프리터 방식과 JIT 방식을 사용한다.
Runtime Data AreaJVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역임. Method Area, Heap, PC Registers, Java Statcks, Native Method Stacks 영역으로 나뉜다. ※ Java는 멀티 스레드 환경으로 모든 스레드는 Heap, Method Area를 공유한다.
Garbage Collection가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리(힙 영역)를 지속적으로 찾아내서 제거하는 역할을 함.

Java의 실행방식

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로하는 메모리를 할당받음.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킵니다.
  3. Class Loader를 통해 class 파일들을 JVM으로 로딩합니다.
  4. 로딩된 class파일들은 Execution engine을 통해 해석됩니다.
  5. 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어집니다.

Q. Garbage Collector 설명 및 동장과정 설명

GC는 힙 영역에서 사용하지 않는 객체들을 제거하는 작업을 총칭합니다. 자바는 개발자가 직접 메모리 관리를 할 수 없기 때문에 GC를 사용합니다.

객체는, 힙영역에 저장되고, 스택 영역에 이를 가르키는 주소값이 저장되는데,
힙영역에서 자신을 가르키는 주소값이 없으면, 참조되고 있지 않는다고 판단합니다.
GC가 동작을 하면, GC Root부터 객체를 찾고, 그 객체가 참조하는 객체를 찾아 mark 합니다.
Mark되지 않은 객체는 접근할 수 없다고 판단하여 제거합니다.

GC 동작 과정
1. 객체가 생성되면 메모리를 young영역(Minor)에 저장합니다.
2. 객체를 최초 생성하면 Young 영역에 Eden 영역에 위치합니다.
3. Eden 영역이 가득 차서 Minor GC가 발생하면, 남아있는 객체를 mark하고 참조 중인 객체는 Survivor 영역으로 이동합니다.
4. Survivor 영역에서도 Minor GC가 발생하면, 참조 중인 객체는 다른 Survivor 영역으로 이동하고 1번 Survivor 영역은 비게됩니다.
5. 위 과정을 반복하고 Young 영역에서 오래 살아남은 객체는 Old영역으로 이동하게 됩니다.
6. Old영역이 가득 차서 Major GC가 발생했을 때, 위와 반대로 삭제되어야 할 객체를 mark하고 지웁니다. 참조 여부에 따라 유지되거나 제거됩니다.


Q. 정적 타입 언어와 동적 타입 언어의 차이

타입의 결정을 컴파일할 때 결정하면 정적 타입(Java,c,c++)언어이고, 런타임 과정에서 결정하동적 타입(python,js)언어 입니다.

정적타입 언어의 장단점 : 컴파일 시 타입을 결정하기 때문에 실행속도가 빠르고 안정성이 높다. 하지만 매번 코드 작성시 변수를 지정해줘야 한다.

동적타입 언어의 장단점: 런타임까지 타입을 결정하지 않아도 되기 때문에 유연성이 높고, 코드 작성을 빠르게 할 수 있습니다.
하지만 예상 못한 타입때문에 타입에러가 발생할 수 있고, 타입 에러는 런타임시에만 확인 가능해서 에러 찾기가 힘듭니다.


Q. 원시 타입(primitive type)과 참조 타입(reference type)의 차이

원시 타입은 기본데이터 타입으로 Java에서는 8개만 존재하는 타입입니다. byte(1), short(2), int(4), long(8), float(4), double,(8) char(2), boolean(1)가 있습니다.

  • 정수형 4, 실수형 2, 문자형 1, 논리형 1

참조 타입원시타입을 제외한 모든 데이터 타입을 말합니다.
클래스, 배열, 인터페이스 등이 있고, 저장된 곳의 주소를 가지고 있습니다.

차이점 : 원시타입은 실제 데이터값을 저장하고 작은 크기에 고정적이여서 Stack 영역에 저장됩니다. 초기화 될 때 기본값을 가지고 있습니다.
참조타입은 데이터 크기가 동적이기 때문에 동적으로 관리되는 Heap영역에 저장됩니다. 또한 더이상 참조하는 곳이 없을 때 GC에 의해 제거됩니다.


Q. try catch와 throw exception 차이

try-catch예외발생 부분을 try 블록에서 하고 예외 발생시 catch 블록에서 처리합니다.
throw exception은 특정 예외가 발생시, 특정 예외를 상위 클래스에서 공통적으로 예외 처리 하기 위해 사용됩니다.

catch 블럭에 exception을 선언하면 어떤 에러든 해당 catch 블록에서 처리될 수 있습니다.


Q. 객체지향 5원칙(SOLID) 설명

solid개념
SRP(단일 책임 원칙)한 클래스는 하나의 책임만을 가져야 한다.
OCP(개방 폐쇄 원칙)확장에는 열려있으나 변경에는 닫혀야 한다.
LSP(리스코프 치환 원칙)프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.(부모 클래스가 자식클래스타입으로 사용 가능)
ISP(인터페이스 분리 원칙)클라이언트는 자신이 사용하지 않는 인터페이스와 의존관계를 맺으며 안된다. 즉 하나의 범용 인터이스보다 작고 구체적인 인터페이스 여러개를 사용해야 한다
DIP(의존관계 역전 원칙)자신보다 구체적인 구현체에 의존하지 않고 변하기 쉬운 것에 의존하면 안된다. 의존성주입은 DIP를 따르는 방법 중 하나.


Q. 직렬화와 역직렬화 설명

안녕

Q. 절차지향, 객체지향, 함수형 프로그래밍 차이

안녕

Q. java ThreadLocal 이란
안녕

Q. 스크립터 언어와 컴파일 언어의 차이

스크립트 : 인터프리터가 한 라인 씩 기계어로 번역해서 실행하는 경우. 문법오류르 사전에 찾지 못해서 주의해야함.

컴파일 : 실행전 컴파일러가 컴파일하여 기계어로 변환 후 실행하는 경우. 이미 기계어로 번역된 상태로 실행되기 때문에 빠르다. 사전 검증이 가능하다. OS에 따라 다르게 작업해야 한다.(Java는 JVM 덕에 동일한 코드 사용 가능)


Q. Java 8 특징

안녕

+ toggle이 안되서 아쉽다..


참조
https://thalals.tistory.com/314
https://github.com/ksundong/backend-interview-question
https://github.com/gyoogle/tech-interview-for-developer
https://tcpschool.com/

profile
ㅎㅎ

0개의 댓글

관련 채용 정보