반응형
JVM, JRE, JDK의 차이
- JVM : 컴파일된 바이트 코드가 실행되는 머신
- JRE : 자바가 구동 될 수 있는 환경 (JVM + Bytecode Verifier + Class Loader)
- JDK : JRE + 개발을 위한 여러 toolkit (javac, javadoc.. etc)
AutoBoxing과 Unbokxing
- primitive 자료형은 stack 영역에서 관리되는 가벼운 데이터
- wrapper class는 heap 영역에서 관리되고, 이에 대한 주소 참조 값이 stack영역에서 관리됨.
- Autoboxing : primitive 자료형 (int, long, float, double)이 이에 대응되는 Wrapper Class Integer, Long, Float, Double로 형변환이 되는 것
- UnBoxing : Wrapper Class에서 Primtive 자료형으로 자동 형변환 되는 것.
Java 메모리 구조에서 stack 영역과 heap 영역이 무엇인지 설명
- stack : primitive 데이터, reference 값들만 저장되고 관리됨.
- heap : object, 크기가 큰 데이터들을 관리하며 이들을 관리하는 GC(Garbage Collectoin)이 있음
String, String Buffer, String Builder
- String By literal : String Pool이라는 Heap 메모리 공간 내에 특수한 영역에서 문자열이 생성되고, 한번 생성되면 값이 변하지 않는다. 문자열이 재 사용이 된다.
- String By Class : new 키워드를 통해 생성된 String Class의 인스턴스는 생성 시마다 매번 새로운 주소 값을 갖고 새로 생성되므로 문자열 값이 재 사용되지 않는다.
- String Buffer : 문자열 값을 가변적으로 바꿀 수 있다. Synchronized 키워드를 통해 Thread-Safe 하게 값을 변경할 수 있다.
- String Builder : 문자열 값을 가변적으로 바꿀 수 있다. Thread-Safe 하지 않다. Synchronized 하지 않아 Sring Buffer 보단 속도가 빠르다.
Overloading과 Overriding
- overloading : 한 클래스 내에서 메소드 이름이 같고 메소드의 매게 변수가 다른 메소드들, 리턴 타입이 같거나 달라도 된다. (ex: System.println)
- overriding : 자식 클래스가 부모 클래스의 메소드를 재 정의한 것, 매개변수는 같고, 리턴 타입은 같거나 리턴 클래스의 하위 클래스
리터럴과 new를 통해 생성된 String의 차이
- 리터럴을 통해 생성된 String은 String Pool에 저장되고 관리됨. String Pool은 Heap 메모리 내에 존재하는 특정한 구역. String Pool이기에 동일한 String의 경우는 생성하지 않고 이전의 값을 재사용한다. (주소 값이 같다.)
- new 키워드를 통해 생성된 String은 heap 메모리에 매번 새로 생성되어 관리됨. 동일한 String을 사용한다고 해도 new 키워드를 통해 생성했다면 서로 다른 객체이기에 주소 값이 다르다.
Static 이란?
- Java는 프로그램을 구동하기 위해 객체를 생성해서 메모리에 올려야 한다. 하지만 static 은 프로그램에 의해 객체가 생성되는 것이 아닌 클래스가 로딩될 때 생성된다.
- 클래스의 이름으로 접근이 가능하며, 해당 클래스의 객체와는 무관함 (객체가 생성되기 전에 이미 메모리에 올라가므로)
- 자주 사용되는 변수, 자주 호출되는 메소드 (ex: Math.rand())
Abstract와 Interface의 차이
- super 클래스가 어느 정도 구현되어있으며, 구현의 완성을 sub class에 맡기는 경우를 abstract class이며 abstract method가 있다. 모든 접근 제어자 사용 가능
- 실질적으로 전혀 구현이 없는 class, 구현에 대한 명세만 작성되어있고 이를 구현하는 sub class에서 구현해야 함. 오직 public 접근 제어자만 사용, 다중 상속 가능
Java에서의 Exception Handling
- Exception이란 프로그램에서 처리 가능한 수준의 문제 발생 말한다.
- Error는 프로그램에서 처리 불가능한 심각한 수준의 문제 발생을 의미한다(EX: OOM).
- Exception의 경우, Compile time에서 발생할 수 있는 Checked Exception과 실행 시 발생할 수 있는 Unchecked Exception이 있다.
- Exception Handling이란, 이러한 Exception이 발생했을 때 프로그램에서 어떻게 잘 처리할 수 있는 지를 의미하며 방법은 다음과 같이 있다.
- try-catch block : try-catch block 문을 통해 exception이 발생한 부분에서 exception에 따라 프로그램을 핸들링.
- throws : exception이 발생한 메소드에서 exception handling을 자신을 호출한 상위 method로 처리를 넘겨 처리를 회피하는 것.
Errors, Unchecked Exception, Checked Exception들의 차이
- exception
- checked exception : 프로그램 실행 전에 확인이 가능하거나 예측이 가능한 exception, compile time exception이라고도 함. (ex: IOException, SQLException)
- unchecked exception : 런타임 때 발생하는 예측 불가능한 exception (eg: ArrayIndexOutOfBoundException, NPE)
- error : exception handling이 어려운 심각한 수준의 exception을 의미하며 (EX: OOM)
throw와 throws의 차이
- throw : exception을 발생하는 키워드, 객체를 생성해서 예외를 발생, 메소드 내부에서 사용되고 오직 한 가지의 exception만 발생시킬 수 있다.
- throws : exception 처리를 상위 메소드로 넘기는 키워드, caller에 exception handling을 넘김, 여러 인터페이스를 상속할 수 있다. 메소드 선언부에서만 사용됨
Byte Stream과 Character Stream의 차이
- stream은 소스 데이터와 프로그램 간의 데이터 교환 관련 통로
- byte stream - reading/writing of any bytes, raw data
- InputStream/OuputStream
- character stream - reading/writing of characters , text , reader / writer class , 2byte for unicode
try-catch-finally block에서의 system.exit() 메소드의 호출에 따른 차이는?
- System.exit() 소프트웨어적으로 강제적으로 프로세스를 종료하는 함수
- finally는 error 조건에 따라 영향을 받진 않는다 → 프로세스가 살아있는 한 반드시 실행된다.
- System.exit() 메소드 호출 후 finally가 호출된다면 → 프로세스가 죽었기에 finally block은 실행되지 않는다.
ArrayList와 LinkedList의 차이
- List는 원소들의 순서를 보장하는 인터페이스
- Vector와 ArrayList의 차이?
- vector는 원소가 다 찬 경우 2배로 사이즈를 크기를 키움. 스레드 동기화 지원
- ArrayList는 원소가 다 찬 경우 50%로 사이즈를 키움, 스레드 동기화를 지원하지 않음 → vector 보다 속도가 빠름
- ArrayList와 LinkedList 차이?
- ArrayList : 차례대로 원소가 배열되어있음, 조회에는 속도가 좋고(인덱스로 접근 가능) 삭제 or 추가에 속도가 느리다 (재배치가 이루어져야 하므로).
- LinkedList : 삽입이나 삭제는 속도가 빠름, 조회는 느림
Enumeration과 Iterator의 차이
- enumeration은 원본의 복제본을 만들고 순차적으로 접근함 (멀티 스레드 환경에서 데이터 불일치가 발생할 수 있음), 초기 몇몇 데이터 구조만 지원 (Vector, HashTable)
- interator는 직접 원본 데이터에 접근하므로 데이터 불일치는 발생할 수 없음 (예외 발생시킴), 원본 데이터를 직접 다루기 때문에 remove() 메소드를 지원함. 모든 데이터 구조를 지원함
maker interface
- 필드나 메소드가 없는 순수한 인터페이스 태그 인터페이스라고도 한다.
- 컴파일러나 JVM에게 특정한 행동을 하도록 알리기 위한 인터페이스
- Serializable - 해당 인터페이스를 구현한 클래스의 객체는, 컴파일러는 나중에 Stream에 의해 객체 직렬화될 수 있도록 준비함.
- 어노테이션으로 대체할 수 있음 (junit @Test)
Thread의 생성 방법
- Thread는 start() 메소드를 호출해야 실행됨.
- 멀티 스레드 지원
- 리소스를 공유할 수 있음 (heap) → dead lock 발생할 수 있음
- Thread Class를 상속받아 새로운 Thread 를 만들고, run() 메소드를 오버 라이딩
- Runnable 인터페이스를 구현, Runnable의 run() 메소드를 구현한 뒤, 별도의 스레드의 생성자로 넘겨 start() 메소드를 통해 실행
Deadlock이란?
- 멀티스레드 환경에서 발생, 서로의 리소스를 요청하며 대기 중인 상태
- 방지법
- 1개의 상의 lock을 방지
- 중첩된 lock 사용 지향
- lock의 순서를 동일하게 구성
- 멀티스레드가 필요 없다면 싱글 스레드 지양
main메소드의 static 키워드를 지운다면?
- main() 메소드는 프로그램의 진입점
- public static void main(String[] args)로 정형화됨
- public - access from anywhere
- static - loaded first in memory
- void - return type
- main - method name
- String[] args - command line parameters in runtime
- static 키워드가 없다면 jvm 이 프로그램을 실행하지 못함
- 키워드의 순서가 바뀌는 경우? → 상관없이 실행됨
- main() 메소드에 final이 붙은 경우? → 상관없음. main() 메소드를 상속받아 구현하는 경우는 없기에.
PrepareStatement가 Statement 보다 선호되는 이유는?
- preparestatement는 statement의 sub inteface, run time 시 파라미터를 sql 쿼리에 넘기는 방식
- 특정 쿼리를 자주 호출하는 경우 → 이미 쿼리가 작성되어있고 파라미터만 넘기니 효율이 좋음
- sql 인젝션에도 안전 (이미 작성된 sql에 파라미터만 넘겨서 사용하므로)
JDBC
- database에 쿼리를 실행할 수 있는 java 표준 api
- 데이터베이스에 이미지를 저장하는 방법?
- disc 방법 : 디스크에 이미지 파일을 저장하고, 파일 경로를 db에 저장
- 큰 데이터 크기의 이미지 저장에 적합
- 여러 데이터베이스 간의 데이터 공유 가능
- database 방법 : 실제 데이터베이스에 이미지를 저장하는 방법. 이미지 사이즈가 작은 경우 적합. blob 타입으로 저장
- disc 방법 : 디스크에 이미지 파일을 저장하고, 파일 경로를 db에 저장
[레퍼런스]
반응형
'Programming > Java' 카테고리의 다른 글
[Java] Enum 은 == 비교 아니면 equals() ? (2) | 2022.04.25 |
---|---|
[백 투 더 베이직] 객체지향 SOLID 원칙 (0) | 2021.07.19 |
[삽질일기] Arrays.asList 와 ArrayList의 차이 (1) | 2021.07.17 |
[Java8] 함수형 인터페이스와 람다 표현식 (0) | 2021.06.26 |
객체, 클래스 그리고 인스턴스 (0) | 2021.06.15 |