CS/Java (CS)

[Java] 자바 개념 정리

ummchicken 2023. 1. 19. 11:43

내가 보려고 정리 중

 

 

출처 맨 밑에 적어놨지만 혹시 몰라 위에도 적어 놓음.

주로 참고한 블로그 1, 블로그 2

 

 

 

[Java]

Java의 특징을 설명해라

- Java는 객체지향 프로그래밍 언어이다.

- 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 
객체지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어이다.

- 장점
- JVM(자바가상머신) 위에서 동작하기 때문에 운영체제에 독립적이다.
- GarbageCollector를 통한 자동적인 메모리 관리가 가능하다.

- 단점
- JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리다.
- 다중 상속이나 타입에 엄격하며, 제약이 많다.

 


객체지향이란?

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

 

- 특징으로는 캡슐화, 상속, 다형성, 추상하 등이 있고, 

모듈 재사용으로 확장 및 유지보수가 용이하다.

 


객체지향 프로그래밍의 장점

- 코드 재사용 용이 : 남이 만든 클래스를 가져와서 사용 가능

 

- 유지 보수가 쉬움 : 절차지향 프로그래밍은 일일이 찾아 수정해야 하는 반면, 

해당하는 부분만 수정하면 됨

 

- 대형 프로젝트에 적합 : 클래스 단위로 모듈화 시켜서 개발 가능

 


객체지향 설계의 원칙 (SOLID)

- SRP (Single Responsibility Principle) : 단일 책임 원칙.

한 클래스는 하나의 책임만 가져야 한다.

 

- OCP (Open-Closed Principle) : 개방-폐쇄 원칙.

확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다.

 

- LSP (Liskov Substitution Principle) : 리스코프 치환 원칙.

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

즉, 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.

 

- ISP (Interface Segregation Principle) : 인터페이스 분리 원칙

인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.

 

- DIP (Dependency Inversion Principle) : 의존관계 역전 원칙.

구체적인 것이 추상화 된 것에 의존해야 한다. 즉, 자주 변경되는 구체 클래스에 의존하지 마라.

즉, 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 

변하지 않을 가능성이 높은 클래스와 관계를 맺어라.

DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다.

 


 객체지향 프로그래밍 키워드

- 추상화 : 불필요한 정보는 숨기고, 중요한 정보만을 표현함으로써 

공통의 속성이나 기능을 묶어 이름을 붙이는 것

 

- 캡슐화 : 기능과 특성의 모음을 "클래스"라는 "캡슐"에 넣어서 분류해서 넣음

 

- 상속 : 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고, 

기능의 일부분을 변경해야 할 경우, 상속받은 자식클래스에서 해당 기능만 

다시 수정(정의)하여 사용할 수 있게 한다. 다중 상속은 불가하다.

 

- 다형성 : 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다는 것.

즉, 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 것이다.

※ 오버라이딩 : 상위 클래스에 있는 메소드를 하위 클래스에서 재정의 하는 것.
※ 오버로딩 : 매개변수의 개수나 타입을 다르게 하여, 같은 이름의 메소드를 여러개 정의.

 


제네릭이 무엇인가?

- 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌, 

외부에서 사용자에 의해 지정되는 것을 의미한다.

 


컬렉션 클래스에서 제네릭을 사용하는 이유는?

- 컬렉션 클래스에 저장되는 인스턴스 타입을 제한하여 

런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 타임에 잡아낼 수 있어 사용.

 


데드락이 무엇이고, 해결방법은?

- 둘 이상의 스레드가 lock을 획득하기 위해 기다리는데, 이 lock을 잡고 있는 스레드도

똑같이 다른 lock을 기다리면서 서로 블락상태에 놓이는 것.

 

- 우선 순위를 선정해 자원을 선점하도록 하는 것과, 

공유 불가능한 상호 배제 조건을 제거하는 것이 있다.

 


JVM이 하는 역할이 무엇인가?

- 자바 컴파일러가 .java 파일을 컴파일 하면, .class라는 자바 바이트 코드로 변환시킨다.

이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행을 못하는데, 

이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM이다.

 

- 컴파일 → 바이트 코드 → 기계어 이런식으로 중간에 바이트 코드 과정이 있기 때문에 

속도와 메모리에서 단점이 될 수 있다.

 

- JVM은 스택 기반으로 동작하며, Java Byte Code를 OS에 맞게 해석해주는 역할을 하고, 

가비지컬렉션을 통해 자동적인 메모리 관리를 한다.

 

- JVM을 사용하면 운영체제에 상관없이 같은 코드를 사용할 수 있다.

 


가비지 컬렉션 (Garbage Collection)에 대해 설명해라

- 가비지 컬렉션은 JVM의 메모리 관리 기법 중 하나로, 

시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요 없어진 메모리 영역을 

회수하여 메모리를 관리해주는 기법이다.

 


가비지 컬렉션 과정에 대해 설명해라

- GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고, 

GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후(Stop The World 과정)

사용하지 않는 메모리를 제거(Mark and Sweep 과정)하고 작업이 재개된다.

 


Java의 컴파일 과정에 대해 설명해라

  1. 개발자가 .java 파일을 생성한다.
  2. build를 한다.
  3. java compiler의 javac의 명령어를 통해 바이트코드(.class)를 생성한다.
  4. Class Loader를 통해 JVM 메모리 내로 로드한다.
  5. 실행 엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다. (각 운영체제에 맞는 기계어)

 


 

싱글톤 패턴이란?

- 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴이다.

- 즉, 생성자의 호출이 반복적으로 이루어져도 실제로 생성되는 객체는 

최초 생성된 객체를 반환해주는 것이다.

 

- 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와

- 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용한다. (메모리 낭비 방지)

 


싱글톤 패턴의 대표적인 예시

- 싱글톤 패턴의 대표적인 예시는 Spring Bean이다.

 

- 스프링의 빈 등록 방식은 기본적으로 싱글톤 스코프이고,

스프링 컨테이너는 모든 빈들을 싱글톤으로 관리한다.

 


자바의 메모리 영역에 대해 설명해라

- 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 

데이터 타입에 따라 할당된다.

 

- 메소드(Method) 영역 : 전역변수와 static변수를 저장하며, 

Method 영역은 프로그램의 시작부터 종료까지 메모리에 남아있다.

 

- 스택(Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 

메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.

LIFO(Last In First Out) 구조를 갖고, 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.

 

- 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 

가비지 컬렉션에 의해 메모리가 관리되어진다.

 


각 메모리 영역이 할당되는 시점

- Method 영역 : JVM이 동작해서 클래스가 로딩될 때 생성

 

- Stack 영역 : 컴파일 타임 시 할당

 

- Heap 영역 : 런타임 시 할당

 

※ 컴파일 타임 : 소스코드가 기계어로 변환되어 실행가능한 프로그램이 되는 과정 

※ 런타임 : 컴파일 타임 이후 프로그램이 실행되는 때

 


Synchronized에 대해

- 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때,

현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 

데이터에 접근할 수 없게 막는 개념이다.

 

- 데이터의 thread-safe를 하기 위해 자바에서 Synchronized 키워드를 제공해 

멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장한다.

 

- Synchronized는 변수와 메소드에 사용해서 동기화 할 수 있으며, 

Synchronized 키워드를 남발하게 되면 오히려 프로그램의 성능 저하를 일으킬 수 있다.

 


String, StringBuffer, StringBuilder의 차이

- String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가진다.

 

- StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용하며,

 

- StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용한다.

 

 

 


출처