Language/Java

Java 정리

JUNGKEUNG 2024. 12. 8. 15:12
반응형

JAVA란?

JAVA는 네트워크상에서 쓸 수 있도록 미국의 선 마이크로 시스템즈가 개발한 객체 지향 프로그래밍 언어

 

 

JAVA의 특징

1. 자바가상머신(JVM)만 설치하면 컴퓨터의 운영체제에 상관업이 작동한다. ( 즉, 운영체제에 독립적)

2. 기본 자료형을 제외한 모든 요소들이 객체로 표현

3. 객체 지향 개념의 특징인 캡슐화, 상속 , 다형성이 잘 적용된 언어

4. Garbage Controll를 통한 자동적인 메모리 관리

5. 멀티쓰레드 (Multi-theard)를 지원

 

 

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

자바 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당된다.

 

  • 메소드(Method) 영역 : 전역변수와 static변수를 저장하며, Method영역은 프로그램의 시작부터 종료까지 메모리에 남는다.
  • 스택(stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출되 때 메모리에 할당되고 종료되면 메모리가 해제된다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
  • 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지컬렉션에 의해 메로리가 관리되어 진다.

 

 

각 메모리 영역이 할당되는 시점은 언제일까?

  • Method 영역 : JVM이 동작해서 클래스가 로딩될 때 생성
  • Stack 영역 : 메소드가 호출될 때 할당
  • Heap 영역 : 런타임시 할당

 

 

클래스와 객체에 대한 설명

  • 클래스는 객체를 만들어내기 위한 설계도 혹은 틀 이라고 할 수 있고, 객체를 생성하는데 사용된다. 
  • 객체는 설계도(클래스)를 기반으로 생성되며, 자신의 고유 이름과 상태, 행동을 갖는다.
  • 여기서 상태는 필드(fields), 행동은 메소드(Method)라고 표현한다.
  • 객체에 메모리가 할당되어 실제로 활용되는 실체는 '인스턴스'라고 불린다.

 

Java Stream은 무엇임 어떻게 사용될까?

  • Java 스트림은 순차적 및 병렬 집계 여난을 지원하는 요소의 시퀀스를 나타낸다.
  • Java8에서 도입된 스트림은 객체 컬력센을 처리하는 하무형 접근을 지원한다.
  • 스트림 파인프라인은 소스(컬렉션, 배열, 생성 함수, 또는 I/O 채널일 수 있음)로 시작하여 하나 이상의 중간 연산(스트림을 다른 스트림으로 변환하는 (fiter, map 등)과 종단 연산(forach, reduce, collect 등 결과나 부수 효과를 생성하는 연산)으로 구성되는데 쉽게 말해서 데이터를 추상화해서 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 방법을 제공한다.

 

 

JDK와 JRE의 차이점은 무엇일까?

JDK (Java Development Kit)는 Java 개발을 위해 필요한 도구들의 집합이다. 컴파일러, 디버거, 개발 도구 등을 포함

JRE (Java Runtime Environment)는 Java 애플리케이션을 실행하기 우한 런타임 환경이다.

JVM (Java Virtual Machine), 클래스 라이브러리, 실행환경 등을 포함하고 있다.

JDK는 JRE를 포함하고 이으므로, JDK는 개발자용으로 JRE를 포함한 모든 도구를 제공한다.

 

 

Java에서 == 와 .equals()의 차이점은 무엇일까?

1. ==는 참조 비교 연산자로, 두 참조가 같은 객체를 가리키는지 비교한다.

2. .equals()는 Object 클래스의 메소드로 , 두 객체 내의 값을 비교한다.

3. .equals() 메소드는 비즈니스 로직에 따라 어떤 클래스에서든 오버라이드될 수 이다.

 

 

.Equlas()는 두 객체가 동일한 hashCode()를 가지고 있는 경우 참이어야 한다? 

아니다. hashCode()는 객체의 해시 코드를 반환하는 메서드이고, equals()는 객체들 간의 동등성을 비교하는 메서드이다.

두 객체의 hashCode() 값이 동일하다고 해서 equals()가 항상 true를 반환하는 것은 아니다. 그러나 두 객체가 equals()로 비교해을 떄 true를 반환한다면, 두 객체의 hashCode90 값은 같아야한다. 

equals() 메서드를 재정의할 때 hashCode() 메서드도 함꼐 재정의해야 일관성을 유지할 수 있다.

 

 

메모리 노출이란 무엇이며 Java는 이를 어떻게 처리할까?

메모리 누수는 애플리케이션이 더 이상 사용하지 않는 객체가 가비지 컬렉터(GC)에 의해 메모리에서 제거될 수 없는 상태로 남아 있을 때 발생하는데 이는 여전히 참조되고 있기 떄문이다.

 

Java에서는 메모리 관리가 주로 GC에 의해 처리되며, GC는 더 이상 사용되지 않는 객체를 자동으로 할당 해제된다.

그러나 정적 참조, 리스너, 캐시된 객체를 통해 메모리 누수가 여전히 발생할 수 있으며 개발자는 누수를 피하기 위해 라이프사이클 관리와 참조에 대해 주의해야한다.

 

 

 

Java에서 transient 키워드의 목적은 무엇인가?

Java에서 transient 키워드는 특정 필드가 직렬화되어서는 안되는 값이 있을 때 사용된다. 예를 들어 비밀번호같이 직렬화 과정에서 빼고 싶은 데이터가 있을 떄 사용

 

객체가 직렬화될 떄, transient로 표시된 필드는 객체의 직렬화된 표현에서 제오하며 이는 보안상의 이유나 유지하거나 전송하는 것이 논리적이지 않은 필드를 제외할 떄 유용하다.

 

 

자바 직렬화 (Java serialzation)란 정확히 무어일까? 언제 직렬화가 필요한가?

  • 자바 직렬화는 객체를 바이트 스트림으로 변환하는 프로세스를 의미한다
  • 이렇게 직렬화된 객체는 파일이나 네트워크를 통해 전송하거나 저장할 수 있다. 직렬화를 통해 객체의 상태를 보존하고 복원 할 수 있으며, 객체 그래프를 유지하면서 데이터를 전송하거나 저장하는 데 사용된다.
  • 직렬화는 주로 분산 시스템, 영속성(깩체 저장) 등의 경우에 필요하다.

 

동적 프록시(dynamic proxies)란 무엇인가? 가능한 응용 분야는 무엇인가?

  • 동적 프록시는 런타임에 인터페이스의 구현체를 동적으로 생성하는 기술이다.
  • 동적 프록시를 사용하면 프록시 객체를 통해 객체에 대한 호출을 중간에 가로채고 처리할 수 있다.
  • 이를 통해 객체에 대한 추가적인 로직을 삽입하거나, 호출 전후에 작업을 수행할 수 있다.
  • 동적 프록시는 AOP(Aspect-Oriented Programming), 로깅, 프로잭션 관리 등 다양한 응용 분야에서 활용될 수 있다.

 

동적 프록시를 어떻게 사용할까?

  • 동적 프록시를 사용하려면 java.lang,reflect 패키지의 Proxy 클래스와 InvocationHeandler 인터페이스를 사용해야 한다. 
  • 먼저, InvocationHandler 인터페이스를 구현한 클래스를 작성하고, invoke() 메서드를 오버라이딩하여 호출 전후에 수행할 로직을 구현한다.
  • 그런 다음 Proxy.newProxyInstance()메서드를 사용하여 동적 프록시 객체를 생성한다.
  • 이 메서드에는 ClassLoader, 구현할 인터페이스 목록 및 InvocationHandler 인터페이스를 구현한 객체를 전달해야 한다.
  • 이렇게 생성된 동적 플록시 객체는 원하는 인터페이스를 구현하고, 호출되는 메서드에 대해 정의한 로직을 수행할 수 있다.
  • 동적 프록시 객체를 사용하여 원본 객체에 접근하고 메서드 호출을 중간에서 가로채어 원하는 직업을 수행할 수 있다.

 


 

OOP(객체지향 프로그래밍)

oop란?

Object-Oriened Programming의 약어로써 객체지향 프로그래밍을 의미

 

 

데이터를 객체로 취급하여 프로그램에 반영한 것이며, 순차적으로 프로그램이 동작하는 기존의 것들과는 다르게 객체와 객체의 상호작용을 통해 프로그램이 동작하는 것을 말한다.

 

OOP의 특징

1. 객체지향 프로그래밍은 코드의 재사용이 높다.

2. 코드의 변경이 용이

3. 직관적인 코드 분석

4. 개발속도 향상

5. 상속을 통한 장점 극대화


 

Object

object(객체)는 OOP에서 데이터(변수)와 그 데이터에 관련된 동작(함수), 즉 절차, 방법, 기능을 모두 포함한 개념

 

ex) 기차역에서 승차권을 발매하는 경우, 실체인 '손님'과 동작인 '승차권 주문'은 하나의 객체이며, 실체인 '역무원'과 동작인 '승차권 발매'도 하나의 객체이다. 같은 성질, 같은 구조와 형태를 가지는 객체는 등급으로 정의하고 등급에 속하는 객체는 그 등급의 인스턴스라고 한다.

 


Overloading vs Overriding

 

Overloading(오버로딩)

  • 같은 이름의 메소드를 여러개의 정의하는 것
  • 매개변수의 타입이 다르거나 개수가 달라야 한다.
  • return type과 접근 제어자는 영향을 주지 않는다

Overriding(오버라이딩)

  • 상속에서 나온 개념
  • 상위 클래스(부모 클래스)의 메소드를 하위 클래스(자식 클래스)에서 재정의

 

 

생성자(Constructor)에 대해 설명

생성자는 클래스와 같은 이름의 메소드로, 객체가 생성될 때 호출되는 메소드이다. 명시적으로 생성자를 만들지 않아도 default로 만들어지며, 생성자는 파라미터를 다르게하여 오버로딩할 수 있다.


 

Servlet, JSP

servlet - container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것( Html in Java)

JSP(Java Server Page) - html기반에 Java코드를 블록화항 삽입한 것 (Java in Html)

 

 

JDBC

Java Data Base Connection의 약자로 JAVA 언어를 통해 데이터 베이스에 접근할 수 있는 프로그래밍을 의미

 


 

Get과 Post 방식

Get 방식

  • 클라이언트에서 서버로 데이터를 전달할 때, 주소 뒤에 "이름"과 "값"이 결합된 스트링 형태로 전달
  • 주소창에 쿼리 스트링이 그대로 보이기 때문에 보안성이 떨어진다.
  • 길이에 제한이 있다.( = 전송 데이터의 한계가 있다)
  • Post방식보다 상대적으로 전송 속도가 빠르다

 

Post방식

  • 일정 크기 이상의 데이터를 보내야 할 때 사용한다.
  • 서버로 보내기 전에 인코딩하고, 전송 후 서버에서는 다시 디코딩 작업을 한다.
  • 주소창에 전송하는 데이터의 정보가 노출되지 않아 Get방식에 비해 보안성이 높다.
  • 속도가 Get방식보다 느리다.
  • 쿼리스트링(문자열) 데이터뿐만 아니라, 라디오 버튼, 텍스트 박스 같은 객체들의 값도 전송 가능

 

Get과 Post 차이점

  • Get은 주로 웹 브라우저가 웹 서버에 데이터를 요청할 때 사용
  • Post는 웹 브라우저가 웹 서버에 데이터를 전달하기 위해 사용
  • Get을 사용하면 웹 브라우저에서 웹 서버로 전달되는 데이터가 인코딩되어 URL이 붙는다.
  • Post방식은 전달되는 데이터가 보이지 않는다
  • Ge 방식은 전달되는 데이터가 255개의 문자를 초과하면 문제가 발생할 수 있다.
  • 웹서버에 많은 데이터를 전달하기 위해서는 Post방식을 사용하는 것이 바람직하다.

 

Session과 Cookie

Session과 Cookie 사용 이유

- 우리가 인터넷에서 사용하고 있는 HTTP프로토콜을 연결 지향적인 성격을 버렸기 때문에 새로운 페이지를 요청할 때마다 새로운 접속이 이루어지며 이전 페이지와 현재 페이지 간의 관계가 지속되지 않는다. 이에 따라 HTTP프로토콜을 이용하게 도는 웹사이트에서는 웹페이지에 특정 방문자가 머무르고 있는 동안에 그 방문자의 상태를 지속시키기 위해 쿠키와 세션을 사용한다,

 


Session

  • 특정 웹사이트에서 사용자가 머무르는 기간 또는 한 명의 사용자의 한 번의 방문을 의미한다.
  • Session에 관련된 데이터는 Server에 저장된다.
  • 웹 브라우저의 캐시에 저장되어 브라우저가 닫히거나 서버에서 삭제 시 사라진다.
  • Cookie에 비해 보안성이 좋다.

Cookie

  • 사용자 정보를 유지할 수 없다는 HTTP의 한계를 극복할 수 있는 방법
  • 인터넷 웹 사이트의 방문 기록을 남긴 사용자와 웹 사이트 사이를 매개해 주는 정보이다.
  • Cookie는 인터넷 사용자가 특정 웹서버에 접속할 때, 생성되는 개인 아이디와 비밀번호, 방문한 사이트의 정보를 담은 임시 파일로써, Server가 아닌 Client에 텍스트 파일로 저장되어 다음에 해당 웹서버를 찾을 경우 웹서버에서는 그가 누구인지 어떤 정보를 주로 찾았는지 등을 파악할 때 사용 된다.
  • Cookie는 Client PC에 저장되는 정보기 때문에, 다른 사용자에 의해서 임의로 변경이 가능하다. (정보 유출 가능, Session보다 보안성이 낮은 이유)
Q. 보안성이 낮은 Cookie 대신 Session을 사용하면 되는데 안 하는 이유?
A. 모든 정보를 Session에 저장하면 Server의 메모리를 과도하게 사용하게 되어 Server에 무리가 간다.

 


MVC 패턴

MVC란?

  • 객체지향프로그래밍에서, MVC란 사용자 인터페이스를 성공적이며 효과적으로 데이터 모형에 관련시키기 위한 방법론 또는 설계 방식 중 하나이다. 
  • MVC 패턴은 목적 코드의 재사용에 유용한 것은 물론, 사용자 인터페이스와 응용프로그램 개발에 소요되는 시간을 현저하게 줄여주는 형식이라고 많은 개발자들이 평가하고 있다.

 

MVC 구성 요소

Model - 소프트웨어 응용과 그와 관련된 고급 클래스 내의 논리적 데이터 기반 구조를 표현. 이 목적 모형은 사용자 인터페이스에 관한 어떠한 정보도 가지고 있지 않다.

 

View - 사용자 인터페이스 내의 구성요소들을 표현 (사용자에게 보이는 화면)

 

Controll - Model과 View를 연결하고 있는 클래스를 대표, Model과 View내의 클래스들간 정보 교환하는데 사용

 


 Interface, Abstract

 

Interface

  • 일종의 추상 클래스
  • 오직 추상메서드와 상수만을 멤버로 갖는다.
  • Implements 키워드를 사용
  • 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록 한다.
  • Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다.

 

Abstract

  • 추상메서드를 하나 이상 가진 클래스
  • 자신의 생성자로 객체 생성 불가능
  • 하위 클래스를 참조하여 상위 클래스의 객체를 생성
  • 하위 클래스를 제어하기 위해 사용

 

Interface vs Abstract

 

공통점

  • new 연산자로 인스턴스 생성 불가능
  • 프로토타입만 있는 메서드를 갖는다.
  • 사용하기 위해서는 하위클래스에서 확장/구현해야 한다.

 

차이점

  • 사용하는 키워드가 다르다
  • Abstract는 일반 메서드를 사용할 수 있지만, Interface는 메서드 선언만 가능하다.

 

추상 클래스에 추상 메서드가 있어야 할까?

  • 추상 클래스에는 추상 메서드가 있을 수도 있고 없을 수도 있다.
  • 추상 클래스는 일반 클래스와 달리 인스터느를 직접 생성할 수 없는 클래스이며, 하나 이상의 추상 메서드를 포함할 수 있다.
  • 추상 메서드는 구현이 없이 선언만 되어 있는 메서드이며, 이를 상속받은 구체적인 하위 클래스에서 반드시 구현해야 한다.
  • 추상 클래스는 추상 메서드 외에도 일반적인 메서드, 필드, 생성자 등을 가질 수 있다.

 

 

일반 클래스와 추상 클래스의 차이점은 무엇일까?

  • 일반 클래스는 인스턴스를 직접 생성하여 사용할 수 있으며, 모든 메서드가 구현되어 있다.
  • 반면에 추상 클래스는 인스턴스를 직접 생성할 수 없으며, 추상 메서드를 포함할 수 있다.
  • 추상 클래스는 하위 클래스에서 추상 메서드를 구현하도록 강제하는 역할을 하며, 일반 클래스는 그런 제약이 없다.
  • 일반 클래스는 필요에 따라 상속되거나 확장될 수 있다.

 

Call by Reference, Call by Value

Call by Reference  - 매개 변수의 원래 주소에 값을 저장하는 방식, 클래스 객체를 인수로 전달하는 경우

 

Call by Value - 인수로 기본 데이터형을 사용. 주어진 값을 복사하여 처리하는 방식. 메서드 내의 처리 결과는 메서드 밖의 변수에 영향을 미치지 않는다

 

 

Static의 의미

  • 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미
  • 객체를 아무리 많이 만들어도 해당 변수는 하나만 존재 (객체와 무관한 키워드)

 

Framework

  • 특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스프레임과 인터페이스 프레임의 집합
  • 특정한 틀을 만들어놓고 거기에 살을 붙여 높음으로써 프로그램을 만들어 작업시간을 줄여주는 것이다.
  • 프레임워크는 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성된다.
  • 프레임워크는 이렇게 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의한다.
  • 프레임워크는 좀 더 높은 수전에서 패턴을 조작한다.
  • 프레임워크는 컴포넌트 들은 재사용이 가능하다
  • 프레임워크가 중요한 이유는 객체지향 개발을 하게 되면서 개발자의 취향에 따라 다양한 프로그램이 나오게 된다. 프로그램 개발에 투입되는 개발자도 점점 늘어남에 따라 전체 시스템의 통합성, 일관성이 부족하게 되었기 때문이다.
    그래서 개발자의 자유를 제한하기 위해 프래임워크를 도입한다.

 

프레임워크의 장점/단점

장점 - 개발 시간을 줄일 수 있고 오류로부터 자유로울 수 있다.

단점 - 프레임워크에 너무 의존하면 개발 능력이 떨어져서 프레임워크 없이 개발하는 것이 불가능해지는 점이다.


 

Garbage Collection(가비지 컬렉션)

시스템에서 더 이상 사용되지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.

 

Wrapper Class

Primive Type으로 표현할 수 있는 간단한 데이터를 객체로 만들어야 할 경우가 있는데  그러한 기능을 지원하는 클래스

 


Spring Framework(스프링 프레임워크)

  • 자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)
  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크
  • 자바 개발을 위한 프레임워크로 종속 객체를 생성해 주고,  조립해 주는 도구
  • 자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결

 

