[기술면접] java 면접 질문 리스트 답변 포함

HMS·2023년 4월 8일
23

1. 컴파일과정

1-1. compiler vs interpreter

java의 컴파일과정을 설명하세요

컴파일이란 고급언어로 작성된 .java파일을 기계어인 byte code 즉, .class파일로 변환하는 과정을 말합니다.
컴파일 과정
첫번째로 프로그래머가 java언어로 소스코드를 작성합니다.
두번째 javac 컴파일러를 사용해 .java소스 파일을 컴파일하고, 바이트코드로 변환된 .class파일을 생성합니다.
세번째 컴파일된 바이트코드인 .class파일을 클래스로더에 전달합니다.
네번째로 클래스 로더는 동적 로딩을 통해 필요한 클래스를 로딩 및 링크하여 런타임 데이터 영역인 jvm의 메모리에 올립니다.
마지막으로 실행엔진은 jvm 메모리에 올라온 바이트코드들을 인터프리터 방식 혹은 jit 컴파일러 방식으로 실행합니다.

꼬리) compiler vs interpreter 차이를 설명하세요

컴파일러는 전체소스코드를 한번에 기계어로 변환하고 실행파일을 생성하여 나중에 실행할 수 있습니다. 컴파일러의 예로는 c/c++/java등이 있습니다. 컴파일러의 장점은 실행속도가 빠르다는 것이고, 단점은 컴파일 과정에서 시간이 소요된다는 점 입니다.
인터프리터는 프로그램을 실행하는동안에만 소스코드를 한 줄씩 기계어로 변환하고 즉시 실행합니다. 인터프리터의 예로는 Python/ Ruby/ javaScript등이 있습니다. 인터프리터의 장점은 개발과 디버깅이 빠르다는 것이고, 단점은 실행속도가 컴파일러에 비해 느리다는것입니다.

2. String, Stringbuffer, Stringbuilder 차이

2-1. thread safe란?

String, Stringbuffer, Stringbuilder 차이

String은 불변객체(immutable)한 객체입니다. 한번 생성된 객체의 값을 변결할 수 없으며 문자열을 조작할 때 마다 새로운 String객체가 생성되어 메모리를 차지하게 됩니다. 이로인해 연산이 많은 문자열에서는 작업 효율이 떨어질 수 있습니다. 그러나 불변성 덕분에 스레드 세이프하고, String객체를 자유롭게 공유할 수 있어 성능상 이점이 있을 수 있습니다.
StringBuffer은 가변(mutable)객체입니다. 문자열 조작시에 기존 객체의 값을 변경합니다. 멀티 스레드환경에서 동기화를 지원하여 스레드 세이프합니다. 하지만 동기화로 인한 오버헤드가 있어 단일 스레드 환경에서는 성능이 저하될 수 있습니다.
StringBuilder은 가변(mutable)객체입니다. 문자열 조작시에 기존 객체의 값을 변경합니다. 동기화를 지원하지 않아 스레드 세이프하지 않습니다. 하지만 동기화에 따른 오버헤드가 없기 때문에 단일 스레드 환경에서는 더 높은 성능을 제공합니다.

꼬리) thread safe란? / 오버헤드란?

thread safe란 멀티스레드 환경에서 스레드가 동시에 해당 코드나 데이터를 접근하더라도 프로그램의 실행 결과가 올바르게 유지되는것을 의미합니다. 스레드 세이프를 달성하기 위한 방법으로는 동기화 여러스레드가 공유 리소스에 동시에 접근하는것을 제한하고 한번에 하나의 스레드만 해당 리소스를 사용할 수 있도록합니다. 뮤텍스/세마포어 운영체제 수준에서 제공되는 동기화 방법으로, 공유 리소스에 대한 동시접근을 제어하는데 사용됨. 이외에도 원자적연산lock-free구조 등이 있습니다.
오버헤드란 작업을 수행하는데 필요한 추가적인 자원이나 시간을 의미합니다. 오버헤드는 일반적으로 성능저하늬 원인이 되며 특정 작업이나 기능을 실행하는데 필요한 부가적인 처리를 가리킵니다. 동기화시의 오버헤드는 대기시간 동기화 된 블록 또는 메소드에 한번에 하나의 스레드만 접근할 수 있기 때문에 다른 스레드들은 대기상태에 놓이게 되고 실행이 지연됩니다. 컨텍스트 스위칭 스레드가 공유 리소스에 접근할 때 마다 컨텍스트 스위칭이 발생할 수 있습니다.컨텍스트 스위칭은 실행중인 스레드/프로세스의 상태를 저장하고 대기중인 다른 스레드를 불러오는 과정으로 자원사용과 시간소모가 발생합니다.

