자바 정리

김종조·2024년 8월 9일
post-thumbnail

Java

자바의 특징

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

장점

  • 운영체제에 독립적이다.(JVM)
  • 가비지 컬렉터를 통해 자동으로 메모리 관리가 가능하다.

단점

  • JVM 위에서 동작해서 실행속도가 다른 언어에 비해 느리다.

JVM이란?

자바 가상 머신의 약자로 자바 프로그램이 실행되는 환경을 제공하는 가상 머신이다.
1. 플랫폼 독립성 : JVM은 자바 프로그램을 특정 운영체제나 하드웨어에 종속되지 않게 만들어준다. -> 동일한 자바 코드를 여러 플랫폼에서 실행할 수 있다.
2. 메모리 관리 : JVM은 자동으로 메모리 관리를 하고 가비지 컬렉션을 통해 불필요한 객체를 정리합니다.

GC(가비지 컬렉터)

힙 메모리 영역에서 더 이상 참조하지 않는 데이터가 할당된 메모리를 JVM이 자동으로 정리해주는 것이다.

동작과정

  1. Stop the world
  2. Mark and sweep

Stop the world

JVM이 GC를 실행하기 위해 애플리케이션의 실행을 멈추는 작업이다.
GC를 실행하는 쓰레드 외 다른 모든 쓰레드는 작업이 중단된다.

Mark and Sweep

Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해체하는 작업
Stop the world 이후 GC가 스택의 모든 변수 또는 접근 가능한 reachable 객체를 스캔한다.
1. GC가 스택의 모든 변수를 스캔하면서 어떤 객체를 참조하고 있는지 탐색하고 사용되고 있는 메모리를 식별한다.(Mark)
2. Mark가 되지 않은 객체들을 메모리에서 제거한다.(Sweep)

자바 코드 실행 과정

  1. 작성한 자바파일을 자바 컴파일러를 통해 자바 바이트 코드로 컴파일 한다.
  2. 컴파일된 바이트 코드를 JVM의 클래스로더에게 전달한다.
  3. 클래스로더는 동적 로딩을 통해 필요 클래스들을 로딩 및 링크하여 Runtime Data Area에 올린다.(JVM메모리)
  4. 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.

compiler VS Interpreter

compiler : 전체 파일을 스캔하여 한꺼번에 번역한다, 기계어 번역과정에서 더 많은 메모리를 사용한다.
Interpreter : 프로그램 실행 시 한 번에 한 문장씩 번역한다, 컴파일러와 같은 오브젝트 코드 생성과정이 없기 때문에 메로리 효율이 좋다.

JDK - (Java Development Kit)

Java 프로그램을 개발하기 위해 필요한 도구 모음 (Java 컴파일러, 디버깅 도구, JVM 등을 포함)
JDK 종류

  • Java SE : Java Platform, standard Edition
    표준 자바 플랫폼으로 표준적인 컴퓨팅 환경을 지원하기 위한 자바 가상머신 규격 및 API 집합을 포함한다.
  • Java EE : Java Platform, Enterprise Edition
    JavaSE에 웹 어플리케이션 서버에서 동작하는 기능을 추가한 플랫폼 -> 이 스펙에 따라 제품을 구현한 것을 웹 어플리케이션 서버(WAS)라고 한다.
  • Java ME : Java Platform, Micro Edition
    제한된 자원을 가진 휴대전화, PDA 드에서 Java 프로그래밍 언어를 지원하기 위해 만든 플랫폼 중 하나이다.

JDK 구성

javac : 자바 컴파일러(자바 소스파일 -> 바이트코드로 변환)
java : javac가 만든 클래스 파일을 해석 및 실행
jdb : 자바 디버깅 툴
JRE, JVM

JRE(java Runtime Evironment)

JRE(Java 런타임 환경)은 Java 프로그램이 올바르게 실행되기 위해 필요한 소프트웨어이며, 자바 코드를 실행하기 위한 도구들로 구성된 패키지이다.
Java는 여러 최신 웹 모바일 애플리케이션의 기반이 되는 컴퓨터 언어이며, JRE는 java 프로그램과 운영 체제 간의 통신을 위한 기본 기술이다.
JRE는 소프트웨어 작성 시 추가 수정 없이 어떤 운영 체제에서도 실행되도록 모든 리소스를 제공하는 번역기 및 촉진자 역할을 한다.

