Java 키워드 정리

5tr1ker·2023년 2월 6일
0

백엔드 지식

목록 보기
1/2
post-thumbnail

Java 키워드

객체지향 프로그래밍의 특징

자바는 JVM 위에서 동작하기에 운영체제에 독립적이며, 캡슐화,상속,다형성,추상화의 특징을 가집니다. 또한 런타임 시점에 데이터 타입이 결정되는 동적 타입 언어이며 컴파일 언어와 인터프리어 언어 2가지를 복합적으로 사용하는 하이브리드 언어이고 , GC를 지원합니다.

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

다른 클래스를 가져와 활용할 수 있어 코드 재사용이 용이하며, 클래스 단위로 모듈화 시킬 수 있어 대형 프로젝트에 적합하며 유지보수가 쉬워집니다. 또한 JVM 위에서 동작하기에 운영체제에 독립적이며 가비지 컬렉터를 통한 자동적인 메모리 관리가 가능합니다.

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

설계에 많은 시간이 소요되며 , JVM 위에서 동작하기 때문에 처리 시간이 다른 프로그래밍에 비해 상대적으로 느립니다. 또한 다중 상속이나 타입에 엄격하며, 제약이 많습니다.

클래스

클래스는 객체를 정의하는 틀 또는 설계도를 의미하고 , 클래스 안에는 객체를 만들기 위해 필요한 변수와 메서드가 존재합니다.

final

final은 변수나 메소드 또는 클래스가 변경 불가능하게 하는 키워드로, final로 선언 시 무조건 초기화 해야합니다. 절대 변하지 않는 값인 상수의 개념을 갖고 있으며 객체 내부에서 값의 변환을 허용하지 않고 데이터를 지킬 때 사용합니다.

접근제어자

클래스,인터페이스,멤버변수,함수 등의 접근을 제어하는 지시어로, 접근제어자를 사용함으로써 외부 객체의 무분별한 접근으로부터 내부 데이터를 보호할 수 있습니다. 어디서든 접근할 수 있는 public과 자식클래스만 허용하는 protected , 같은 패치지만 접근하는 default와 같은 클래스 내에서만 접근 가능한 private가 있습니다.

JVM의 역할

JVM은 자바를 실행하기 위한 가상 기계로, 자바의 바이트 코드를 운영체제에 맞게 해석하는 역할을 합니다. 자바 컴파일러가 java 파일을 컴파일 하여 class 라는 바이트 코드로변환시켜주는데, 이때 바이트 코드는 기계어가 아니기 때문에 운영체제에서 실행되지 않습니다. 그래서 운영체제가 이해할 수 있게 해석해주는 것이 JVM입니다.

Java의 메모리 영역

자바의 메모리 공간은 메소드 , 스택 , 힙 영역으로 구분됩니다. 메서드 영역은 전역 변수와 static 변수를 저장하고 , 프로그램의 시작부터 종료까지 남아있습니다. 스택 영역은 지역변수와 매개변수 값이 저장되는 공간으로 메소드가 호출될 때 할당되고 종료되면 해제되며 LIFO 구조를 갖습니다. 힙 영역은 동적할당된 객체들이 저장되고, 가비지 컬렉션에 의해 메모리가 관리됩니다.

Java의 컴파일 과정

개발자가 java 파일을 생성하고 build 를 하게되면 자바 컴파일러의 javac 의 명령어를 통해 바이트코드인 class를 생성합니다. 이 후 class Loader 를 통해 JVM 메모리 내에 로드하고 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석합니다.

가비지컬렉션

C와 C++ 언어와 달리 자바는 개발자가 명시적으로 객체를 해제할 필요가 없으며, 사용하지 않는 객체를 메모리에서 삭제하는 작업을 가비지 컬렉션이라고 하며 JVM 에서 수행됩니다.

직렬화 ( Serialize )

시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있게 바이트 형태로 데이터를 변환하는 기술로 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 역직렬화라고 합니다.

SerialVersionUID

JVM은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여하는데, 만약 그 시점에 클래스의 정의가 바뀌었다면 새로운 버전 번호를 할당하게 됩니다. 직렬화와 역직렬화의 버전 번호가 서로 다르면 안되기 때문에 이 문제를 해결하기 위해 사용됩니다. 즉 클래스 버전이 맞는지 확인하는 용도로 사용됩니다.

try-with-resources

try-catch-finally 의 문제점을 보완하기 위해 나온 개념으로 , try 안에 자원 객체를 전달하면, try 블록이 끝나고 자동으로 자원을 해제 해주는 기능을 말하며, finally 구문이나 catch 구문에서 종료 처리를 하지 않아도 됩니다.

불변 객체

객체 생성 이후 내부의 상태가 변하지 않는 객체를 말하며 Java에서는 원시 타입은 final 키워드를 사용해 불변 객체를 만들며 참조 타입의 배열은 clone 키워드를 활용하고, 리스트는 새로운 리스트에 값을 복사해 만들 수 있습니다.

Call By reference / Call by Value

Call By Value는 값에 의한 호출이며 함수가 호출될 때 메모리 공간 안에서 함수를 위한 별도의 임시 공간을 생성합니다. 인자로 전달되는 변수의 값을 복사하며, 함수에 인자값이 변경되어도 외부의 변수값은 변하지 않습니다.
Call By Reference는 참조에 의한 호출이며 함수가 호출될 때 함수는 임시 공간을 할당하며 인자로 전달되는 변수의 레퍼런스를 전달받습니다. 함수에 인자 값을 변경되면 외부의 변수값이 변합니다.