3. java의 접근제어자의 종류와 특징

3-1. 캡슐화와 은닉화의 차이

java의 접근제어자의 종류와 특징

public으로 선언된 클래스,메소드,변수는 다른 패키지의 모든 클래스에서 접근할 수 있습니다.
protected으로 선언된 변수와 메소드는 같은 패키지 내의 다른 클래스와, 해당 클래스를 상속받은 자식클래스에서도 접근할 수 있습니다. 일반적으로 오버라이드 할 수 있는 메서드나 변수를 선언할 때 사용됩니다.
default 접근 제어자를 명시하지 않는경우로 클래스, 멤버변수 메서드는 같은 패키지 내의 클래스에서만 접근할 수 있습니다.
private으로 선언된 멤버변수와 메서드는 오직 선언된 클래스 내부에서만 접근할 수 있습니다. 객체의 내부 상태를 캡슐화하고 외부로부터 보호할 때 사용됩니다.

꼬리) 캡슐화와 은닉화의 차이

캡슐화는 객체지향 패러다임중 하나로 상태와 행위를 하나의 단위로 묶는것을 의미합니다.

4. 클래스, 객체, 인스턴스의 차이

클래스, 객체, 인스턴스의 차이

클래스 클래스는 객체지향 프로그래밍에서 특정 개체의 속성과 행위를 정의하는 설계도라고 할 수 있습니다. 클래스는 멤버변수와 메서드로 구성되며 멤버변수는 해당 클래스의 객체들이 가질 수 있는 상태를 정의하고, 메서드는 객체들이 수행할 수 있는 행위를 정의합니다.
객체는 클래스에 의해 정의된 설계도를 따라 만들어진 실체로, 객체는 클래스의 인스턴스입니다. 객체는 메모리에 할당되며 각 객체는 고유한 상태를 가지고 클래스에 정의된 행위(메소드)를 수행할 수 있습니다.
인스턴스는 클래스의 객체를 의미합니다. 클래스를 통해 객체를 생성할 때마다 새로운 신스턴스가 생성되는 것입니다. 인스턴스는 클래스에 정의된 속성과 행위를 가진 객체로 각 인스턴스는 고유한 상태를 가집니다. 객체가 특정 클래스의 인스턴스라는 것은 해당 객체가 해당 클래스의 설계도에 따라 생성되었다는 것을 의미합니다.
즉, 클래스는 객체의 설계도이며, 객체는 클래스에 정의된 속성과 행위를 가진 실체입니다. 인스턴스는 클래스의 객체를 나타내는 용어로 사용되며 클래스로 부터 생성된 객체를 의미합니다.

5. Call by Reference와 Call by Value의 차이

5-1. java는 어떤언어?

Call by Reference와 Call by Value의 차이

Call by Value방식은 함수에 인자를 전달할 때 인자값을 복사하여 전달하는 방식입니다. 이 방식에서는 원본 데이터와 전달된 복사본이 서로 다른 메모리 주소를 가지기 때문에, 함수 내에서 인자의 값을 변경해도 원본 데이터에는 영향을 미치지 않습니다. C, C++, Java, Python 등이 call by value 방식을 사용합니다.
Call by Reference방식은 함수에 인자를 전달할 때 인자의 메모리 주소를 전달하는 방식입니다. 함수 호출시에 인자로 전달되는 변수의 레퍼런스를 전달하며 해당 주소를 통해 원본 데이터를 직접 수정할 수 있습니다. C++, Swift, PHP 등이 call by reference 방식을 지원합니다.

꼬리) java의 기본 타입은 call by value고 참조타입은 call by reference다?

놉 java는 call by value로 작동합니다. java의 참조변수에는 원본 객체에 대한 참조를 값으로 복사하여 가지고 있습니다. 즉 변수가 가지는 값이 레퍼런스이므로 인자로 넘길 때 call by value에 의해 변수가 가지고 있는 레버런스가 복사되어 전달되는것 입니다. 함수 내에서 객체의 속성을 변경하게 되면 원래 객체에 영항을 줄 수 있지만 함수 내에서 전달된 참조변수 자체를 변경하면 호출자의 원래 참조에는 영향을 주지 않습니다.