정리

JDK : 자바 프로그램을 개발하기 위한 도구들을 모아놓은 패키지로, 자바 소스 코드를 컴파일하고, 디버깅하고, 프로그램을 실행할 수 있는 도구들이 포함되어있다.
JRE : 자바 프로그램을 실행하기 위한 환경을 제공합니다. JRE는 자바 애플리케이션이 실행되도록 필요한 JVM과 자바 라이브러리들을 포함하고 있으며, 개발도구는 포함되어 있지 않다.
JVM : 자바 바이트 코드를 운영체제에 상관없이 실행할 수 있도록 해주는 가상 머신이다. JVM은 자바 프로그램을 실행할 때, 자바 바이트 코드를 각 운영체제에 맞는 기계어로 변환하여 실행한다.

Call by Value / Call by Reference

call by value

메서드를 호출할 때 값을 넘겨준다. 이 때 넘겨주는 값은 복사된 값이라 호출 당하는 수신자의 파라미터를 수정해도 메서드를 호출하는 호출자의 변수에는 아무런 영향이 없다.

call by reference

call by refererce는 주소를 직접 전달한다. 주소를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 동일한 변수이다. -> 메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 반영된다.

자바

자바는 오직 Call by Value로만 동작한다.

OOP(Object Oriented Programming)

객체 지향 프로그래밍

  • 캡슐화 : 객체의 데이터와 메서드를 하나의 단위로 묶어 외부에서 직접 접근하지 못하도록 보호하는 것
  • 상속 : 상위 개념의 특징을 하위 개념이 물려받는 것
  • 추상화 : 객체들의 공통적인 특징을 모아 하나의 클래스로 다루는 것
  • 다형성 : 같은 이름의 메서드를 각 클래스에 맞게 동작하도록 하는 것

SOLID

  • SRP(단일 책임 원칙) : 하나의 클래스는 하나의 책임만 가져야 한다.
    -> Controller에서 비즈니스 로직까지 처리한다면 요청과 응답, 비즈니스로직 둘 다 하게되므로 단일책임원칙에 위배된다.
  • OCP(개방-폐쇄 원칙) : 확장에는 열려있고 변경에는 닫혀 있어야 한다.
    -> 기능이 변하거나 확장되는 것은 가능하지만 그 과정에서 기존의 코드가 수정되지 않아야한다.
  • LSP(리스코프 치환 원칙) : 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
    -> 자식 클래스는 부모클래스의 역할을 모두 할 수 있어야한다.
  • ISP(인터페이스 분리 원칙) : 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다.
    -> 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스를 사용해야한다.
  • DIP(의존 관계 역전 원칙) : 개발자는 추상화에 의존해야지, 구체화에 의존하면 안된다
    -> 구현 클래스가 아닌 인터페이스에 의존해야함

자바 접근제어자 종류


public - 모든 클래스에서 접근 가능
protected - 같은 패키지에서 접근 가능, 자손 클래스에서 접근 가능
default - 같은 패키지에서 접근 가능
private - 같은 클래스에서만 접근 가능

자바 데이터 타입, 크기

  • 논리형
    - boolean -> 1byte
  • 문자형
    - char -> 2byte
  • 정수형
    - byte -> 1byte
    - short -> 2byte
    - int -> 4byte
    - long -> 8byte
  • 실수형
    - float -> 4byte
    - double -> 8byte

기본 자료형을 제외하면 모두 참조자료형이다.
-> new 키워드를 사용하여 객체를 생성할 때 생성된 객체의 주소를 참조하는 타입이다.

Wrapper Class

기본 자료형을 객체로 취급할 때 사용하는 경우 객체로 변환해주는 클래스이다.

  • 기본자료형과의 차이점 -> null값을 지원하며 값을 비교할 때는 동등연산자(==)가 아닌 equals() 메소드를 사용한다.

객체 지향

객체란 실체 및 개념을 반영하는 상태와 행위를 정의한 데이터이다.
객체지향 프로그래밍이란 각자의 역할을 지닌 객체들끼리 서로 메세지를 주고받으며 동작할 수 있도록 프로그래밍 하는 것이다.

클래스멤버 VS 인스턴스멤버