JAVA는 어디에 해당되나

Java는 기본자료형은 Call By Value 이고, 참조자료형은 Call By Reference입니다.

interface 사용 이유

인터페이스는 모든 메서드가 추상 메서드로 이루어진 클래스이며 , 선언한 변수도 final static 키워드가 붙습니다. 인터페이스를 사용하여 팀 단위로 큰 프로젝트를 효율적으로 진행할 수 있는데, 객체의 내부 구조를 모르더라도 메서드 명만 알면 다른 팀의 작업을 기다리지 않아도 되며, 객체가 수정되어도 개발 코드를 수정하지 않아도 됩니다.

interface , abstract 비교

인터페이스는 추상 클래스의 일종이며 , 오직 추상 메서드나 상수만 갖고, 상속 관계가 없는 클래스간 서로 공통되는 로직을 구현할 수 있습니다. 추상 클래스는 추상 메서드를 하나 이상 가진 클래스로, 하위 클래스를 참조해 상위 클래스의 객체를 생성하여 하위 클래스를 제어하기 위해 사용됩니다.

interface 와 abstract의 공통점과 차이점

추상 클래스와 인터페이스는 객체 생성이 불가하며 사용하기 위해서는 하위 클래스에서 확장 및 구현을 해야 합니다. 다만 인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메서드를 반드시 구현해야 하며, 다중상속이 가능합니다. 추상 클래스는 상속받은 클래스들의 공통적인 로직을 추상화 하고, 기능 확장을 위해 사용됩니다.

제네릭 정의와 사용 이유

제네릭은 데이터 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정하는 의미를 말하며, 제네릭 타입을 사용함으로 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거하여 에러를 사전에 방지할 수 있습니다.

박싱과 언박싱

원시형을 Wrapper Class로 변환하는 것이 박싱이고 , Wrapper Class를 원시형으로 변환하는 것을 언박싱이라 합니다.

동기화 ( Synchronized )

여러 쓰레드가 한 개의 자원을 사용하고자 할 때, 오직 하나의 쓰레드만 데이터에 접근할 수 있게 하는 것을 말합니다. 데이터의 thread-safe를 하기 위해 자바는 Synchronized 키워드를 제공해 쓰레드간 동기화를 시켜 데이터의 thread-safe 를 보장합니다. 하지만 Synchronized 를 남발하면 프로그램의 성능 저하를 일으킬 수 있습니다.

new String 과 리터럴의 차이

new String 은 동적으로 객체를 생성하기 때문에 힙 메모리 영역에 저장되고 , 리터럴은 힙 안에 있는 String Constant Pool 영역에 저장됩니다.

String , StringBuffer , StringBuilder

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

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

static 변수 선언부는 클래스가 로드 될 때 제일 먼저 초기화 됩니다. 필드 변수 선언부는 객체가 생성될 때 heap 메모리에 올라가고 생성자 block 보다 먼저 초기화 됩니다. 생성자 block은 객체가 생성 될 때 heap 메모리에 올라가는데 , 이때 필드 변수가 초기화 될 때까지 JVM에서 로킹해줍니다.

static

static 키워드는 객체 생성없이 바로 사용할 수 있는 변수나 메서드를 말하며 , 모든 객체가 메모리를 공유하는 특징이 있고 , 가비지 컬렉션 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지됩니다. 객체 생성 비용을 줄일 수 있지만 메모리에 올라가는 것이기에 남용하면 메모리를 낭비할 수 있습니다.

리플렉션 Reflection

컴파일러를 무시한 채 런타임 상황에서 메모리에 올라간 클래스나 메모리 등의 정의를 동적으로 찾아 조작할 수 있는 행위를 말하며, 동적인 특징을 가지며 프레임워크에서 유연성있는 동작을 위해 사용됩니다.

Error와 Exception 차이

Error는 실행 중에 발생할 수 있는 치명적 오류를 말하며 , 프로그램이 비 정상적으로 종료되는 예측 불가능한 UncheckedException입니다. 반면 Exception은 try-catch를 이용해 프로그램의 비 정상적인 종료를 막을 수 있습니다.

CheckedException , UncheckedException

checkedException은 컴파일 전에 예측 가능한 예외를 말하며 , 반드시 예외 처리를 해야합니다. 반면 uncheckedException은 실행 중에 발생할 수 있는 예외를 말하고, 예외 처리를 하지 않아도 됩니다.

컬렉션

자바에서 컬렉션은 데이터의 집합이나 그룹을 말하며 , 자바 컬렉션 프레임워크는 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합을 의미합니다.

컬렉션에서 제네릭을 사용하는 이유

컬렉션 클래스에 저장되는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 시점에 잡아 낼 수 있어서 사용합니다.

인스턴스

객체를 소프트웨어에서 실체화 하면 그것을 인스턴스라고 하거나, 객체지향 관점에서 객체가 메모리에 할당되어 사용될 때 인스턴스라고합니다.

인스턴스화

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며, 해당 객체를 클래스의 인스턴스라고 합니다.

객체 Object

소프트웨어 세계에 구현할 대상을 말하며, 클래스의 인스턴스라고도 부르며, 객체지향 관점에서 클래스의 타입으로 선언되었을 때 객체라고 합니다. 또한 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어에 가깝습니다.

ArrayList , LinkedList 차이

ArrayList는 단방향 포인터 구조로 순차적 조회에 용이하며 , LinkedList는 양방향 포인터 구조를 갖고 있으며 데이터의 삽입과 삭제가 빠릅니다.

JDBC

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

profile
https://github.com/5tr1ker

0개의 댓글