6. Java8의 특징

java8의 특징

java에 함수형 프로그래밍이 처음 도입된 버전이며 새롭게 추가된 기능으로 Stream API, Lamda표현식, Method Reference,Default Method,Optional Class등이 있습니다.

7. Optional 클래스란?

Optional 클래스는 무엇인가요?

Optinal클래스는 java8에서 도입된 Wrapper 클래스로 값이 존재할 수도 있고 없을 수도 있는 상황을 명시적으로 처리할 수 있습니다. 이를 통해 Null point Exception문제를 해결할 수 있으며, 가독성 높은 코드를 작성할 수 있습니다. Optional 메서드를 사용하여 값의 존재 여부를 체크하고 값이 없는 경우에 대한 기본 처리를 할 수 있습니다.

8. Stream API란?

Stream API란?

자바에서 일련의 데이터 요소인 배열이나 컬렉션 등의 데이터를 처리하기 위한 api입니다. Stream API의 특징은 멀티스레드를 활용해서 병렬로 연산을 수행할 수 있고, 내부 반복연산을 수행하기 때문에 코드가 매우 간단해 집니다.

9. Lambda Expression이란?

Lambda Expression이란?

Lambda Expression이란 Functional Interface를 구현하는 객체를 만들지 않고도 메서드로 전달할 수 있는 익명 함수를 하나의 식으로 표현할 수 있도록 단수화한 것입니다. 즉, 특정 메소드 사용을 위해 일회용 객체를 만들지 않아도 되기 때문에 간단하게 작성 가능하고 가독성이 증가합니다. 너무 남용하면 코드를 이해하는데 어려움이 생길 수 있고 디버깅이 어렵다는 단점이 있습니다.

10. Java 프로그래밍이란

Java 프로그래밍이란

자바란 객체지향 프로그래밍 언어입니다. jvm위에서 실행되기 때문에 운영체제에 독립적이며 웹이나 모바일어플리케이션, 서버등 다양한 분야에서 사용되고 있습니다.

11. Java SE와 Java EE 애플리케이션 차이

Java SE와 Java EE 애플리케이션 차이

java SE는 기본적인 java프로그래밍 기능을 제공하며, 일반적으로 소규모 웹 어플리케이션 개발에 사용됩니다. 반면 java EE는 java SE를 기반으로 확장된 기능을 제공하는 엔터프라이즈 에디션으로, 대규모 기업 어플리케이션 개발에 사용되는 다양한 고급 기능을 제공합니다.

12. Java와 C/C++의 차이점

Java와 C/C++의 차이점

java는 객체지향 언어이고 c++은 객체지향과 절차지향을 모두 지원하는 하이브리드 언어이며 c는 절차지향적 언어입니다. java의 메모리는 gc가 관리해 주지만 c/c++의 메모리는 개발자가 직접 할당과 해제를 해 줘야합니다. 그리고 java는 jvm위에서 실행되기 때문에 운영체제에 독립적이지만 c/c++은 각 플렛폼에 따라 개별적으로 컴파일하고 링크해야 하기 때문에 운영체제에 의존적입니다.

13. Java 언어의 장단점

Java 언어의 장단점

장점:
1. 운영체제에 독립적입니다. : jvm위에서 동작하기 때문에 운영체제에 독립적입니다.
2. 객체지향 언어입니다. : 객체지향의 특징이 캡슐화, 상속, 추상화, 다형성이 잘 적용된 언어립니다. 객제지향 패러다임의 특성상 비교적 이해하고 배우기 쉽습니다.
3. 자동으로 메모리를 관리해 줍니다. : jvm에서 가비지콜렉터가 데몬쓰레드에 의해 가비지콜렉션이 일어납니다. gc로 인해 별도의 메모리 관리가 필요 없습니다.
4. 오픈소스 입니다. : openjdk가 오픈소스입니다. 오픈소스 라이브러리가 풍부하여 다양한 기능을 쉽게 구현할 수 있습니다.
5. 멀티쓰레드를 지원합니다. : 자바는 스레드 생성 및 제어에 관련된 라이브러리 api를 제공하고 있기 때문에 쉽게 구현할 수 있습니다.
6. 동적 로딩을 지원합니다. : 각 객체가 필요한 시점에 클래스를 동적로딩하여 생성합니다.
단점:
1. 비교적 속도가 느리다. : jvm에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 c나 c++보다 느리다는 단점이 있었지만, 하드웨어의 성능 향상과 바이트코드를 기계어로 변환해 주는 jit컴파일러 같은 기술 적용으로 jvm의 기능이 향상되어 속도문제가 상당히 개선 되었습니다.

