View

1. 객체 지향 프로그래밍이란?

데이터를 추상화시켜서 상태와 행위를 가진 객체로 만들고, 그 객체 간의 상호 작용을 통해 로직을 구성하는 프로그래밍 방법

1️⃣ 추상화 : 공통의 속성이나 기능을 묶어서 표현
2️⃣ 캡슐화 
3️⃣ 상속
4️⃣ 다형성 : 동일 요청에 대해 서로 다른 방식으로 응답 (오버라이딩, 오버로딩)

✔️ 장점
- 코드 재사용 용이
- 유지보수가 쉬움 (절차 지향 프로그래밍은 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍은 해당하는 부분만 수정하면 됨)
- 대형 프로젝트에 적합 (클래스 단위로 모듈화 시켜서 개발 가능)

 

2. 자바의 특징에 대해 설명해주세요.

- 운영체제에 독립적이다.
- 객체지향언어이다.
- 자동 메모리 관리 (가비지 컬렉터)
- 멀티쓰레드를 지원한다.

단점 
- 비교적 속도가 느리다 ( jvm에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문)

 

3. 가비지 컬렉션이란?

사용하지 않는 객체를 메모리에서 삭제하는 작업을 Garbage Collection이라 부르며 JVM에서 GC를 수행한다.

 

4. JVM이란?

자바 컴파일러가 .java 파일을 컴파일하면 .class라는 자바 바이트코드로 변환시켜준다. 이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행을 못하는데 이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM이다.

 

5. static 키워드에 대해 설명해주세요.

변수에 static을 적용하면 같은 클래스 타입의 객체들이 공유할 수 있는 클래스 변수가 된다.

static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있다. 즉, 인스턴스(객체) 생성없이 바로 사용 가능하다.

 

6. 오버로딩과 오버라이딩에 대해 설명해주세요.

✔️ 오버로딩 : 같은 이름의 함수를 여러개 정의하고 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것
✔️ 오버라이딩 : 부모클래스의 메서드와 같은 이름,  매개변수를 재정의하는 것

 

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

자바의 메모리 공간은 크게 메소드/스택/힙 영역으로 구분되고, 데이터 타입에 따라 할당된다.
✔️ 메소드 영역 : 전역변수와 static 변수를 저장하며, 메소드 영역은 프로그램의 시작부터 종료까지 메모리에 남아있다.
✔️ 스택 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호툴될 때 메모리에 할당되고 종료되면 메모리가 해제된다. LIFO 구조를 가지고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
✔️ 힙 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 힙 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어진다.

 

8. String과 StringBuffer의 차이에 대해 설명해주세요.

✔️ String
- 메모리 영역에 생성되면 변경이 불가능하다.
- 문자열이 변경되면, 기존 객체는 남아있고 새로운 인스턴스가 생성된다.
- 잦은 문자열 변경은 성능 저하를 불러와서, 변경이 적은 경우에 주로 사용한다.
- 멀티 스레드 환경에서 동기화가 가능하다.
✔️ StringBuffer / StringBuilder
- String과 달리 가변적으로 사용할 수 있다.
- 문자열 변경이 발생하면, 기존의 버퍼 크기를 늘린다.
- 잦은 문자열 변경에 유효하다.
- StringBuffer는 멀티 스레드 환경에서 동기화를 지원하지만, StringBuilder에 비해 성능이 떨어진다.

String : 문자열 변경이 적은 경우
StringBuffer : 문자열 변경이 잦은 멀티 스레드 환경
StringBuilder : 문자열 변경이 잦은 싱글 스레드 환경

 

9. 컴파일 에러와 런타임 에러를 비교하여 설명해주세요.

✔️ 컴파일 에러는 컴파일 시 발생하는 에러로 구문 오류로 프로그램을 컴파일 할 수 없다는 뜻이다. 대체로 문법상의 오류로 발생하며 에러가 발생한 부분을 개발자에게 알려준다.
- 구문 에러 (ex. ';' 누락, 괄호가 안맞음)
✔️ 런타임 에러는 프로그램 실행 시 발생하는 에러로 프로그램이 컴파일 된 후 실행하면서 에러가 발생한다. 대체로 개발 시 설계 미숙으로 발생하는 에러이며, 에러 발생 시 개발자가 역추적하여 원인을 확인해야 한다.
- Nullpointer
- 0으로 나눈 경우
- 무한루프 등

 

10. error와 exception의 차이에 대해 설명해주세요.