인스턴스멤버는 객체 생성 시 heap 영역에 생성되고 객체마다 별도로 존재한다.
객체 생성시에 생성되며 객체사 사라질 때 인스턴스멤버도 사라진다.
다른 객체와 공유되지 않는다.

클래스멤버는 컴파일 시 static영역에 생성된다.
객체를 따로 생성하지 않아도 사용이 가능하다.
프로그램이 종료될 때 사라진다.
클래스멤버는 동일한 모든 클래스의 모든 객체들에 의해 공유된다.

Java의 main 메서드가 static 인 이유

public static void main(String[] args){}의 의미
main메서드는 프로그램이 실행되는 시작과 끝이되는 지점이다.
public - 어디에서나 접근이 가능해야한다.
static - 프로그램 실행 순간에 메모리에 할당되어야 한다. -> GC에 의해 정리대상이 되어서는 안된다.
void - 리턴값이 없음을 의미한다.
main() - 관례적으로 프로그램의 시작점을 main으로 사용하고 있다.
String[] args - 프로그램 실행시에 첫 스레드인 main에게 데이터를 넘겨주고 싶을 때를 위한 파라미터 이다.

final 키워드

final은 변수나 메서드, 클래스가 변경 불가능하도록 만드는 예약어이다.

  • 변수 -> 해당 변수의 값은 변경이 불가능해진다.
  • 메서드 -> 해당 메서드를 오버라이드 할 수 없다.
  • 클래스 -> 해당 클래스의 하위 클래스를 정의할 수 없다.
    finally는 try/catch 블록이 종료될 때 항상 실행될 코드 블록을 정의하기위해 사용한다.
    finalize() 메서드는 가비지 컬렉터가 더 이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠따고 결정하는 순간호출이 된다.

인터페이스와 추상 클래스의 차이

추상클래스

  • abstract 키워드로 선언되어 있다.
  • 추상클래스의 추상 메서드를 하위 클래스가 구체화 하여 기능을 확장 하는데 목적이 있다.

인터페이스

  • interface 키워드로 선언되어 있다.
  • 인터페이스를 implement한 클래스에서 추상메서드를 구현하여 사용한다.

차이점

  • 추상클래스는 추상 메서드를 하위클래스가 구체화 하여 기능을 확장하는데 목적이 있다.
  • 인터페이스는 정의된 기능 구현을 강제하여 상속받은 클래스들의 같은 동작을 보장하는데 목적이 있다.
  • 추상 클래스는 단일 상속, 인터페이스는 다중 상속이 가능하다.

싱글톤 패턴

시스템 전체에서 하나의 인스턴스만 사용하는 것이다.

  • 생성자를 private으로 생성
  • 단일 인스턴스를 private static 변수에 저장
  • 필요한 경우 인스턴스를 생성하여 반환하는 public static 메소드를 제공

Collection

객체 그룹을 저장하고 조작하기 위한 클래스를 제공한다.

  • List : 중복을 허용하고, 순서가 보장된다.
  • Set : 중복을 허용하지 않고, 순서가 보장되지 않는다.
  • Map : key와 value가 한 쌍이 되며, key는 중복을 허용하지 않고 순서가 보장되지 않는다.

오버로딩, 오버라이딩

오버로딩 : 한 클래스 안에 이름은 같지만 매개변수가 다른 메서드가 두개 이상 존재하는 것을 의미한다.
오버라이딩 : 상위 클래스의 메서드를 하위 클래스에서 재정의 하는 것이다.

equals와 동등연산자(==)의 차이

==는 참조 비교 연산자로 두 개의 주소값이 같은지를 비교한다.
equals는 두 객체 내의 값을 비교한다.

String, StringBuilder, StringBuffer의 차이점

  • String : 불변 문자 객체로 수정할 때는 새로운 String 객체를 생성한다.
    -> String이 불변 객체인 이유
    1. 캐싱 : String pool에 각 리터럴 문자열의 하나만 저장하여 다시 사용하게끔 해서 힙 공간을 절약
    2. 보안 : 문자열 값이 변경이 가능하면 해커가 참조 값을 변경하여 문제를 일으킬 수있다.
    3. 동기화 : 불변함으로 동시에 실행되는 여러 스레드에서 안정적이게 공유가 가능하다.
  • StringBuilder : 단일 스레드거나 동기화를 고려하지 않아도 되는 경우(동기화 지원 안함) -> Thread-safe 하지 않음
  • StringBuffer : 다중 스레드 환경일 경우(동기화 지원) -> Thread-safe 함
    동기화 : 여러 스레드의 요청이 들어오면 하나의 스레드가 끝나고 다음 스레드로 넘어감

