자바의 특징?
- 자바는 객체지향프로그래밍 언어로 캡슐화, 상속, 다형성의 특징을 가지고 있습니다.
- 장점은 JVM위에서 동작하기에 os에 독립적이고 가비지컬렉터를 통한 자동 메모리 관리가 가능합니다.
- 단점은 JVM위에서 동작하기에 실행속도가 조금 느리고, 다중 상속이나 타입에 엄격하며 제약이 많습니다.
JVM의 역할?
- 스택기반으로 동작하며, 자바바이트코드를 os에 맞게 해석해주는 역할을 합니다.
자바의 컴파일 과정?
- 소스파일(.java)을 생성하고 컴파일러(javac)로 바이트코드를 생성합니다.
- 클래스 로더를 통해 JVM 메모리 내로 로드하고, 실행엔진을(java.exe) 통해 기계어로 해석됩니다.
자바에서 제공하는 원시타입? 몇바이트 차지?
- 정수형에는 byte, short, int, long이 있고 실수형에는 float, doble 문자형 char 논리형 boolean이 있습니다.
- 각각의 타입은 1,2,4,8(정수), 4,8(실수), 2(문자형), 1(논리형)
오버라이딩과 오버로딩의 차이점?
- 오버라이딩은 상위 클래스에서 정의한 메소드를 하위클래스에서 재정의하는 것을 뜻하고
- 오버로딩은 매개변수의 타입과 갯수에 따라 같은 이름의 메소드를 여러개 정의하는 것을 뜻합니다.
객체지향프로그래밍이란(OOP)?
- 프로그램에 필요한 객체를 파악하고, 상태(변수)와 행위(함수)를 가진 객체를 만들고, 역할이 무엇인지를 정의하여, 객체들간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
- 기능이 아닌 객체 중심으로, 누가 어떤 일을 할 것인가가 핵심입니다.
- 특징으로는 캡슐화, 다형성, 추상화, 상속등이 있고, 모듈 재사용으로 확장 및 유지보수가 용이합니다.
객체지향의 특징 설명?
- 캡슐화? 클래스 안에 관련 데이터와 함수를 하나의 캡슐로 만들어 외부로부터 보호하는 것을 말합니다. 이때 캡슐화된 멤버를 숨길것인지 노출할것인지를 결정하기 위해 접근 제어자를 사용합니다.
- 다형성? 하나의 타입을 여러 객체에 대입할 수 있는 성질을 가지고 있습니다.
- 추상화? 객체의 공통적인 특징을 하나의 개념으로 다루는 것을 의미합니다.
- 상속? 부모클래스와 자식클래스가 있으면, 부모클래스의 필드와 메소드를 자식클래스에서 사용할 수 있는 것을 뜻합니다.
접근제어자의 종류?
- public, protected, private, default
- private은 해당 클래스 내에서만 접근이 가능하고, default는 해당 패키지, protected는 해당 패키지와 자식클래스까지 접근이 가능하고, public은 전체 영역에서 접근이 가능합니다.
try-with-resurces?
- try-catch-finally의 문제점을 보완하기 위해 나온 개념입니다.
- fianlly블록은 옵션으로 생략 가능하며, try와 catch에서 return을 처리해도 항상 실행됨.
- 다중 catch 블록 주의점: 예외 클래스가 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야함.
- try안에 자원 객체를 전달하면, try블록이 끝나고 자동으로 자원을 해제해줍니다.
- 따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 되는 장점이 있습니다.
- try안에서 예외가 발생하면 우선 close()로 리소스를 닫고, catch블록을 실행합니다.
싱글톤 패턴?
- 단 하나의 인스턴스를 생성해서 사용하는 디자인 패턴입니다.
- 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 메모리 낭비 방지를 위해 주로 사용합니다.
가비지 컬렉션이란?
- JVM의 메모리 관리 기법 중 하나로, 힙 영역에서 사용하지 않는 객체들을 제거하여 메모리를 관리해주는 기법입니다.
객체지향의 설계원칙?
- srp(단일 책임의 원칙): 한 클래스는 하나의 책임만 가져야 합니다.
- ocp(개방폐쇄의 원칙): 확장에는 열려있고, 수정에는 닫혀있어야 합니다.
- LIP(리스코프 치환 원칙): 하위 타입은 항상 상위 타입을 대체할 수 있어야 합니다.
- DIP(의존관계 역전 원칙): 상위 모듈은 하위 모듈에 의존하면 안되고, 추상화는 세부사항에 의존해서는 안됩니다. DIP원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)입니다.
- ISP(인터페이스 분리 원칙): 인터페이스내에 메소드는 최소한 일수록 좋습니다. 즉, 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 좋습니다.
자바의 메모리 구조?
- 메소드, 스택, 힙영역으로 구분되고, 데이터 타입에 따라 할당됩니다.
- 메소드영역에는 전역변수와 static변수를 저장하며, 프로그램의 시작부터 종료까지 남아있습니다.
- 스택영역에는 지역변수와 매개변수값을 저장하며, 메소드 호출 시, 메모리에 할당되고 종료되면 메모리가 해제됩니다. LIFO 구조를 갖고, 변수에 새로운 데이터가 할당되면 이전 데이터는 지워집니다.
- 힙영역에는 new 키워드로 생성되는 객체(인스턴스), 배열 등이 저장되며, 가비지 컬렉터에 의해 메모리가 관리됩니다.
static이란?
- static키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈때, 자동으로 생성되며 바로 사용할 수 있습니다. 즉, 인스턴스 생성 없이 바로 사용 가능합니다.
- 모든 객체가 메모리를 공유하고, GC관리 밖에 있기에 프로그램이 종료될때까지 값이 존재합니다.
java의 main메소드가 static인 이유?
- static 멤버는 프로그램 시작 시, 클래스 로더에 의해 메모리에 로드되어 인스턴스를 생성하지 않아도 호출이 가능하기 때문입니다.
static을 사용하는 이유?
- static은 자주 변하지 않는 값이나 공통으로 사용되는 값 접근에 있어서, 매번 메모리에 값을 읽어들이는 것보다 전역변수와 같은 개념으로 접근하는 것이 효율을 높일 수 있기 때문입니다.
- 인스턴스 생성 없이 사용 가능하기에, 공통으로 사용되는 데이터들을 관리할 때 사용합니다.
final, finally, finalize의 차이점?
- final 키워드는 변수, 메서드, 클래스가 변경 불가능하도록 만듭니다.
- final 변수: 한번 초기화되면 변경 불가
- final 메서드: 오버라이딩 불가
- final 클래스: 상속 불가
- finally 키워드는 try catch 블록 뒤에서 항상 실행될 코드 블록을 정의하기 위해 사용합니다.
- finalize 메서드는 가비지 컬렉터가 더이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠다고 결정하는 순간 호출됩니다.
클래스와 객체란?
- 클래스는 객체를 만들어내기 위한 틀이고, 객체를 생성하는데 사용합니다.
- 객체는 클래스를 기반으로 생성되며, 고유한 이름과 상태, 행동을 갖습니다.
- 상태는 필드, 행동은 메소드라고 표현합니다.
- 객체에 메모리가 할당되어 실제로 활용되는 실체는 인스턴스라고 부릅니다.
생성자란?
- 클래스로부터 객체를 생성할때 호출되어, 객체의 초기화를 담당합니다.
wrapper class란? Boxing과 UnBoxing이란?
- 기본 자료형에 대한 객체 표현을 뜻합니다.
- Boxing은 기본자료형을 wrapper class로 변환하는 것을 뜻하고
- UnBoxing은 wrapper class를 기본 자료형으로 변환하는 것을 뜻합니다.
synchronized란?
- 멀티쓰레드환경에서 한 자원에 대해서 한 프로세스만이 접근가능하도록 하는 것입니다.
- 데이터의 thread-safe를 위해 자바에서 synchronized키워드를 제공해 멀티쓰레드환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장합니다.
- 변수와 메소드에 사용해서 동기화할 수 있고, 해당 키워드를 남발하게 되면 프로그램의 성능저하를 일으킬 수 있습니다.
내부 클래스(inner class)의 장점?
- 내부 클래스에서 외부 클래스의 멤버에 접근할 수 있다.
- 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 캡슐화를 증가시키고 코드의 복잡성을 낮출 수 있다.
- 외부에서 내부 클래스에 접근할 수 없으므로, 코드의 보안성을 높일 수 있다.
reflection이란?
- 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있게 해주는 자바 API입니다.
Optional API란?
- nullpointerException을 방지하기 위해 null 여부 검사를 하는데, 변수가 많을 수록 코드가 번거롭습니다.
- 이에 optional<T>를 사용하여 Null로 인한 예외가 발생하지 않도록 도와줍니다.
컬렉션 프레임워크란?
- 다수의 데이터를 효과적으로 쉽게 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 뜻합니다.
- List, set, map 인터페이스를 기준으로 여러 구현체가 존재하고, 이에 더해 stack, queue인터페이스도 존재합니다.
제네릭이란? 왜사용?
- 클래스 내부에서 타입을 지정하는 것이 아닌, 외부에서 사용자에 의해 지정되는 것을 의미합니다.
- 이를 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 시 체크하여 에러를 사전에 방지할 수 있습니다.
자바에서 ==와 equals의 차이는?
- ==는 참조 비교로, 두 객체가 같은 메모리 공간을 가리키는지 확인하는 연산자로 주소값을 비교합니다.
- equals는 두 객체의 값이 같은지 비교합니다.
자바의 hashcode()란?
- 두 객체가 동일한 객체인지 비교할때 사용하고, 힙영역에 저장된 객체의 메모리 주소를 반환합니다.
추상 클래스와 인터페이스의 차이점?
- 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되어 있는 경우를 말하고, 인터페이스는 모든 메소드가 추상 메소드로 이루어져 있는 것을 말합니다.
- 추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할때 사용합니다. 단일 상속만 가능합니다.
- 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다.
- 추상클래스는 추상메소드를 자식 클래스가 구체화하여 그 기능을 확장하는데 목적을 가지고 있고
- 인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 구현해야하는 경우에 사용합니다.
원시 타입과 참조 타입의 차이점?
- 자바에서 8개만 존재하는 타입이고, 그 외에 모든 것이 참조 타입입니다.
- 원시 타입은 기본값을 가지지만, 참조타입은 null 포인터를 가집니다.
자바에서 직렬화, 역직렬화란?
- 직렬화는 객체를 바이트코드로 변환하여 전송하는 것을 말하고
- 역직렬화는 직렬화된 바이트코드를 다시 객체로 변환하는 과정입니다.