스프링 특징 간단히

  • 크기와 부하의 측면에서 경량.
  • 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모
  • 관점지향 프로그래밍(AOP)을 위한 풍부한 지원
  • 플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 할 수 있음

간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 있음

 

스프링 특징 자세히

a. 경량 컨테이너로서 자바 객체를 직접 관리.

   각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 있다.

b. 스프링은 POJO(Plain Old Java Object) 방식 프레임워크.

   일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 

   존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.

c. 스프링은 제어의 역행(IoC : Inversion of Control) 지원.

   컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.

d. 스프링은 의존성 주입(DI : Dependency Injection) 지원

   각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜 준다.

e. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming) 지원

   따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 있다.

f. 스프링은 영속성과 관련된 다양한 서비스 지원

   iBatis Hibernate 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 있는 인터페이스를 제공한다.

g. 스프링은 확장성이 높음.

   스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.

 


 

동기 (Synchronous) / 비동기 (Asynchronous)

동기(synchronous) : 데이터의 요청과 결과가 한 자리에서 동시에 일어나는 거을 말한다. 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 한다.

 

ex) 브라우저를 실행시키는 시간이 약 10분이 소모된다고 가정했을 시, 브라우저가 실행되는 10분이라는 시간 동안 사용자는 컴퓨터의 다른 프로그램을 동작시키지 못하며 브라우저가 켜지는 그 순간만을 계속 기다려야 한다는 것이다. 이 시간이 10분이든 100분이든 관계없이 한 개의 데이터 요청에 대한 서버의 응답이 이루어질 때까지 계속 대기해야 한다.

 

 