15. Java의 데이터 타입

15. Java의 데이터 타입

java는 기본자료형과 참조자료형 으로 나눌 수 있습니다.
기본자료형은 정수형인 int,long,short,byte
실수형인 float,double
논리형인 boolean
문자형인 char 가 있습니다.
기본자료형은 메모리의 stack 영역에 저장이 됩니다.
기본 자료형을 제외하면 모두 참조자료형입니다.
new 키워드를 사용해 객체를 생성하여 생성된 객체의 주소를 참조하는 타입 입니다.
첨조 자료형에는 클래스,인터페이스,배열,enum등이 있습니다.
객체가 생성될 때 heap 메모리에 저장되며 참조하는 변수가 없을 때 gc에의해 파괴됩니다.

16. Wrapper Class

Wrapper Class

기본타입의 데이터를 객체로 취급해야 하는 경우가 있습니다. 메소드의 인수로 객체 타입만 요구 되거나 컬렉션 프레임 워크를 사용하는 경우 기본타입의 데이터를 그대로 사용할 수 없습니다. 이때 기본 타입의 데이터를 객체로 변환해주는 클래스가 Wrapper Class입니다.
Wrapper Class는 각각의 타입에 해당하는 데이터를 전달 받아 해당 값을 가지는 객체로 만들어 줍니다. 이러한 래퍼 클래스는 java.lang 패키지에 포함되어 제공됩니다. 추가적으로 기본자료형과의 차이점은 null값을 지원 하며 객체의 값을 비교하기 위해서는 ==동등연산자가 아닌 equals() 메소드를 사용해야한다는 차이점이 있습니다.

17. OOP의 4가지 특징

17-1 추상화(Abstraction), 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)

추상화란 특정 개념이나 개체를 보았을 때 특정 관점에서 관심있거나 중요한 부분만 추려내는 작업을 의미합니다. 즉, OOP에서 중요한 정보만 객체의 인터페이스로써 표시하고 구현 세부 정보를 숨길 수 있는 OOP의 매우 중요한 기능입니다.
캡슐화란 데이터와 프로세스를 하나의 객체에 위치하도록 만드는 것을 말한다. 이를 통해 객체는 자율적으로 다른 객체들과 협력할 수 있는 객체가 되며 자연스레 시스템의 결합도는 떨어지고 응집도는 올라가게 된다. 이의 결과로서 시스템 전체는 유지보수하기 쉬워지고 추후 변경에 유연하게 대처할 수 있다.
상속이란 부모 객체의 특징을 그대로 물려받는 것을 의미하고, 자바에서는 인터페이스 상속과 클래스 상속으로 나뉜다. 이를 통해 모듈의 재사용성이 높아지고, 다형성을 구현할 수 있다. 하지만 무분별한 상속의 남용은 시스템의 결합도를 올려 추후 변경에 유연하게 대응하지 못하기 때문에 자제해야한다.
다형성이란 같은 요청으로부터 응답이 객체의 타입에 따라 다르게 나타나는 것을 의미합니다. 이를 통해 객체지향은 더 유연한 설계를 가질 수 있습니다.

다형성의 장점
1. 여러객체를 하나의 타입으로 관리하니 유지보수가 용이해 집니다.
상위클래스의 상속을 받는 자식클래스의경우 상위클래스의 변경사항이 생겼을 때 상위 클래스만 수정하는것으로 유지보수를 쉽게 할 수 있습니다.
2. 확장성이 좋은 코드를 작성할 수 있습니다.
새로운 기능이 추가되어야 할 때 기존의 코드를 변경하지 않고 인터페이스의 구현체를 만듦으로써 확장성이 향상됩니다.
3. 결합도가 강하지 않은 프로그래밍을 할 수 있습니다.
추상클래스나 인터페이스를 상속받아 기능을 구현함으로써 구체적인 구현에 대한 의존성을 가지지 않습니다.