Functional interface

함수형 인터페이스는 1개의 추상 메서드를 갖고있는 인터페이스를 말한다.

직렬화 / 역직렬화

직렬화

객체를 전송하기 위해 전송 가능한 형태로 만드는 것을 의미한다.
객체들의 데이터를 연속적인 데이터로 변형하여 Stream을 통해 데이터를 읽도록 해준다.
직렬화 하기위한 클래스에 Serializable 인터페이스를 implements 하면 된다.
-> 상위 클래스인 A 클래스에서 Serializable 인터페이스를 implements 했을 때 A 클래스를 상속받은 B 클래스도 직렬화 가능한 클래스가 된다.
직렬화 대상에서 제외하고 싶은 멤버변수는 transient 키워드를 붙여주면 된다.

역직렬화

직렬화된 파일 등을 역으로 직렬화하여 다시 객체의 형태로 만드는 것을 의미한다.

빌더패턴

객체 생성 과정에서 복잡한 생성자를 단순화 하고 필요한 데이터만 설정할 수 있다.

Error / Exception

Error

복구할 수 없는 심각한 문제를 의미한다. -> 개발자가 예측하여 방지할 수 없음

Exception

개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생한다. -> 예측하여 미리 방지할 수 있다.

Checked Exception

개발자가 반드시 예외 처리를 직접 진행해야 한다.

Unchecked Exception

개발자가 예외처리를 직접 하지 않아도 된다. 예외처리가 강제되는 것이 아님

equals() / hashcode()

equals()

2개의 객체가 참조하는 것이 동일한지를 확인하는 것

hashcode()

객체의 주소 값을 해싱 기법을 통해 해시 코드로 만든 후 반환하는 것

오버라이드

equals() 메소드를 오버라이드 한다면, hashcode() 메소드도 함께 오버라이드 되어야 한다.

다음과 같이 ID를 통해 같은지 다른지를 판별한다고 했을 때
수정한 Employee를 HashSet에 저장한다면 e1과 e2는 다른 해시값을 반환할 것이라 HashSet에는 2개의 객체가 저장될 것이다.
이러한 문제를 해결하기 위해 hashCode 메소드를 같이 오버라이드 해줘야 한다.

JSP/Servlet

Servlet

  • Servlet은 Java로 작성된 웹 애플리케이션에서 서버 측 로직을 처리하기 위한 Java의 클래스이다.
  • Servlet은 HTTP 요청을 처리하고 동적인 웹 페이지를 생성하는데 사용된다.
  • Java 코드 내에 HTML 코드를 포함하거나 Java코드 내에서 HTML을 생성하는 방식으로 사용된다.

JSP

  • JSP 는 Servlet을 기반으로 한 웹 애플리케이션의 뷰 부분을 처리하기 위한 기술이다.
  • JSP는 HTML 내에 Java 코드를 삽입하여 동적 웹 페이지를 생성하는 방식으로 사용된다.
  • Servlet과 마찬가지로 서버 측 로직을 처리하며, 웹 페이지의 동적 부분을 표현할 때 주로 사용된다.

정리
Servlet은 클라이언트에 요청을 받고 비즈니스 로직을 처리한 후 JSP 에게 결과를 전달하는 컨트롤러 역할을 하고
JSP는 전달받은 데이터를 이용해 HTML과 동적인 콘텐츠를 생성하는 역할을 한다.

HashMap과 HashTable의 차이점

HashMap

HashMap은 동기화를 지원하지 않기 때문에 단일 스레드 환경에서 사용하기에 적합하다.
key와 value에 null을 허용한다.

HashTable

HashTable은 동기화를 지원해서 멀티 스레드 환경에서도 사용하기 좋다.
하지만 동기화 때문에 HashMap에 비해 성능상 느리다.
key와 value에 null을 허용하지 않는다.

profile
웹 개발 공부 기록

0개의 댓글