자바의 탄생
자바 전에는 OS에 따라 코드를 다르게 작성해야했다.
하지만 자바는 OS에 독립적이기 때문에 자바로 작성된 프로그램은 OS에 관계없이 실행이 가능해졌다. 우리의 소스 코드들이 잘 돌아가도록 각 OS 위, 우리 코드 밑에 있는 게 JVM(Java Virtual Machin)이다. 즉 우리의 소스 코드들은 JVM에서 돌아간다.
또한 자바는 풍부한 라이브러리를 통해 프로그래밍에 필여한 요소들을 기본적으로 제공하기 때문에 라이브러리만 잘 활용해도 강력한 기능의 자바 프로그램 작성 가능.
자바 애플리케이션 실행 과정
1.
자바 프로그래밍 언어로 소스 코드(.java)를 작성한다.
2.
소스 코드를 컴파일하여 바이트 코드(.class)를 생성한다.
a.
우리가 작성한 소스 코드를 자바 컴파일러가 자바 가상 머신이 해석 가능한 바이트 코드로 컴파일하는데, 이렇게 컴파일된 바이트 코드 파일들은 .class 확장자가 붙은 파일들이다.
b.
여기서 중요한 점은 바이트 코드들은 0,1이 아니다 JVM에서 실행할 수 있는 코드를 말한다.
3.
JVM에서는 Class Loader가 바이트 코드들을 불러와서 메모리에 올려놓고 링크하고 초기화한다.
4.
실행 엔진에서 이것들을 실행시킨다.
클래스 로더란
클래스간의 상호작용이 일어날 때 이 클래스들은 존재하는 위치(패키지)가 다르다. 심지어 라이브러리를 사용하는 경우 패키지 형태가 아닌 아카이브 파일을 사용하게 되는데,
이런 경우 각 패키지의 경로를 지정할 수도 없다. 따라서 누군가는 이런 경로에 대한 정보를 모두 가지고 있어야 하며, 클래스들의 의존관계에 따라 클래스들의 정보를 순서에 맞게 올려야 한다, 이를 클래스 로더가 한다.
동적 로딩
보통 C와 같은 프로그램은 프로그램을 실행할 때, 포함된 모든 코드를 메모리에 다 로드한다. 이를 정적 로딩이라고 한다.
반면 자바의 경우 static이 아닌 한 클래스를 포르그램 실행시에 로드하는 것이 아닌, 호출되어 정보가 필요한 시w점에 로드한다. 이를 동적 로딩이라고 한다.
자바 메모리 구조
•
스레드 별: PC Register, JVM Stack, Native Method Statck
◦
PC Register: 실행 중인 명령어 주소가 저장되어 있다.
◦
JVM Stack: 호출된 함수 정보들이 저장되어 있다.(매개변수, 지역변수, 리턴 정보 등)
◦
Native Method Stack: 자바에는 자바 언어로만 되어있지 않는데, 그러한 네이티브 메서드(C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드) 정보들이 저장되어있다.
▪
네이티브 코드는 컴퓨터 기계어로 동작하는 즉, OS에 직접적으로 컴파일 되는 코드를 의미)
•
공통: Method Area, Heap
◦
Heap: 사용자가 사용하면서 생성된 데이터 즉 객체(동적으로 할당된 데이터)가 저장되는 공간이다, 모든 객체와 배열이 저장되는 영역
◦
Method Area: 클래스 별로 전역변수, 정적변수, 메소드들이 있을텐데 그 데이터들이 저장되는 공간이다.
자바 메모리 구조
스레드별
pc register: 실행중인 명령어 주소가 저장되어있다.
JVM Stack: 호출된 메소드의 정보들이 들어가있다.
Native Method Stack: java 이외의 언어들의 메소드 정보들이 저장되어있다.
공통
Heap: 사용자가 사용하면서 생성된 데이터 즉 객체가 저장되는 공간
Method Area: 클래스 별로 변수, 메소드들이 있는데 그 데이터들이 저장되는 공간이다.
가비지 컬렉션
예전에는 개발자가 메모리 관리를 해주었지만 자바에서는
JVM에서 메모리 관리를 해주는 모듈, 가비지 컬렉션이 그 역할을 해준다.
동작 원리는 메모리가 차면 실행 중인 것을 잠깐 멈추고 각 데이터를 어디서 참조하는지 파악한 후
참조 되지 않는 데이터는 삭제한다.
이것을 Mark And Sweep 이라고 한다.
Heap 메모리를 재사용하기 위해서 더 이상 참조되지 않는 객테들을 메모리에서 제거하는 모듈이며,
개발자가 메모리 관리를 하지 않아서 개발 속도가 향상되는 장점이 있지만 Mark and Sweep 과정에서 참조되지 않는 객체를 찾는 과정이 있는데 이때 잠시 스레드를 중지시키기 때문에 성능이 떨어진다는 단점이 있다.
객체지향 프로그래밍(oop)
현실 세계의 사물같은 객체를 만들고, 객체에서 필요한 특징(상태, 행위)을 뽑아 프로그래밍 수행
1.
추상화: 여러 사물들에서 공통되는 특징을 뽑아 하나의 개념으로 만드는 것
2.
캡슐화: 정보 은닉을 하면서 내부적으로 응집도는 향상시키고 외부적으로 결합도는 낮추는 것
a.
getter, setter를 사용하는 이유
i.
메서드를 통해 접근하기 때문에 올바르지 않은 입력같은 것들을 사전에 처리할 수 있게 제한하거나 조절할 수 있다.
3.
상속성: A라는 사물에 1,2의 특징을 가지고 있고, B라는 사물에 1,2,3 특징을 가지고 있을 경우 B에서 A를 가져와서 1, 2 특징을 사용하는 것
4.
다형성: 하나의 함수 명 같은 것을 상황에 따라 다른 의미로 다르게 동작하도록 하는것(오버라이딩, 오버로딩)(추가적으로 더 작성)
•
장점’ㅡ
◦
남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있어 코드 재사용에 용이하다.
◦
수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다는 유지보수가 쉬움
◦
클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트에 적합
•
단점
◦
처리 속도가 상대적으로 느림
◦
객체가 많으면 용량이 커질 수 있음
◦
설계시 많은 시간과 노력이 필요
추상 클래스 VS 인터페이스
•
추상 클래스: abstract 지시자로 정의되며, 추상메소드가 하나 이상 포함
•
인터페이스: interface 지시자로 정의되며, 모든 메소드가 추상메서드로 정의(자바 8이상에서는 구현도 가능)
두 개의 차이는 사용 목적에 있다.
추상 클래스는 부모 클래스를 상속받아 재정의하고 확장시키기 위해서 사용하는 반면
인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는것을 보장하는 것에 그 목적이 있다.
OOP 설계 원칙 5가지
•
단일 책임의 원칙: 하나의 클래스는 하나의 책임을 가지는것을 말합니다. 예를 들어 A라는 로직이 있다면 A를 책임지는 클래스가 있을 것이고 만약 그 클래스가 수정된다면 A에 관해 수정해야한다는 특징이 단일 책임의 원칙입니다.
•
개방 폐쇄의 원칙: 확장은 열려있고 수정은 닫혀있다는 의미로 기존의 코드는 변경하지 않고 확장은 쉽게 할 수 있다는 특징입니다.
•
리스코프 치환 원칙: 객체의 정확성을 깨트리지 않는다는 점에서 하위 타입의 인스턴스로 바꿀 수 있어야한다는 의미로 상속의 경우 부모 객체에 자식 객체를 넣어도 문제없이 잘 돌아간다는 특징입니다.
•
인스턴스 분리 원칙: 일반적인 하나의 인터페이스보다는 구체적인 인터페이스 분리가 더 좋다는 특징입니다. 예를 들어 운전자가 자동차를 운전한다라는 명제가 있다면 자동차에 관한 인터페이스, 운전자에 대한 인터페이스를 각각 분리하는 것입니다.
•
의존관계 역전 원칙: 변경이 잦은 거에 의존하지 않는다는 의미로 프로그래머는 구체화가 아닌 추상화에 의존함으로써 변경에 영향을 덜 받기 위한 원칙입니다.
추가
1. JVM 구조와 Java의 실행 방식
•
JVM 구조로는 클래스 로더, 런타임 메모리 영역, 실행 엔진이 있습니다
•
자바 코드를 작성하면(.java) 자바 컴파일러가 컴파일하여 JVM이 이해할 수 있는 바이트 코드 파일을 생성합니다.(.class)
•
JVM의 class loader가 바이트 코드를 가져와 메모리에 적재시키면
•
실행 엔진이 실행합니다.
2. GC가 무엇인지, Why?, 동작 방식
•
GC는 가비지 컬렉션의 약자이며
•
기존에는 개발자가 메모리 관리를 했다면 자바에서는 가비지 컬렉션이 메모리 관리를 해줍니다.
•
이로 인해 개발 생산력이 향상된다는 장점이 있습니다.
•
동작 방식은 만약 메모리가 다 꽉찼다면 잠시 실행을 멈추고 데이터들을 참조하는 곳을 파악한 후 참조되지 않은 데이터는 삭제해줍니다 이 과정을 mark and sweep 이라 부릅니다.
3. 컬렉션 프레임워크란
•
컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합니다.
•
즉 자료구조와 알고리즘을 구조화하여 클래스로 구현해 것입니다.
•
주요 인터페이스로는 List, Set, Map이 있습니다.
4. 애노테이션이란
•
애노테이션은 인터페이스를 기반으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있습니다. 대표적으로 오버라이드가 있습니다.
•
메타 애노테이션으로는 유지범위 애노테이션인 @Ratention, 상속 관련 애노테이션인 @Inherit, 어디에 사용할 지에대한 @Target이 있습니다.
5. 오버로딩과 오버라이딩 차이
•
오버라이딩은 부모 클래스의 메소드를 확장시키는 것이며
•
오버로딩은 같은 이름의 메소드의 매개변수의 자료형, 개수가 다른것을 오버로딩이라고 합니다.
6. 인터페이스와 추상클래스 차이
•
추상클래스는 abstract 지시자를 사용하며, 부모 클래스를 상속받아 기능을 확장하는거에 목적이 있으며
•
인터페이스는 interface의 지시자를 사용하며, 인터페이스를 구현한 객체들이 같은 동작을 보장한다는 것에 목적이 있습니다.
7. 객체란, 클래스란
•
클래스란 객체를 정의한 틀입니다.
•
객체는 클래스에서 정의한 틀대로 메모리에 할당된 것을 말합니다.
•
객체는 행위와 상태에 대해 변경이 가능합니다.
8. 정적이란
•
클래스 멤버로써 클래스 로더가 메모리에 적재할 때
•
클래스 정보를 담는 메소드 영역에 저장되어집니다.
9. 자바 원시 타입
•
정수형으로 byte(1 바이트 / 8비트), short(2 바이트 /16비트), int(4 바이트/32 비트) (-21억 ~ 21억), long(8바이트/64비트) (-10경 ~ 10경)가 있으며
•
실수형으로 float(4바이트/32비트), double(8바이트/64비트)가 있습니다.
•
논리형으로 boolean(1 바이트 /8 비트), 문자 char(2/16)이 있습니다.
10. 접근 제어자
•
전체 영역에서 접근 가능한 public
•
같은 패키지 내에서 접근 가능한 default
•
상속 받은 클래스 내에서 접근 가능한 protected
•
클래스 내에서만 접근 가능한 private
11. 객체 지향
•
현실세계의 사물들의 행위나 상태를 추출하여 프로그래밍화 한것
12. SOLID 원칙이란
13. 동일성과 동등성이란
•
동등성은 ==으로 판별하며 두 개의 객체과 완전히 같은 주소값을 가지는지를 판별
•
동일성은 .equals로 판별하며 두 개의 객체가 같은 값을 가지는지를 판별
•
앞서 말한 hash 값을 사용하는 Collection(HashMap, HashSet, HashTable)은 객체가 논리적으로 같은지 비교할 때 아래 그림과 같은 과정을 거친다.
hashCode 메서드의 리턴 값이 우선 일치하고 equals 메서드의 리턴 값이 true여야 논리적으로 같은 객체라고 판단한다.
앞서 봤던 main 메서드의 HashSet에 Car 객체를 추가할 때도 위와 같은 과정으로 중복 여부를 판단하고 HashSet에 추가됐다. 다만 Car 클래스에는 hashCode 메서드가 재정의 되어있지 않아서 Object 클래스의 hashCode 메서드가 사용되었다.
Object 클래스의 hashCode 메서드는 객체의 고유한 주소 값을 int 값으로 변환하기 때문에 객체마다 다른 값을 리턴한다. 두 개의 Car 객체는 equals로 비교도 하기 전에 서로 다른 hashCode 메서드의 리턴 값으로 인해 다른 객체로 판단된 것이다.
14. 원시타입과 참조타입 차이
•
자바 원시타입은 실제 데이터를 스택에 저장하는 것이며
•
참조타입은 원시타입을 제외한 타입으로 스택에 객체의 주소를 저장하는 타입입니다.
•
셀제 데이터는 힙 영역에 저장되어집니다.
15. String, StringBuilder, StringBuffer 차이
•
String은 불변 객체이며, StringBuilder와 StringBuffer는 가변 객체입니다.
•
StringBuider와 StringBuffer의 차이점은 Thread-safe한가 즉 동기화를 지원하는가에 대해 차이점이 있는데요
•
StringBuilder는 Thread-safe하지 않고 StringBuffer는 동기화를 지원하여 Thread-safe합니다.
16. checked Exception과 unchecked Exception 차이
•
자바에 예외로 checked Exception과 uncheked Exception 이 있습니다
•
두 예외의 차이로는 이름 그대로 처리를 해주어야하는 예외와 처리하지 않아도 된다는 차이가 있습니다.
•
checked Exception은 Exception을 상속받아 예외를 반드시 처리 해주어야 하며,
•
unchecked Exception은 RuntimeException을 상속받아 예외를 처리 해주지 않아도 됩니다.
•
또 둘의 차이점으로는 spring에서 checked Exception은 롤백 처리를 하지 않고
•
unchecked Exception은 롤백 처리를 해준다는 특징이 있습니다.
•
그래서 디비 접근 시 트랜잭션 설정해줄때 rollbackfor = Exception.class를 해주어야합니다.
17. 스프링 트랜잭션 추상화에서 rollback 대상은?
•
unchecked Exception으로 RuntimeException 하위 클래스들
18. Java 8에 추가된 기능
•
람다식, stream, optional을 지원합니다.
•
람다식은 익명 함수의 일종으로 함수를 하나의 식으로 표현을 가능케 해주고
•
stream API는 데이터를 추상화하여 처리해주고
•
optional은 null safe하게 해줍니다.
19. try-with-resource에 대해
•
기존에 자원들을 사용할 때 close()를 하지 않으면 문제들이 발생했습니다.
•
그로인해 개발자는 코드로 자원이 널이 아닌지 체크 후 자원을 반납해야하는 반복적인 코드를 작성해야 했습니다.
•
하지만 try-with-resource를 사용하여 try()안에 반납할 자원을 명시해주면은 JVM에서 자동적으로 AutoCloseable 구현 객체 자원을 반납해줍니다.
20. 강한 결합과 느슨한 결합이란
•
결합도는 의존성 정도를 말하며, 다른 모듈에 대해 얼마나 많은 정보를 알고 있는지의 척도입니다.
•
어떤 모듈의 내부 구현의 자세한 부분까지도 알고 있을 경우 강한 결합도를 가지게 되고
•
어떤 모듈을 사용할 때 필요한 부분만 알고 있을 경우 느슨한 결합도를 가지게 됩니다.
21. 직렬화 역직렬화
•
자바 시스템 내부객체 또는 데이터를 외부의 자바시스템에서도 사용할 수 있도록 바이트코드 형태로 변환하는 기술과 직렬화된 바이트 코드를 다시 객체로 변환해서 JVM으로 상주시키는 형태를 역직렬화라고 합니다.
•
직렬화 시킬 class에다가는 serializable 인터페이스를 상속시켜 사용합니다.
22. 자바의 동시성 이슈
•
여러개의 스레드가 사용됨에 따라 cpu는 메인 메모리에 접근하기 전에 캐시 메모리에 접근합니다.
•
만약 한 데이터를 읽어들어올 때 메인 메모리의 데이터와 캐시 메모리의 데이터가 일치하지 않을 경우
•
가시성 문제가 발생하게 됩니다.
•
이를 해결하고자 volatile 키워드를 붙어주어 바로 RAM을 읽을 수 있도록 해줍니다.
•
하지만 이는 가시성 문제를 해결해주지 같은 공유 자원에 대한 동시성이 보장되지는 않습니다.
•
멀티 스레드 환경에서 한 스레드가 각 기계 명령어를 수행하다가 다른 스레드가 개입하여 공유 자원에 접근하여 같은 기꼐 명령어를 수행할 경우 값이 꼬이게 되는것을 원자성 문제라고 합니다.
•
해결 방안으로 synchronized 키워드를 붙이거나 atomic 키워드를 붙여줍니다.
•
둘다 캐시메모리와 메인메모리간의 동기화를 해줌으로써 원자성 문제와 가시성 문제 둘다 해결해줍니다.
23. Mutable 객체와 Immutable 객체 차이
•
Mutable은 생성된 이후 수정이 가능하고
•
Immutable은 생성된 이후 수정이 불가능합니다.
•
그로 인해 Mutable은 값을 변경할 수 있는 메소드가 제공되지만 Immutable은 제공흘 받지 않습니다. 또한 Mutable은 변경될 수 있는 객체이기 때문에 Tread-safe하지 않고 Immutable 객체는 Tread-safe 합니다.
24. 자바에서 NULL 다루는 법
•
Assertion 키워드가 있으며
•
Java.util.Object의 널 관련 메소드를 사용하면 됩니다.
•
또는 Optional을 이용하여 null -safe하게 만들어줍니다.