결합도
결합도란 모듈간의 상호 의존성을 나타냅니다. 결합도가 높으면 변경에 대한 영향력이 크고 유지보수가 어려워집니다. 무분별한 상속을 하게되면 결합도가 높아져 변경에 대한 영향이 커지게 됩니다. 상위 클래스에서 변경이 발생하면 하위클래스까지 영향을 끼치기 때문에 더 많은 코드 수정이 필요하게 될 수 있습니다.
응집도
응집도란 하나의 모듈내에서 요소들이 얼마나 밀접하게 관련되어있는지를 나타냅니다. 응집도가 높으면 내부의 요소들이 밀접하게 연관되어있어 재사용성,유지보수성이 높아지게 됩니다. 응집도가 낮으면 요소들이 서로 느슨하게 연관되어있어 재사용성,유지보수성이 낮아지게됩니다.
응집도는 단일책임원칙과 밀접한 연관관계가 있습니다. 하나의 책임만 가져야 한다는 원칙에 따라 설계되면 서로 밀접한 관련이 있는 기능만 포함하게 되므로 응집도가 올라가게 됩니다.

19. OOP의 5대 원칙 (SOLID)

S: 단일 책임 원칙(SRP, Single Responsibility Principle)
단일 책임 원칙이란 하나의 클래스가 변경되는 이유는 하나뿐이어야한다. -> 하나의 클래스는 하나의 원칙만 가져야한다.
하나의 책임이란것은 모호합니다. 하나의 역할만 가져야 한다기보다 문맥과 상황에 따라 잘 설계해야 합니다.
ex) Controller에서 비즈니스 로직을 처리한다면 클라이언트의 요청과 응답을 처리하는 역할과 비즈니스로직 처리역할 둘 다 하게됨으로 단일책임원칙에 위배됩니다. Controller는 요청과 응답을 Service는 비즈니스로직을 처리하는것이 단일책임 원칙을 지키는 것 입니다.
O: 개방-폐쇄 원칙(OCP, Open Closed Principle)
자신의 확장에는 열려있고 주변의 변화에는 닫혀있어야 한다.
기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있어야한다.
ex) 가장 좋은 예는 JDBC 인터페이스라고 할 수 있습니다. JDBC인터페이스로 표준화 하지 않았다면 DB를 바꿀 때 마다 각자 제공하는 API에 따라 코드를 수정했어야 했을 것 입니다. 하지만 JDBC 인터페이스를 제공함으로써 Connection을 설정하는 부분만 해당 드라이버로 수정해 주면 DB를 교체할 수 있습니다.
L: 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
하위클래스는 상위클래스의 역할을 하는데 문제가 없어야 한다.
자식클래스는 부모클래스의 역할을 모두 할 수 있어야한다.
I: 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
하나의 일반적인 인터페이스보다는 여러개의 구체적인(클라이언트에 특화된) 인터페이스를 사용해야한다.
D: 의존 역전 원칙(DIP, Dependency Inversion Principle)
의존관계를 맺을 때 변화하기 쉬운것보다 거의 변화하지 않는것에 의존해야한다.
구체화에 의존하지 말고 추상화에 의존해야한다. -> 구현클래스에 의존하지 말고 인터페이스에 의존해야한다.

20. 객체지향 프로그래밍과 절차지향 프로그래밍의 차이

21. 객체지향(Object-Oriented)이란

객체란 현실세계의 실체 및 개념을 반영하는 상태와 행위를 정의한 데이터의 집합
객체지향 프로그래밍이란 각자의 역할을 지닌 객체들끼리 서로 메세지를 주고받으며 동작할 수 있도록 프로그래밍 하는 것

22. Java의 non-static 멤버와 static 멤버의 차이

non-static멤버인스턴스멤버라고 부르며 객체 생성시 heap영역에 생성되고 객체마다 별도로 존재합니다.
객체 생성시에 생성되며 객체가 사라지게 되면 인스턴스 멤버도 사라지게 됩니다.
인스턴스멤버는 객체 내에 각각의 공간을 유지하여 다른 객체와 공유되지 않습니다.
static멤버클래스멤버라고 부르며 객체 내부가 아닌 컴파일시 static영역에 생성됩니다.
객체를 생성하지 않아도 이미 생성되어있기 때문에 객체 생성없이 사용이 가능하며 프로그램이 종료될 때 사라지게 됩니다.
클래스멤버는 동일한 모든 클래스의 모든 객체들에 의해 공유됩니다.
static은 공통속성으로 사용되는 클래스변수에 붙이거나 인스턴스멤버를 사용하지 않는 메서드일 때 사용하게 됩니다. -> 인스턴스멤버는 객체를 생성해야 사용할 수 있으므로

