<Interview> 1. JAVA 정리
by BFine0. 프로그래밍
프로그램은 원하는 결과물을 얻기 위해서 컴퓨터에 명령하는 명령어들의 집합이다.
여기서 프로그래밍 언어는 이 명령어를 표현하는 도구이다.
이 언어를 가지고 주변장치(하드웨어)간의 상호작용(순서 등)을 생각하면서 명령어를 표현하는 것이 프로그래밍이다.
명령은 CPU에 의해 실행되어야 결과가 나타난다.
이 명령을 CPU가 실행하기 위해서는 메인메모리에 적재되어 있어야한다.
-
명령들은 주기억장치에 적제되기 전에는 하드디스크에 파일형태로 저장된다.(프로그램)
가. 컴파일
- 고급언어를 이용하여 코드를 기계어로 바꾸는 과정을 의미한다.
- JIT(just-in-time) 컴파일러는 인터프리터로 번역한 코드를 기억하여 이후에 변화한 부분만 번역한다.
1. JAVA 특징
플랫폼에 독립적이다.(JVM이 운영체제 위에서 동작)
객체지향프로그래밍 언어이다.
멀티스레드를 지원한다.
메모리 자동괸리(가비지 컬렉터)를 지원한다.
-
동적로딩 지원(객체가 필요한 시점에 로딩되어 생성됨)
가. 인터프리터 & 컴파일러 언어
- 인터프리터는 문장단위로 해석하고 바로 실행하는 언어 (동시에)
- 실행속도 느림(번역은 빠름) / 가벼움 / 코딩 & 수정이 용이함
- 컴파일러는 전체를 해석해 목적코드로 만든 후에 실행
- 한번에 실행하기 때문에 속도가 빠름 / 메모리 효율 떨어짐
나. 자바 구동(JVM)
- 소스코드(.java) ->
컴파일러
-> 바이트코드(.class) ->인터프리터
-> 실행 (속도는 느림) - 바로 목적코드를 만들지 않고 바이트코드를 만들어 실행되는 플랫폼을 맞춰 인터프리터로 해독(이식성)
- 위의 과정을 담당 하는 것이 JVM이다.
- 인터프리터는 문장단위로 해석하고 바로 실행하는 언어 (동시에)
2. 객체지향프로그래밍이란?
데이터들을 추상화 시켜서 상태와 행위를 가진 객체로 만들고 이들의 상호작용을 통해서 로직을 구현하는 프로그래밍 방법을 의미한다.
장점 : 코드 재사용성, 유지보수 / 단점 : 처리속도 느림,
-
키워드 : 클래스&객체 ,캡슐화, 추상화, 상속, 다형성
가. 클래스 & 객체
- 클래스는 속성과 행위를 정의한 설계도이다.(메서드, 변수)
- 객체는 클래스를 통해 만들어진 것으로 메모리에 할당된 실제 사용되는 데이터이다.
나. 캡슐화
- Modifier를 이용해 데이터를 보호하고 감추는 작업을 말한다.
다. 추상화
- 어떤 것들에서 공통적인 특성, 기능 등을 추출하는 것이다.
라. 상속
- 부모클래스에 메서드와 변수를 상속받아 사용하는 것을 의미한다.
마. 다형성
- 하나의 인터페이스,클래스가 다양하게 해석될 수 있는 것을 의미한다.
- 동일한 타입으로 다양한 결과가 나오는 성질을 의미한다.
- 업캐스팅, 다운캐스팅
3. 오버로딩 vs 오버라이딩
- 오버로딩은 메서드의 이름은 같지만 매개변수의 개수나 반환형을 달리주어 하나의 이름으로 여러개를 쓰는 것을 의미한다. (반환값 X)
- 오버라이딩은 상속받은 메서드를 재정의 해서 사용하는 것을 의미한다.
4. Getter & Setter
- 객체 외부에서 직접적인 접근을 막기 위해 사용한다. (OOP의 정보은닉)
- 검증을 통해 유효한 값만 데이터로 저장한다.
5. 어노테이션
- 어노테이션은 자바에서는 주로 메타데이터 기능, 스프링에서는 주로 설정관련 코드를 자동생성, 문법에러체크 등 기능을 한다.
- 메타데이터란 컴파일 과정과 실행과정에서 코드를 어떻게 컴파일하고 처리할지 알려주는 것이다.(설명해주는 데이터)
@interface
를 붙여서 정의 한다.
6. 변수
- 선언 위치에 따라서 클래스, 인스턴스, 지역 변수로 나뉜다.
- 클래스변수 : static 키워드를 붙여서 선언한 변수를 전역변수라고도 한다.
- 인스턴스변수 : 클래스 내부에 생성한 변수를 인스턴스 변수라고 한다.
- 지역변수 : 블록 안에 선언 되었을 경우
- new 연산자를 통해 만들어진 객체는 heap 영역에 저장되고 주소를 반환한다. NOTE : main을 가진 클래스(실행클래스)가 제일 먼저 메모리에 할당되고 로드되어 실행된다. 나머지는 멤버클래스
7. 예외처리
컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 오류가 발생하는 것을 에러라고 한다.
에러는 JVM 실행에 문제가 생긴 오류로 개발자가 코드 상으로 해결 할 수 없다.
예외는 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 발생하는 프로그램 오류를 말한다.
-
예외나 에러나 발생하면 프로그램이 종료된다.
가. Checked Exception
- 자바 소스를 컴파일하는 과정에서 예외처리 코드가 있는지 판단하는 예외
나. Runtime Exception
- 컴파일 하는 과정에서 예외처리 코드가 있는지 검사하지 안는 에외
Nullpointer
,ArrayIndexOutofBounds
,NumberFormat
등- 발생시 프로그램이 종료되는 것을 막기위해 예외처리 코드가 반드시 필요하다.(try-catch, throws)
throws
는 호출한 메서드로 예외를 떠넘기는 것을 의미한다. Exception 핸들러로 공통으로 처리 할수도 있다.
8. JVM 메모리구조
클래스영역, 스택영역, 힙 영역 크게 3가지로 나눌 수 있다.
-
JVM이 .class 파일을 읽어 이 클래스에 대한 정보(클래스변수 등)를 저장하는 공간이다.
가. 클래스영역
나. 스택영역
- 각 스레드마다 하나씩 존재하는 영역이다. 메서드가 호출되면 메모리가 할당된다. (다른 스레드의 Stack 영역에 접근 불가능)
- 메서드가 작업을 수행하는 동안 지역변수나 매개변수, 중간결과 값들이 이곳에 저장된다.
- 기본타입의 변수들의 실제값이 저장되고 참조타입의 변수들의 주소값이 할당된다.
다. 힙영역
- 사용자에 의해 동적으로 할당되는 영역이다. 스레드와 상관없이 하나만 존제하는 영역(다른 스레드 접근 가능)
- new 연산자를 사용하여 생성된 객체, 배열, 참조타입 변수들의 값이 저장(긴 라이프사이클을 가지는 데이터들이 저장)
9. 가비지 컬렉터
개발자가 메모리 할당을 해제(free())하지 않아도 자동으로 처리해주는 기능이다.
Stack 영역에서 Heap 영역에 있는 데이터에 접근 할 수 없는 경우 메모리 할당을 처리해준다.
객체가 소멸되기 전에 JVM에서 호출하는 finalize()가 있다. (메모리 누수가 발생하지않게 할당메모리 해제, 100프로실행되지는 않는다.)
Heap의 두가지 영역 young과 old 영역이 존재하며 최초에 young안의 Eden영역에 데이터들이 할당된다.
이때 Eden영역이 가득차면 GC가 일어나고 참조가 되는 데이터들은 survial 영역으로 옮겨진다. 그렇게 old 영역으로 가게된다.
Eden 영역은 비교적 짧게 GC가 일어나고 old 영역은 비교적 적은 GC 주기를 보인다.
-
Mark, Sweep 두가지 과정을 거쳐 메모리를 처리한다.
- Mark는 객체들이 참조가 잘되어있는지 판단하는 과정으로 이때 모든 스레드는 중단된다.
- 이떄 참조가 되어있지 않는 변수들을 처리하는 것이 Sweep 이다.
NOTE: String은 불변타입이기 때문에 연산작업(+“추가”)들어오면 연산결과를 합친 String이 다시 Heap에 할당된다.
10. Inner 클래스
- 클래스 내부에 선언한 클래스를 말하며 중첩클래스로도 불린다. 클래스 파일을 줄이는 용도, 응집도를 위해서 사용한다.(바깥클래스의 인스턴스변수 사용가능)
- 종류로는 인스턴스, 스테틱, 메서드(지역), 익명 총 4가지가 있다.
- 인스턴스 : static 없이 내부에 선언된 class / 외부에서 접근시 상위 클래스의 객체를 만들어서 접근
- 스테틱 : static 키워드로 선언된 class / 외부에서 접근시 상위클래스.클래스로 접근
- 메서드 : 메서드 내부에 선언된 class
- 익명 : 이름없이 선언하는 class / 인터페이스를 파라미터로 구현할 필요가 있는 경우 이름없이 선언하여 그 내부에서 선언하는 것을 의미한다.
11. static
- 객체를 생성하지 않고도 사용할 수 있는 필드와 메서드, 내부 클래스를 생성하는 키워드를 의미한다.
- 객체에 소속되는게 아닌 클래스에 소속되는 멤버가 되므로 클래스 멤버라고도 불리며 클래스가 메모리로 올라갈때 같이 할당된다.
- non-static과 생명주기를 같이하지 않기 때문에 static에서 non-static으로 접근할 수 없다.
- 인스턴스가 생성되지 않았을경우도 있기 떄문에 오류를 통해 참조를 방지한다.
- static 메서드에서는 this를 사용할 수 없다.
12. Iterator
- 컬렉션에 저장된 요소를 순차적으로 읽어 오는 역할을 한다
- 컬렉션의 종류와 상관없이 동일한 방식을 유지할수 있고 참조클래스를 확인할 필요가 없기 때문에 사용한다.
13. 제네릭
- 자바 5버전부터 지원하는 컬렉션의 타입을 확인하는 기능
- 같은 기능이지만 타입에 따라 중복으로 선언해야 되는 문제가 발생한다.
- 코드레벨에서 타입 검사를 하는게 아닌 컴파일 과정에서 하므로 유연&안정의 장점이 있다.
14. String, StringBuilder, StringBuffer 차이
- String은 불변객체기 때문에 수정 작업이 발생할 경우 새로운 객체가 만들어져서 메모리 낭비가 있을 수 있다.
- StringBuilder는 멀티쓰레드 환경에서 동기화를 지원하고 StringBuffer는 지원하지 않는다.
15. 인터페이스
-
제품을 만들때 필요한 기능들의 목록만 나열한 설계서 같은 것이다.
가. 자바8 추가사항
- 디폴트메서드와 static 메서드 선언이 가능해졌다. 디폴트메서드는 객체를 통해 접근하고 static은 바로 접근 가능하다.
- 디폴트메서드가 생긴 것은 인터페이스에 새로운 메서드를 추가할때 필요하지 않은 클래스들에서도 구현을 해야하는 문제점이 줄어든다.
- 또한 모든 구현하는 클래스에서 같은 동작을 하는 것이라면 여러번 구현할 필요가 없다.
16. 리터럴, 상수, 배열
- 리터럴은 변수의 값이 변하지 않는 데이터를 의미한다.(1, 1.0, abc)
- 일반적인 객체는 리터럴이 될 수 없다.(내부값이 변할 수 있으니) 하지만 객체리터럴은 String 같은 불변클래스로 생성된 객체를 의미한다.
- 상수는 값은 한번 저장하면 변경할 수 없는 변수를 의미한다.
- 배열은 여러 변수를 하나로 묶어 물리적으로 연속적인 메모리에 데이터를 저장하는 구조이다.
- 메모리를 식별하기 위해 시작주소부터 얼마나 떨어져 있는지를 나타내는 오프셋을 사용한다.
17. C와 C++과 Java의 차이
- C++은 다중상속을 지원하지만 Java는 지원하지 않는다.(단일상속만 사용)
- Java는 가비지컬렉터가 자동으로 메모리 해제 & JVM위에서 동작한다.
18. JDK와 JRE
- JDK(Java Development Kit)은 자바 개발에 필요한 JVM, 라이브러리 API, 컴파일 등 개발도구가 포함
- JRE(Java Runtime Environment)은 프로그램 실행에 필요한 JVM, 라이브러리 API가 포함
- JDK안에도 JRE가 존재하지만 애플릿 개발할려면 JRE가 필요하다.
19. 변수
- 프로그램은 처리과정에서 데이터를 메모리에 저장한다.
- 이때 변수를 사용하는데 변수는 메모리의 공간을 의미한다.
20. 아스키코드, 유니코드, UTF-8
- 인코딩이란 기계가 이해할 수 있는 언어로 바꾸는 것이다.
- 아스키코드는 영문, 기호, 숫자 등 128개의 문자를 7비트 이진수로 나타낸 표준이다.
- 유니코드는 전세계의 언어를 표현
21. String
- 자바의 경우 문자열 리터럴이 같을 경우 객체를 공유한다. (string constant pool,A==B true)
- new 를 사용하여 선언할 경우는 각각의 문자열 객체를 생성한다. (A==B false)
22. 접근제어자
- 외부객체에서 접근시 변수, 메서드 제한범위를 두는 표현식을 의미한다.
- 외부객체에서 메서드로 호출하기 때문에 내부로직이 어떻게 처리되는지 모르게 된다.
- 권한을 구분, 유효성을 검사할 수 있는 장점이 있다.
- protected는 상속받아 자식클래스가 된경우 접근이 가능하다.(같은패키지는 직접가능)
23. Try-With-Resources
- 자바7부터 추가된 기능으로 try에 괄호를 만들어 그안에 자원을 선언하면 자동으로 try-catch 끝나면 할당을 해제한다.
24. 컬렉션 프레임워크
- 프레임워크는 구체적이고 체계화된 API(프로그래밍 접근방식) 제공한다는 의미이다.
- 컬렉션은 객체들의 집합 or 이들을 담는 컨테이너를 의미한다.
- 자료구조마다 내부기술의 차이를 모르더라도 사용할 수 있게 표준화된 접근방식을 제공하는 것을 컬렉션 프레임워크라 한다.
25. final
- 클래스, 메서드, 변수 등 모든 대상에 사용되어 일반적인 의미로 변경할 수 없는 을 가진다.
- 클래스는 상위클래스가 될 수 없고 메서드는 재정의(오버라이딩)안되며 변수는 변하지 않는 값이 된다.
참고 & 출처
- https://jeong-pro.tistory.com/95
- https://itmining.tistory.com/20
- https://yaboong.github.io/java/2018/05/26/java-memory-management/
- https://codedragon.tistory.com/4814
- https://blog.hanumoka.net/2017/09/16/java-20170916-java8-interface/
- https://namu.wiki/w/JIT
- https://mommoo.tistory.com/14
- 이것이 자바다
- 술술 읽히는 자바의 첫걸음
- 구정은의 한걸음 자바
'공부(2018~2019) - 스킨변경전 > Interview' 카테고리의 다른 글
<Interview> 6. 기타 정리 (0) | 2019.03.25 |
---|---|
<Interview> 5. 운영체제 정리 (0) | 2019.03.06 |
<Interview> 4. 자료구조 정리 (0) | 2019.03.05 |
<Interview> 3. 네트워크 정리 (0) | 2019.03.04 |
<Interview> 2. Spring 정리 (0) | 2019.03.04 |
블로그의 정보
57개월 BackEnd
BFine