✔️ Error는 실행 중 일어날 수 있는 치명적 오류를 말한다. 컴파일 시 문법적인 오류와 런타임 시 널포인트 참조와 같은 오류로 프로세스에 심각한 문제를 야기 시켜 프로세스를 종료 시킬 수 있다. (메모리 부족, 스택오버플로우 등)
✔️ Exception는 개발자가 작성한 코드로 발생한다. 컴파일 및 런타임에 발생하는 경우이다. 개발자가 에러를 처리할 수 있고 예외 처리를 통해서 문제가 발생하더라도 어플리케이션이 종료되지 않고 프로그램이 정상 동작할 수 있게 처리가 가능하다.

➡️ Error의 상황을 미리 미연에 방지하기 위해서 Exception 상황을 만들 수 있으며, java에서는 try-catch문으로 Exception handling을 할 수 있다.

 

11. 자바 코드의 실행 과정을 설명해주세요.

1. 소스파일을 작성한다 (.java)
2. 빌드한다.
3. 자바 컴파일러를 통해 컴파일하여, 바이트파일(.class)을 생성한다.
4. 프로그램 실행에 필요한 클래스 파일들을 Class Loader을 통해 JVM에 올려 로드한다.
5. 지정된 클래스에서 main을 호출한다.
6. main 메서드의 첫 줄부터 코드가 실행되고 마지막 코드까지 실행되면 프로그램이 종료되고 사용된 자원들은 반환된다.

 

12. JRE와 JDK에 대해 설명해주세요.

✔️ JRE는 자바 실행 환경(Java Runtime Environment)의 약자로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 자바 가상 머신(JVM)이 포함되어 있다.
✔️ JDK는 자바 개발 키트(Java Development Kit)의 약자로 개발자들이 자바로 개발하는 데 사용된다. 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들이 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE도 함께 포함되어 있다.

- Java로 프로그램을 직접 개발하려면 JDK가 필요하고 Java로 만들어진 프로그램을 실행시키려면 JRE가 필요하다.

 

13. 자바에서 제공하는 functional interface API에 대해서 말씀해주세요.

Functional Interface는 일반적으로 구현해야 할 추상 메서드가 하나만 정의된 인터페이스 를 뜻한다.
// 기존 방법 : 익명 내부 클래스를 만들어 사용
FuncInterface funcInterface = new FuncInterface() {
    @Override
    public void test() {
    	System.out.println("test");
    }
};

// 자바 8 이후의 방법 : 람다표현식 이용
FuncInterface funcInterface1 = () -> System.out.println("test");

FuncInterface funcInterface2 = () -> {
	System.out.println("test");
    System.out.println("test2");
};​

함수를 일급 객체로 사용할 수 없는 자바 언어의 단점을 보완하기 위해 도입되었다.
덕분에 자바는 전보다 간결한 표현이 가능해졌고, 가독성이 높아졌다.

 

14. 자바 컬렉션 종류와 특징에 대해 설명해주세요.

컬렉션 프레임워크란, 다수의 데이터를 쉽고 배열의 단점을 보완해 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다. (java.uti 패키지 내)

1️⃣ List : 순서와 중복 허용 / 배열 크기 가변적 / 인덱스로 원소에 접근
2️⃣ Set : 순서 X 중복 X
3️⃣ Map : 순서X 중복 X / Key, Value 한 쌍으로 저장

 

15. 코드 리팩토링의 의미에 대해 설명해주세요.

결과의 변경없이 코드의 구조를 재조정함을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다.

 

16. 제네릭이 무엇인가요?

제네릭은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.

제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있다.

 

17. 자바 데이터타입에 대해 설명해주세요.

정수형 byte, short, int, long 실수형 float, double 문자형 char 논리형 boolean이 있고,
정수형 1, 2, 4, 8, 실수형 4, 8, 문자형 2, 논리형 1 바이트를 차지한다.

첨조 자료형에는 클래스,인터페이스,배열,enum등이 있다.

 

18. 인터페이스에 대해 설명해주세요.

인터페이스란 메서드의 선언만 있고 구현은 없는 추상적인 클래스의 일종으로 구현을 담당하는 클래스들 사이의 규칙을 정의하는데 사용된다. 인터페이스를 구현하는 클래스는 인터페이스에서 선언된 메서드들을 반드시 구현해야 하며, 이를 통해 다형성과 코드의 재사용성을 높일 수 있다.

 

19. 추상클래스에 대해 설명해주세요.