지역변수?
메서드 안에 생성되는 변수를 말하며 메서드가 실행될 때 생성되고 메서드가 종료되면 사라지게 됩니다.

23. Java의 main 메서드가 static인 이유

public static void main(String[] args){}의 의미
main()메서드는 프로그램이 실행되는 시작과 끝이되는 지점입니다. JRE는 프로그램 안에 main()메서드가 있는지 확인한 후 main()메서드를 실행하게 됩니다. main()메서드가 끝나면 JRE는 JVM을 종료하고 JRE자체도 메모리에서 사라지게됩니다.
이런 특성을 기반으로 선언문을 하나씩 뜯어보면
public : 어디에서나 접근이 가능해야합니다.
static : 프로그램 실생 순간에 메모리에 할당되어야 합니다. 가비지 컬렉터의 정리 대상이 되어서는 안되기 때문입니다.
void : main()메소드가 끝나게 되면 프로그램도 종료되므로 리턴값을 사용할 호출자가 없기 때문입니다.
main() : 관례적으로 프로그램의 시작점을 main으로 사용하고 있습니다.
String[] args : 프로그램 실행시에 첫 스레드인 main에게 데이터를 넘겨주고 싶을 때를 위한 파라미터입니다.

24. Java의 final 키워드 (final/finally/finalize)

final는 변수나 메서드, 클래스가 변경 불가능하도록 만드는 예약어 입니다.
final 변수의 경우 해당 변수의 값은 변경이 불가능해집니다.
final 메서드는 해당 메서드를 오버라이드할 수 없습니다.
final 클래스는 해당 클래스의 하위 클래스를 정의할 수 없습니다.
finally는 try/catch 블록이 종료될 때 항상 실행될 코드 블록을 정의하기 위해 사용됩니다.
예외가 발생하더라도 항상 실행됩니다.
finalize() 메서드는 가비지콜렉터가 더 이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠다고 결정하는 순간 호출됩니다.

25. Java의 제네릭(Generic)과 C++의 템플릿(Template)의 차이

26. Java의 가비지 컬렉션(Garbage Collection) 처리 방법

27. Java 직렬화(Serialization)와 역직렬화(Deserialization)란 무엇인가

28. 오버로딩과 오버라이딩의 차이(Overloading vs Overriding)

오버라이딩이란 서브클래스가 상속받은 메소드를 클래스에 맞게 재구현 하는 것을 의미하고, 오버로딩이란 동일한 메서드 이름이지만 매개 변수 타입이나 개수가 다른 즉, 다른 명세를 가진 함수를 같은 클래스 내에 만드는 것을 의미합니다.

29. 업캐스팅 & 다운캐스팅

Java에서는 슈퍼 클래스의 변수에 서브 클래스의 객체가 들어가는 것을 업캐스팅이라 하고, 업캐스팅 된 변수의 타입을 서브 클래스로 변경하는 것을 다운 캐스팅이라고 합니다. 서브 클래스 객체는 슈퍼 클래스의 메소드 명세를 상속 받기 때문에 슈퍼 클래스의 변수에 들어가 슈퍼 클래스 인 것처럼 사용될 수 있고, 업 캐스팅 된 변수의 타입이 다시 서브 클래스로 돌아와 본인의 클래스 객체인 것처럼 사용할 수 있습니다.

30. 인터페이스와 추상 클래스의 차이(Interface vs Abstract Class)

추상클래스는 abstract키워드로 선언되어 있거나 클래스에 하나 이상의 추상메소드가 포함되어있는 클래스입니다. 추상메서드가 없어도 추상클래스로 선언할 수 있으나 하나라도 있으면 무조건 추상클래스로 선언되어야 합니다.
기존의 클래스에서 공통적으로 사용될 수 있는 부분을 추상화 하여 추상클래스를 만듭니다.
단독으로는 객체를 생성할 수 없으며, 상속을 위한 상위 클래스로 활용하기 위해 사용합니다.
즉, 추상 클래스의 추상 메서드를 하위 클래스가 구체화하여 기능을 확장하는 데 목적이 있습니다.
인터페이스는 interface 키워드를 사용하여 선언하며, 추상메서드의 집합이라고 할 수 있습니다.
내부에 구현되어있는것이 전혀 없기 때문에 인터페이스를 implement한 클래스에서 추상메서드를 구현하여 사용합니다.
구현 객체의 같은 동작을 보장하기 위한 목적으로, 공통적으로 사용되는 기능을 명시하고 구현을 강제하기 위해 사용됩니다.
차이점
서로 다른 목적을 가지고 있습니다.
추상클래스는 추상메서드를 하위클래스가 구체화 하여 기능을 확장하는데 목적이 있습니다.
인터페이스는 정의된 기능 구현을 강제하여 상속받은 클래스들의 같은 동작을 보장하는데 목적이 있습니다.
추상클래스는 단일 상속이지만 인터페이스는 다중상속이 가능합니다.

