# 자바는 무언인가?
자바란 객체지향 프로그래밍 언어로써 가장 중요한 특징은 운영체제에 독립적이라는 것이다.
자바를 실행하기 위한 가상머신인 JVM 이 있기에 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능하다.
# 자바의 메모리 구조
- Class가 JVM 위에서 해석될 수 있는 공간인 Class 영역
- 메소드의 실행에 따라 저장해서 처리하는 공간인 Stack 영역(메소드 호출과 관계되는 지역변수, 매개변수)
- 클래스를 생성하거나 변수를 생성할 때 필요한 공간 Heap 영역
# JVM의 정의와 특징
Java Virtual Machine 의 줄임말이며 Java Byte Code를 OS에 맞게 해석 해주는 역할을 한다.
따라서 자바가상머신(JVM)만 설치하면 컴퓨터의 운영체제에 상관없이 프로그램이 작동한다.
# 자바 언어의 특징
1) 기본 자료형을 제외한 모든 요소들이 객체로 표현 가능하다.
2) Garbage Collector를 통한 자동적인 메모리 관리가 가능하다.
3) 멀티쓰레드를 지원한다.
# 객체지향이란,
실제 세계를 모델링하여 소프트웨어로 개발하는 방법이다.
# 객체지향의 4대 특성 (캡슐화, 상속, 추상화, 다형성)
1) 캡슐화
비슷한 역할을 하는 속성과 메소드들을 하나의 클래스로 모은 것을 캡슐화라고 한다.
캡슐화에 속한 개념으로 정보 은닉이 있는데, 캡슐 내부의 로직이나 변수들을 감추고 외부에 기능만 제공하는 것을 의미한다.
2) 상속
상속이란 클래스를 재사용하는 것이다.
상위 클래스를 하위 클래스에서 상속 받게 되면 상위 클래스의 멤버변수나 메소드를 그대로 물려 받을 수 있다.
상속이 있기 때문에 코드를 재활용할 수 있고 그렇기 때문에 생산성이 높고 유지보수 하기 좋다.
3) 추상화
추상화라는 것은 어떤 실체로부터 공통적인 부분을 한 곳에 모은 것을 의미한다.
객체지향에서의 추상화는 어떤 하위 클래스들에 존재하는 공통적인 속성이나 메소드를 인터페이스로 정의하는 것이다.
예를들어 자동차를 만들때 공통적인 기능으로 엑셀, 브레이크 기능이 있다. 이러한 공통 기능을 추상화 클래스로 정의하고 가솔린 자동차, 전기 자동차, 하이브리드 자동차 만들때 자동차라는 추상화 클래스를 가져와서 만든다.
4) 다형성
다형성이란 같은 모양의 함수가 상황에 따라서 다르게 동작하는 것을 의미한다.
대표적으로 오버로딩과 오버라이딩이 있다.
오버로딩이란 함수의 이름이 같으나 함수의 매개변수 숫자, 타입등을 달리해서 다르게 사용하는 것을 의미하고,
오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 똑같은 이름으로 재정의 하는 것을 의미한다.(덮어씌우기)
이렇게 되면 상위 클래스 타입 변수에 하위 클래스를 담은 상태에서 메소드를 호출하면 상위 클래스의 메소드가 호출되고, 하위 클래스 타입 변수에 하위 클래스를 담으면 하위 클래스의 메소드가 호출된다.
즉, 메소드의 이름은 똑같은데 상황(상위 클래스의 참조 변수냐, 하위 클래스의 참조 변수냐)에 따라 호출 되는 메소드가 다른 것이다.
# 추상화랑 다형성의 차이점
추상화는 클래스들의 공통적인 부분들을 찾아서 재사용이 가능한 클래스를 설계하는것이고
다형성은 공통적인 메소드로 여러가지 기능들을 만들어 낼수 있는것이 다형성이다.
그리고 추상화는 인터페이스와 추상클래스로 구현되는 반면에 다형성은 오버라이딩과 오버로딩으로 구현이 된다.
# OOP(객체 지향 프로그래밍) Object-Oriented Programming 이란?
오브젝트(객체)를 기준으로 코드를 나누어 구현하는 프로그래밍 방법이다.
여러 개의 객체를 레고 블록 쌓듯이 합쳐서 하나의 결과물을 만들어낸다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고 , 그 객체들 간에 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
# OOP의 특징
1) 객체 지향 프로그래밍은 코드의 재사용성이 높다.
2) 코드의 변경이 편하다. (유지보수가 용이하다.)
3) 직관적인 코드 분석이 가능하다.
4) 개발 속도가 향상된다.
5) 상속을 통한 장점이 극대화된다.
# 객체지향과 절차지향의 차이점
절차지향은 순차적으로 실행에 초점이 되어 있고 객체지향은 객체간의 관계/조직에 초점을 두고 있다.
# Primitive type과 Reference type(기본형과 참조형)
기본형(Primitive type)은 Stack 메모리 영역에 실제 값을 저장하는 데이터 타입이며, 변수에 값 자체를 저장하는 것이다. (정수형: byte, short, int, long / 실수형: float, double / 문자형 char / 논리형 boolean)
참조형(Reference type)은 메모리 상에 객체가 있는 위치를 저장하는 것이다.
새로 만들때는 heap 메모리에 저장공간을 확보하며 항상 new로 정의한다. 실제 값은 heap 영역에 저장되고, stack 에는 메모리 주소만 저장된다. (String, 클래스, 인터페이스, Array 등 기본형 이외의 모든 변수는 참조형 변수이다. )
# Object란,
객체란 OOP에서 데이터(변수)와 그 데이터에 관련되는 동작(함수), 즉 절차, 방법, 기능을 모두 포함한 개념이다.
Ex. 기차역에서 승차권을 발매하는 경우, 실체인 ‘손님’과 동작인 ‘승차권 주문’은 하나의 객체이며, ‘역무원’과 동작인 ‘승차권 발매’도 하나의 객체이다.
# 클래스와 인스턴스(객체)는 무엇인가?
클래스: 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것
인스턴스(객체): 클래스에서 정의한 것을 토대로 실제 메모리상에 할당되는 것으로 실제 프로그램에 사용되는 데이터
# 오버로딩(Overloading)과 오버라이딩(Overriding) 의 차이
오버로딩(Overloading)은 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것이다.
매개변수의 타입이 다르거나 개수가 달라야 한다. (리턴 타입과 접근 제어자는 영향을 주지 않는다.)
이름이 같기 떄문에 호출 시에 구분 방법은 매개변수이다. 매개변수의 수, 배치(순서), 타입이 달라야 한다.
오버라이딩(Overriding)은 부모 클래스의 메소드를 하위 클래스에서 재정의 하는 것이다.
부모 클래스에서 상속 받은 것들을 다시 자신의 클래스에서 새로이 재정의 하는 것을 말한다.
재정의 한 것은 자신의 클래스 내부에서만 영향을 끼치며 부모 클래스에서는 영향을 끼치지 않습니다.
# 상속이란,
기존 클래스의 기능을 유지하면서 추가적인 기능을 추가하여 클래스를 만들고 싶을 때 사용하는 방법이다.
새로운 클래스를 생성할 때 상위 클래스를 지정함으로써, 상위 클래스의 모든 기능, 속성을 제공받고 자신의 클래스에는 부가적인 기능, 속성을 추가 할 수 있다.
상속은 코드를 간결화하며, 재사용성을 높일 수 있다.
기존 클래스의 변수와 메소드를 그대로 가지면서 추가적인 기능도 가지는 클래스를 새로 만드는 것이다.
복잡한 문제를 나누어 공통 부분부터 구현하기 위해 사용한다.
변수와 메소드를 그대로 사용함으로 코드중복을 줄일 수 있다.
# Interface 와 Abstract 란
1) Interface (인터페이스)
- 일종의 추상 클래스
- 오직 추상 메소드와 상수만을 멤버로 갖는다.
- Implements 키워드를 사용한다.
- 상속의 관계가 없는 클래스 간 서로 공통되는 로직을 구현하여 쓸 수 있도록 한다.
- Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다.
2) Abstract (추상 클래스)
- 추상 메소드를 하나 이상 가진 클래스
- 자신의 생성자로 객체 생성이 불가능하다.
- 하위 클래스를 참조하여 상위 클래스의 객체를 생성한다.
- 하위 클래스를 제어하기 위해 사용한다.
# Interface와 Abstract 의 공통점, 차이점
1) 공통점
- new 연산자로 인스턴스 생성이 불가능하다.
- 프로토타입만 있는 메소드를 갖는다.
- 사용하기 위해서는 하위클래스에서 확장 또는 구현해야한다.
2) 차이점
- Abstract는 일반 메소드를 구현할 수 있지만, Interface는 메소드 선언만 가능하다.
- Abstract는 다중상속이 불가능하지만, Interface는 여러 개의 인터페이스를 구현할 수 있다.
- 추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고 확장시키는 반면에 인터페이스는 같은 성질, 같은 구조와 동작을 갖기 위해 사용된다.
# Call by Value 와 Call by Reference
- Call by Value(값에 의한 호출): 인자로 받은 값을 복사하여 처리하는 방식이다. 메소드 내의 처리 결과는 메소드 밖의 변수에 영향을 미치지 않는다.
- Call by Reference(참조에 의한 호출): 인자로 받은 값의 주소를 참조하여 값에 영향을 준다.
14. Call by Value 와 Call by Reference 의 장, 단점
1) Call by Value(값에 의한 호출)
- 장점: 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
- 단점: 복사를 하기 때문에 메모리가 사용량이 늘어난다.
2) Call by Reference(참조에 의한 호철)
- 장점: 복사하지 않고 직접 참조를 하기에 빠르다.
- 단점: 직접 참조를 하기에 원래 값이 영향을 받는다.
15. Static의 의미
- 클래스가 로딩 될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미한다.
- 객체를 아무리 많이 만들어도 해당 변수는 하나만 존재한다.
16. Thread란
프로세스 내에서 동시에 실행되는 독립적인 실행 단위를 말한다.
자바 프로그램을 구성하는 명령문은 순서대로 하나씩 처리된다. 이러한 실행흐름을 ‘쓰레드’라고 한다.
둘 이상의 흐름을 갖도록 만들고 싶다면 멀티 쓰레드 프로그램을 사용하면 된다.
17. Thread의 장, 단점
1) 장점
- 빠른 프로세스를 생성한다.
- 적은 메모리로 사용이 가능하다.
- 정보를 쉽게 공유할 수 있다.
2) 단점
- 교착상태에 빠질 수 있다.
(교착상태란 다중 프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행 할 수 없는 어떤 특정 시간을 기다리고 있는 상태)
18. Multi Thread란
하나의 프로그램에서 둘 이상의 작업이 필요로 할 때 사용한다. 자원을 효율적으로 사용가능하며 작업이 분리되어 코드가 간결해 진다.
(Process란, 운영체제에서 실행중인 하나의 프로그램이다.(하나 이상의 쓰레드를 포함))
19. Thread와 Process의 차이점
프로세스는 여러 분야에서 ‘과정’ 또는 ‘처리’라는 뜻으로 사용되는 용어로 컴퓨터 분야에서는 ‘실행중인 프로그램’이라는 뜻으로 쓰인다. 이러한 프로세스 내에서 실행되는 각각의 일을 쓰레드라고 한다.
프로세스 내에서 실행되는 세부 작업 단위로 여러 개의 쓰레드가 하나의 프로세스를 이루게 되는 것이다.
#리스트(List)와 맵(Map), 셋(Set) 특징.
List
- 수집의 순서가 있으며, 동일한 데이터의 중복 입력이 가능하다.
- 순차적으로 대량의 데이터를 엑세스하거나 입력할때 유리한 방식이다.
Map
- Key & Value의 형태로 입력이되며, 키값을 입력하면 해당하는 Value값을 획득한다.
- 수집의 순서를 기억하지 않고, 동일한 데이터를 Key값으로 사용 할 수 없다.(Key는 중복X)
Set
- 중복데이터를 저장할 수 없다.
21. 배열(Array)과 리스트(List)의 차이
배열: 데이터의 크기가 정해져 있고, 추가적인 삽입 삭제가 일어나지 않으며, 인덱스를 활용하여 검색을 할 때 유리하다.
리스트: 데이터의 크기가 정해져 있지 않고, 삽입 삭제가 많이 일어나며, 검색이 적은 경우 유리하다.
(배열에서의 인덱스: 값에 대한 유일무이한 식별자 / 리스트에서의 인덱스: “몇 번째 데이터인가” 정도의 의미를 갖는다.)
*배열이 리스트보다 검색할 때 유리한 이유
배열은 int num[4]라고 선언하고 사용하면, 주솟값 +4byte의 형식으로 메모리가 연속적으로 잡히게 된다.
이에 비하면 리스트는 주소가 연속적이지 않기 때문에 예측을 할 수 없고, 그만큼 소요 시간이 들어가게 된다.
22. ArrayList와 LinkedList의 차이
인덱스를 이용해서 데이터를 가져오는 것이 빈번하다면 내부적으로 배열을 이용하는 ArrayList가 훨씬 빠르다. 하지만 데이터의 추가/삭제가 빈번하다면 LinkedList가 훨씬 효과적이다.
23. 동기식과 비동기식의 차이에 대해 설명
동기식은 어떤 동작이 완전히 끝나고 제어를 반납하는 방식이며, 비동기식은 동작이 끝나지 않아도 일단 제어권을 반납하고 할 일을 계속 하는 방식이다.
Ex. 이메일을 보내는 상황을 예를 들어보겠습니다.
한명에게 메일을 보내는 시간을 1초라고 한다고 할 때 동기식의 경우는 발행을 누르면 1초당 한명씩 보내게 되어 10000초동안 기다려야 합니다. 반면에 비동기식의 경우 발행을 누르면 이메일을 보내는 시스템에게 이메일을 10000만명한테 보내라고 위임하는 것으로, 시스템이 일을 처리하는 동안에 전송완료의 메시지를 받고 백그라운드에서 메일을 보내는 것이다.
[출처]
kim-hoya.tistory.com/37
simsimjae.tistory.com/293
https://changun516.tistory.com/9
https://kim-hoya.tistory.com/38?category=806896
sites.google.com/site/kingcallkorea/web/gyoyugq-a/javagibonmemoligujo
jeong-pro.tistory.com/95
'개발자 취준생 면접 공부 후기' 카테고리의 다른 글
면접 질문 모음 (0) | 2021.01.18 |
---|---|
알고리즘 기술 면접 (0) | 2021.01.08 |
웹 기술 면접 (0) | 2021.01.06 |