백앤드 기술면접 - JAVA & Spring [1]
🔥 Java의 특징
- 자바는 객체지향 프로그래밍 언어이다.
- JVM(자바가상머신) 위에서 동작하기 때문에 운영체제에 독립적이다.
- 가비지컬렉터를 통한 자동적인 메모리 관리가 가능하다.
- 동적로딩을 지원함으로서 프로그램 실행 시 모든 클래스가 로딩되지 않고 필요한 시점에 필요한 클래스만 로딩하여 사용할 수 있다.
🔥 객체지향 프로그래밍(OOP) 특징
* 추상화 (Abstract)
- 공통된 특징만 뽑아서 틀을 제작하는 것이다.
- 불필요한 정보는 숨기고 중요한 정보만을 표현하여 프로그램을 간단히 만드는 것이다.
- 예시) 자동차의 공통적인 부분인 엔진, 브레이크, 연료 등에 대한 기능을 뽑아내는 것이다.
- 코드 상에서 구현(로직)부분은 제외한 오직 선언 부분만을 설계하는것이다.
* 캡슐화 (Encapsulation)
- 객체가 내부적으로 기능이 어느 방식으로 구현되어 있는지를 감추는 것이다. (정보은닉)
- 접근제어를 통해서 자료형의 정보를 은닉할 수 있다.
- 내부의 로직이나 변수들은 감추고 외부에는 기능만을 제공하는것을 의미한다.
- 외부에는 공개된 메소드의 인터페이스를 통해 접근할 수 있다.
* 상속성 (Inheritance)
- 특정 클래스가 가진 속성, 동작을 다른 클래스에서 그대로 사용할 수 있다.
- 이미 작성된 코드를 상속받음으로서 코드를 재사용하거나 재정의한다. (재사용 + 확장)
* 다형성 (Polymorphism)
- 사전적 의미 '다양한 형태로 나타날 수 있는 능력'을 의미한다.
- 같은 메서드를 호출하더라도 객체에 따라 다르게 동작하는것을 의미한다.
- 하나의 이름으로 많은 상황에 대처하는 기법이기 때문에 코드가 간단해지는 효과가 있다.
🔥 객체지향 프로그래밍의 장점
- 신뢰성 있는 소프트웨어를 쉽게 작성할 수 있다.
- 코드를 재사용하기 쉽다.
- 유지보수가 용이하다.
- 직관적인 코드 분석이 가능하다.
- 소프트웨어 생산성이 향상된다.
🔥 Java의 메모리 영역
① Static 메모리 영역
필드 부분에서 선언된 변수(멤버변수), Static붙은 멤버변수 저장된다.
프로그램의 시작부터 종료가 될 떄까지 메모리에 남아있는다.
② Stack 메모리 영역
메소드내에서 정의하는 지역변수가 저장된다.
메소드가 호출될때 메모리가 할당되고 종료하면 메모리를 회수한다. LIFO(Last In First Out)
③ Heap 메모리 영역
참조형 데이터 타입을 갖는 객체, 배열등이 Heap에 저장이 된다.
이때 실제 데이터 값들은 Stack에 있으며 Heap영역에 있는 객체나 배열 안에는 Stack의 주소값을 가지고있다.
🔥 스택과 큐
① 스택(Stack) - 쌓아 올린다는 뜻으로 데이터를 밑에서부터 하나씩 차곡 차곡 메모리에 쌓는 방식이다. 그래서 다시 꺼내서 사용하려면 맨 위에서부터 차례대로 꺼내어 사용 해야 한다. 이런 방식을 LIFO(후입선출)라고 하며 top으로만 삽입 및 삭제가 가능하다.
② 큐 (Queue) - 줄을 서서 기다리는 것을 의미하는데 먼저 들어간 데이터가 먼저 나가는 형식이다. 이런 방식을 FIFO 라고 하며 Stack 과는 다르게 한쪽에서는 삽입 작업을 하며 다른 한쪽에서는 삭제 작업이 가능하다.
🔥 오버로딩과 오버라이딩 차이점
- 오버로딩 : 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드 마다 다른 용도로 사용되는것이다.
조건) 메개변수의 개수나 데이터 타입이 달라야 한다.
- 오버라이딩 : 상위클래스에서 만들어진 메서드를 하위 클래스가 자유롭게 재창조해서 사용하는것이다.
🔥 추상클래스와 인터페이스
- 추상클래스 : 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다.
여러 클래스들의 공통으로 사용 해야 할 기능들을 묶어 놓은 클래스이다. 사용을 하기 위해서는 상속을 받아야 하며 자바에서는 하나의 클래스만 상속을 받을 수 있다. 어떤 클래스가 추상클래스를 상속 받았을 경우 abstract가 붙은 메소드는 반드시 구현을 해줘야 한다. 그 외의 선언되어 있는 메소드들은 추상클래스 안에 서 구현이 가능하고 상속 받은 클래스에서 재정의가 가능하다. 인터페이스와는 다르게 멤버 변수를 선언 하게 되면 값을 바꿔서 사용이 가능하다.
- 인터페이스 : 모든 메소드가 추상 메서드로만 이루어져 있는 것을 말한다.
구현해야 할 메소드들의 명세서와 같다. 인터페이스 안의 메소드들은 구현이 되어 있으면 안된다. 그래서 인터페이스로 객체를 생성할 수 없으며 Implements를 받은 클래스들은 반드시 인터페이스에 있는 메소드들을 구현 해야 된다. 하지만 자바 8버전 이상에서는 default, static을 사용하여 인터페이스 내부에서도 구현이 가능하게 되었다. Default를 받은 메소드는 반드시 사용을 하지 않아도 되며 재정의도 가능하다. Static 메소드 또한 반드시 사용을 하지 않아도 된다. 하지만 재정의가 불가능하며 객체로 메소드를 호출 할 수 없다. (클래스명.static 메소드 명으로 호출 가능)
- 추상클래스와 인터페이스의 차이점 : 추상클래스는 다중상속이 불가능하지만, 인터페이스는 다중상속이 가능하다.
🔥 가비지 컬렉션
필요 없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법이다.
가비지 컬렉션이란 메모리 관리 기법중 하나로 동적으로 할당 했던 메모리 영역중에 주소값을 가지고 있지 않는 메모리들을 자동으로 회수해 주는 것이다.
🔥 String과 StringBuffer의 차이
① String으로 생성 된 객체들은 처음에 주어진 글자의 크기 만큼 메모리가 할당 되며 고정되어 있다.
즉 해당 객체에 +연산을 하게 되면 메모리 공간은 고정되어 있어 객체 안에 있는 문자열에 더한 후 메모리에 저장하는 것이 아니고 새로 메모리를 할당하여 연산 된 결과를 넣어준다.
② StringBuffer는 String과 다른게 가변의 메모리 공간을 가지고 있다.
그래서 문자열 연산을 하였을때 추가적으로 객체를 생성하는 것이 아니라 해당 객체의 메모리 할당공간을 늘리고 값을 저장하게 된다.
이러한 점에서 String보다 메모리를 더 효율적으로 관리를 할 수 있다는 장점이 있다.
🔥 쓰레드(thread)란?
스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한개 이상의 스레드가 존재하여 작업을 수행한다.
또한 두개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.