비동기(Asynchronous) : 동시에 일어나지 않는다는 의미다. 요청한 결과는 동시에 일어나지 않을 거라는 약속이다. 

 

서버에게 데이터를 요청한 후 요청에 따른 응답을 계속 기다리지 않아도 되며 다른 외부 활동을 수행하여도 되고 서버에게 다른 요청사항을 보내도 상관없다.

 

 

동기와 비동기 장점 / 단점

동기 

장점 : 설계가 매우 간단하고 직관적이다.

단점 : 결과가 주어질 때까지 아무 것도 못하고 대기해야 한다.

 

비동기

장점 : 요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행할 수 있다.

단점 : 동기식보다 설계가 복잡하다.

 

 

동기 / 비동기 정리

  • 동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 목적의 차이이다.
  • 동기는 추구하는 행위와 목적이 도이에 이루어진다.
  • 비동기는 추구하는 행위와 목적이 다를 수도 있고, 동시에 이루어지지도 않는다.

 

String, Stringbuffet, Stringbuilder의 차이점

  • String은 불변의 속성을 가지며, StringBuffer와 SringBuilder는 가변의 속성을 가진다.
  • StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용한다
  • StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용한다.

 

Sring : 문자열 연산이 적고 멀티쓰레드 환경일 경우

StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우

StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우

 

 

String 객체가 불변인 이유에 대해 설명

1. 캐싱 기능에 의한 메모리 절약과 속도 햐앙

- Java에서 String 객체들은 Heap의 String Pool 이라는 공간에 저장되는데, 참조하려는 문자열이 String Pool에 존재하는 경우 새로 새엉하지 않고 Pool에 있는 객체를 사용하기 때문에 특정 문자열 값을 재사용하는 빈도가 높을수록 상당한 성능 향상을 기대할 수 있다.

 

2. Thead-safe

- String 객체는 불변이기 때문에 여러 쓰레드에서 동시에 특정 String 객체를 참조하더라도 안전하다.

 

3. 보안기능

- 중요한 데이터를 문자열로 다루는 경우 강제로 해당 참조에 대한 문자열 값을 바꾸는 거이 불가능하기 때문에 보안에 유리하다.


 

접근 제한자(Access Modifler)에 대해 설명

변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하며, 총 4가지 종류가 있다.

 

1. Public - 접근 제한이 없다 (같은 프로젝트 내 어디서든 사용 가능)

2. protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.

3. default - 해당 패키지 내에서만 접근 가능

4. private  -해당 클래스에서만 접근 가능

 

 

클래스 멤버 변수 초기화 순서

1. static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.