하나 이상의 추상 메서드를 포함하는 클래스이다. 추상메서드는 구현이 없는 메서드로 하위 클래스에서 반드시 구현되어야한다.

 

  • 인터페이스와 추상클래스를 설명해주시고, 차이를 비교해주세요.
추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말하고,
인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.

공통점
- new 연산자로 인스턴스 생성 불가능
- 사용하기 위해서는 하위 클래스에서 확장/구현 해야 한다.

차이점
-인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함에 있고,
- 추상클래스는 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용한다.
- 추상클래스는 다중상속이 불가능하지만, 인터페이스는 다중상속이 가능하다.

 

20. 프로세스와 스레드 차이에 대해 설명해주세요.

프로그램이 실행되면 메모리에 올라가며, 프로세스와 스레드에서 작업이 된다.
프로그램 > 프로세스 > 스레드 순으로 실행

✔️ 프로세스
- 컴퓨터에서 실행되고 있는 프로그램
- 운영체제로부터 시스템 자원을 할당받는 단위

✔️ 스레드
- 프로세스가 할당 받은 자원을 이용하여 실행 단위
- 하나의 프로세스에 여러 스레드가 존재하며 힙을 통해 공유

 

21. 싱글턴 패턴에 대해 설명해주세요.

어플리케이션이 시작될 때 한번만 메모리에 할당되고 인스턴스가 생성된다. 이후 어플리케이션 전체에서 하나의 인스턴스를 사용하는 디자인 패턴이다.

하나의 자원으로 전체에서 사용하므로 효율성이 올라간다. 반면, 사용성이 떨어지는 인스턴스는 메모리를 낭비할 수 있다.

인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와
동일한 인스턴스를 자주 생성해야하는 경우에 주로 사용한다. (메모리 낭비 방지)

✔️ 싱글톤 패턴의 대표적인 예시 : Spring Bean

 

22. 접근 제한자에 대해 설명해주세요.

변수 또는 메소드의 접근 ggㄴ범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미한다.
public - 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
(default) - 해당 패키지 내에서만 접근 가능
private - 해당 클래스에서만 접근 가능

 

23. 클래스 멤버 변수 초기화 순서에 대해 설명해주세요.

1. static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.
2. 필드 변수 선언부 : 객체가 생성될 때 생성자 block보다 앞서 초기화 된다.
3. 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking (thread-safe 영역)

 

24. Java 8의 특징에 대해 설명해주세요.

java에 함수형 프로그래밍이 처음 도입된 버전이며 새롭게 추가된 기능으로 Stream API, Lambda표현식, Method Reference,Default Method,Optional Class등이 있다.
  • Optional Class

java8에서 도입된 Wrapper 클래스로 값이 존재할 수도 있고 없을 수도 있는 상황을 명시적으로 처리할 수 있다. 이를 통해 Null point Exception문제를 해결할 수 있으며, 가독성 높은 코드를 작성할 수 있다. Optional 메서드를 사용하여 값의 존재 여부를 체크하고 값이 없는 경우에 대한 기본 처리를 할 수 있다.

public final class Optional<T> {
    ...
    /**
     * If non-null, the value; if null, indicates no value is present
     */
     private final T value;
    ...
}

Optional<String> optional = Optional.empty();

 

  • Stream API

자바에서 일련의 데이터 요소인 배열이나 컬렉션 등의 데이터를 처리하기 위한 api이다. Stream API의 특징은 멀티스레드를 활용해서 병렬로 연산을 수행할 수 있고, 내부 반복연산을 수행하기 때문에 코드가 매우 간단해진다.

List<String> list = Arrays.asList("apple", "banana", "cherry");
String[] array = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array));

 

  • Lambda Expression

Functional Interface를 구현하는 객체를 만들지 않고도 메서드로 전달할 수 있는 익명 함수를 하나의 식으로 표현할 수 있도록 단수화한 것이다. 즉, 특정 메소드 사용을 위해 일회용 객체를 만들지 않아도 되기 때문에 간단하게 작성 가능하고 가독성이 증가한다. 너무 남용하면 코드를 이해하는데 어려움이 생길 수 있고 디버깅이 어렵다는 단점이 있다.

public static void main(String []args) {
    MySum func = (a, b) -> a + b;
    System.out.println(func.sum(10, 11));
}
728x90

'Backend > Java' 카테고리의 다른 글

[Java] JWT 토큰을 이용해서 로그인 구현하기  (2) 2023.11.07
Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31