[직무 면접 대비] JAVA 면접 예상 질문 및 답변
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/DataStructure
java Generic
데이터 타입을 일반화한다라는 의미를 가지고 있으며
클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법입니다.
클래스에서 사용할 타입을 클래스 외부에서 설정하는 것입니다.
장점은 객체의 타입 안정성을 높일 수 있고, 반환 값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
이전엔 클래스나 메서드에서 인수나 반환 값으로 Object타입을 사용했다. 하지만 이경우 다시 원하는 타입으로 변환해야 하고 오류가 생길 가능성도 존재했다. 하지만 제네릭을 사용하면 컴파일 시에 미리 타입이 정해 지므로 노력 감소 효과
이렇듯 제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.
java 기본형 / 참조형 변수
실제 연산에 사용되는 것은 모두 기본형 실제 값이 저장
참조형은 기본형 8가지 제외한 나머지
실제값이 아닌 주소 값을 저장한다.
java 참조
윈도우에서 바로가기를 만드는 것과 비슷합니다.
원본이 수정되면 참조 심볼릭 링크도 수정이 되는 것입니다.
원본을 복제한 것이 아니라 원본에 대한 주소 값을 가지고 있기 때문에 원본을 참조하고 있는 것입니다.
오버 로딩 / 오버 라이딩
자바에서 다형성을 지원하는 방법입니다.
오버 로딩은 같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술이고
오버 라이딩은 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 기술입니다. 상속에서 주로 이루어집니다.
다형성
다형성이란 말 그대로 여러 가지 형태를 가질 수 있는 성질을 말합니다.
하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것입니다. 대표적으로 오버 로딩, 오버 라이딩이 있습니다.
캐스팅
캐스팅이란 타입을 변환하는 것을 말하며 형 변환이라고 합니다.
업 캐스팅 다운 캐스팅이 있습니다.
서브 클래스는 수퍼 클래스의 모든 특성을 상속받습니다. 따라서 서브 클래스는 슈퍼 클래스가 될 수 있습니다. 이를 업 캐스팅이라 합니다. 업 캐스팅이 일어났을 때 서브 클래스의 원래 특성으로 되돌려 놓는 것이 다운 캐스팅입니다.
상속 / 인터페이스 구현
- 상속은 extends 키워드 사용해 구현
- 부모에서 선언 / 정의 모두
- 오버 라이딩할 필요 없이 자식은 부모의 변수와 메서드를 그대로 사용(클래스가 클래스 상속, 하나만)
- 인터페이스는 implement 사용해 구현
- 부모에서 선언만 하고 자식에서 오버 라이딩(재정의)해서 사용(클래스가 인터페이스 상속, 여러 개 가능)
동적 계획법
알고리즘을 짤 때 분할 정복 기법을 사용하는 경우가 많습니다.
큰 문제를 한 번에 해결하기 힘들 때 작은 여러 개의 문제로 나누어서 푸는 기법인데요.
작은 문제들을 풀다 보면 같은 문제들을 반복해서 푸는 경우가 생깁니다.
그 문제들을 매번 재계산하지 않고 값을 저장해두었다가 재사용하는 기법이 동적 프로그래밍입니다.
*메모이제이션(memoization)
- 메모이제이션(memoization)은 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술이다. 동적 계획법의 핵심이 되는 기술이다.
- 메모이제이션은 재귀 호출 시, 반복적으로 계산되는 것들의 계산 횟수를 줄이기 위해 이전에 계산했던 값을 저장해두었다가 나중에 재사용하는 방법입니다. 메모이제이션이 동적 프로그래밍 중 하나입니다.
객체지향
소프트웨어의 각 요소들을 객체로 만든 후, 객체들을 조립해서 소프트웨어를 개발하는 기법입니다.
- 객체 : 데이터와 이를 처리하기 위한 함수를 묶어 놓은 소프트웨어 모듈
- 클래스 : 공통된 속성과 연산을 갖는 객체의 집합
- 인스턴스 : 클래스에 속한 각각의 객체
- 메시지 : 객체들 간의 상호작용에 사용되는 수단. 객체의 동작이나 연산을 일으키는 외부의 요구사항
특징
캡슐화 / 상속 / 다형성 / 정보은닉 / 추상화
캡슐화
- 외부에서의 접근을 제한하기 위해 인터페이스를 제외한 세부 내용을 은닉하는 것
- 데이터와 함수를 하나로 묶는 것(재사용성 용이, 변경 파급효과 적음)
정보은닉
- 캡슐화의 중요 개념. 캡슐 내의 세부 내용을 외부에 숨기는 것. 자신만의 연산으로 접근 (자바의 접근제어자)
- private : 자기 클래스 내부의 메서드만 접근 허용
- protected : 자기 클래스, 상속받은 자식 클래스에서의 접근을 허용
- public : 모든 접근을 허용
상속
- 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것
- 재정의 하지 않아도 즉시 자신의 속성으로 사용
다형성
- 하나의 메시지에 대해 각각의 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
- ex) + 연산자
추상화
- 불필요한 부분을 생략하고, 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것, 즉 모델화 하는 것이다.
Call by value / Call by reference
Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다.
Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.
간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것이다.
C++ 매개변수 그냥 / &참조 변수로 주소 값에 접근해 직접 값 변경하느냐
Call by value(값에 의한 호출)
- 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
- 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
Call by reference(참조에 의한 호출)
- 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
- 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)
static / stack / heap / Garbage Collection
https://minhamina.tistory.com/211
클래스 / 객체 / 인스턴스 / 클래스 변수 / 인스턴스 변수 / 지역변수
https://minhamina.tistory.com/212
추상 클래스?
https://limkydev.tistory.com/188