2. 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화 된다.

3. 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking( thead - safe 영역)

 

 

Inner Cass(내부 클래스)의 장점

1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다.

2. 서로 관련 있는 클래스는 논리적으로묶어서 표현함으로써, 캡슐화를 증가시키고, 코드의 복잡성을 낮출 수 있다.

3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 보안성을 높일 수 있다.

 

 

리플렉션(Reflection) 이란?

 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다.

 

 

리플렉션은 어떤 경우에 사용될까?

  • 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용된다. 
  • 프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공한다. intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능이라 할 수 있다.

 

Java의 어노테이션은 무엇인가?

Java의 어노테이션은 프로그램에 대한 데이터를 제공하지만 프로그램 자체의 일부가 아닌 메타데이터의 한 형태이다.

어노테이션은 컴파일러에 의해 읽히거나 애플리케이션에 의해 런타임에 읽힐 수 있는데 이는 컴파일러에게 정보를 전달하는 역할을 하며, 컴파일 시간 및 배포 시간 처리, 그리고 런타임에도 사용된다.

@Override
public String toString() {
	return "Example class";
}

 

Error 와 Exception의 차이가 무엇일까?

  • Error는 실행 중 일어날 수 있는 치명적 오류를 말한다. 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 예측 불가능한 UncheckedException에 속한다.
  • Exception은 Error보다 비교적 경미한 오류이며, try - catch를 이용해 프로그램의 비정상 종료를 막을 수 있다.

 