인터페이스 사용의 장점
1. 선언과 구현을 분리하여 변경에 유리해집니다. 기능변경이 필요할 때 기존 코드를 변경하는것이 아닌 구현체를 추가하여 변경할 수 있습니다.
2. 표준화가 가능합니다. 가장 좋은예로 JDBC인터페이스를 들 수 있습니다. 데이터베이스의 api를 표준화 함으로써 어떤 dbms를 사용하더라도 똑같은 방식으로 다룰 수 있습니다.
3. 서로 관계없는 클래스들의 관계를 맺어줄 수 있습니다. 다형성을 지원하여 다양한 객체들을 동일한 타입으로 참조하고 사용할 수 있습니다.

31. JVM 구조

32. Java Collections Framework

33. Java Map 인터페이스 구현체의 종류

34. Java Set 인터페이스 구현체의 종류

35. Java List 인터페이스 구현체의 종류

36. Annotation

37. 동기화와 비동기화의 차이(Synchronous vs Asynchronous)

38. Java에서 '=='와 'equals()'의 차이

39. Java의 리플렉션(Reflection)이란.


객체지향 관련
자료형에 대한 설명,
객체지향프로그램밍의 이유,
오버라이딩과 오버로딩의 차이,
다형성 특히 인터페이스와 추상메소드 및 추상클래스,
staic이란?,

Collection관련
컬렉션을 쓰는 이유,
컬렉션의 종류

sql은
join관련은 이너조인과 외부조인의 특징이고
jdbc 및 spring은

was와 web서버란?,

was란 웹어플리케이션서버로써 웹 서버와 데이베이스 서버 사이에서 동작하는 서버로,클라이언트 요청에 따라 비즈니스 로직을 처리하고 동적인 웹 페이지와 서비스를 제공하는 역할을 합니다. was는 jsp,sevlet등과 같은 다양한 웹 프로그래밍 기술을 지원함니다. tomcat이 대표적인 was입니다.
톰켓은 자바 서블릿과 jsp를 실행할 수 있는 환경을 제공합니다.
웹 서버란 클라이언트로부터 http요청을 받아 html, 이미지 등의 정적인 컨텐츠를 제공하는 서버입니다.

서블릿,

서블릿이란 java에서 http요청과 응답을 처리하기 위한 환경을 제공하는 java기반의 서버사이드 기술입니다. 클라이언트의 요청을 받아 동적인 웹 페이지를 생성하기 위한 기술로 jsp와 함께 많이 사용됩니다. jsp는 내부적으로 서블릿으로 변환되어 실행됩니다.

스프링을 사용하는 이유,
쿠키와 세션의 차이점,
mvc1과 mvc2에 대한 설명 및 mvc패턴 흐름 설명

profile
안녕하세요

2개의 댓글

comment-user-thumbnail
2024년 7월 1일

감사합니다.

답글 달기
comment-user-thumbnail
2024년 8월 25일

좋은 정리 글 감사합니다~!

단, "1.컴파일 과정"에서 조금 수정될 부분이 있어 남겨보고자 합니다.

우선, 컴파일 과정이 자바 프로그램 동작 원리로 해석되면 더 좋을 것 같습니다^^

자바는 완전한 compiler 언어가 아닌 컴파일러와 인터프리터 방식이 결합된 하이브리드 방식입니다.

우선, javac 컴파일러로 Java 파일을 바이트 코드(.class)로 변환하는 방식은 compile 방식이지만, 바이트 코드를 JVM의 인터프리터가 한 줄 씩 실행하여 인터프리터 방식으로 볼 수 있기 때문에 두 방식이 결합된 하이브리드 방식입니다.

답글 달기