CheckedException과 UnCehckedException의 차이는 무엇일까?

CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 처리르 해야한다. 

 - 대표적인 Exception - IOException, ClassNOFoundException 등

 

UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 된다.

 - 대표적인 Exception - NullPointerException, ArrayIndexOutOfBoundException 등

 

RuntimeException은 UnckeckedException을 상속한 클래스이고, RuntimeException이 아닌 것은 CheckedException을 

상속한 클래스이다.

 

 

Optinal API이란 무엇일까?

개발할때 가장 많이 발생하는 예외 중 하나가 NPE(NullPointerException)이다. 

NPE를 피하려면 null 여부 검사를 필연적으로 하게 되는데 만약 null검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭다. 하지만 Java8 부터 Optional<T>을 제공하여 null로 인한 예외가 발생하지 않도록 와주고, Optional 클래스의 메소드를 통해 null을 컨트롤 할 수있다.

 

 

Final / Finally / finalize 의 차이점

final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용된다.

 - final 변수는 한 번 초기화되면 그 이후에 변경할 수 없다.

 - final 메소드는 다른 클래스가 이 클래스를 상속할 때 메소드 오버라이딩을 금지한다.

 - final클래스는 다른 클래스에서 이 클래스를 상속할 수 없다.

 

finally는 try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 하앙 수행되기 떄문에 마무리 해줘야 하는 직업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록이다.

 

finalize는 Object 클래스에 정의되어 있는 메소드이며, GC에 의해 호출되는 메소드로 절대 호출해서는 안되는 메소드이다.

GC가 발생하는 시점이 불분명하기 때문에 해당 메소드가 실행된다는 보장이 없고, finalize() 메소드가 오버라이딩 되어 있으면 GC가 이루어질 때 바로 Garbage Collectiong 되지 않는다.

GC가 지연되면서 OOME( Out Of Memory Exception)이 발생할 수 있기 때문에 finlize() 메소드를 오버라이딩하여 구현하는 것을 권장하지 않고 이다.

 

 

직렬화 (Serialize)이란?

  • 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있돌고 바이트(byte) 형태로 데이터 변환하는 기술이며, 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 '역직렬화'라고 한다.
  • JVM의 메모리에 상주(힙 or 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이다.

 

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

[JPA] 값 타입, 임베디드 타입  (0) 2022.11.22
프록시와 연관관계 관계  (0) 2022.11.16
Eclipse Svn 설치  (0) 2022.10.28
Eclipse에 Azure 설치 하기  (0) 2022.10.27
엔티티의 생명주기  (0) 2022.10.10