1) 추상 클래스 Vs 인터페이스
1. 사용 목적
- 추상클래스: 관련성이 높은 클래스들의 공통적인 기능을 추출하여 기본적인 틀을 구현하는 것이 목적
- 인터페이스: 서로 관련성이 없는 클래스들에게 공통적인 기능을 부여하는 것이 목적
2. 상속과 구현
- 추상클래스: extends를 통한 단일 상속만 가능
- 인터페이스: implements를 통한 다중 구현 가능
3. 구성 요소
- 추상클래스: 일반 메서드와 추상 메서드 모두 포함 가능, 멤버 변수 선언 가능
- 인터페이스: 추상 메서드와 상수만 포함 가능 (Java 8부터 default, static 메서드 추가
2) java의 접근 제어자의 종류와 특징
3) java의 데이터 타입
기본 데이터 타입 (Primitive Type)
- 스택 영역: 기본 타입 변수와 참조 타입의 참조 값 저장
정수형
- byte: 8bit (-128 ~ 127)
- short: 16bit (-32,768 ~ 32,767)
- int: 32bit (-2,147,483,648 ~ 2,147,483,647)
- long: 64bit (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
실수형
- float: 32bit (소수점 6자리)
- double: 64bit (소수점 15자리)
문자형
- char: 16bit (0 ~ 65,535)
논리형
- boolean: 1bit (true/false)
특징
- 스택(Stack) 메모리 영역에 직접 저장
- 고정된 크기의 메모리 사용
- null 값을 가질 수 없음
참조 타입 (Reference Type)
- 힙 영역: 참조 타입의 실제 데이터 저장
- new 키워드를 이용하여 객체를 생성하여 데이터가 생성된 주소를 참조하는 타입이다.
- 더 이상 참조하는 변수가 없을 때 가비지 컬렉션에 의해 파괴된다.
종류
- 클래스(Class)
- 배열(Array)
- 인터페이스(Interface)
- 열거(Enumeration)
주요 참조 타입 예시
- String
- StringBuffer/StringBuilder
- ArrayList, LinkedList 등 컬렉션
- 사용자 정의 클래스
- 배열
4) call by value Vs call by Reference
Call By Value : 기본 타입 → 값 복사
- 메서드를 호출해서 변수의 값을 변경하면 호출한 곳에서는 값이 변경되지 않음
Call By Referece : 참조 타입 → 번지 복사
- 메서드를 호출해서 객체의 번지를 찾아가 값을 변경하게 되면 호출한 곳에서도 값이 변경된다.
번지가 전달이 되면 한쪽에서 변경되면 다른곳에서도 변경된다
5) OOP의 4가지 특징
추상화(Abstraction)
- 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것
캡슐화(Encapsulation)
- 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
- 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가
일반화 관계(Inheritance, 상속)
- 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
다형성(Polymorphism)
- 타입의 다형성 : 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
- 메서드의 다형성 : 오버라이딩(Overriding), 오버로딩(Overloading)
6) SOLID 원칙
1. S: 단일 책임 원칙(SRP, Single Responsibility Principle)
- 객체는 단 하나의 책임만 가져야 한다.
2. O: 개방-폐쇄 원칙(OCP, Open Closed Principle)
- 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.
- 코드는 변경에는 닫혀 있고, 확장에는 열려 있어야 한다.
3. L: 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
- 일반화 관계에 대한 이야기며, 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다.
4. I: 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
- 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙이다.
5. D: 의존 역전 원칙(DIP, Dependency Inversion Principle)
- 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다.
- 구체적인것 보다는 추상적인 것에 의존해야 한다는 원칙
7) == 연산자와 .euqals() 메서드 비교
== 연산자
- 기본 타입(primitive): 값을 비교
- 참조 타입(reference): 객체의 주소값을 비교
- String을 포함한 모든 객체의 주소 비교 가능
equals() 메서드
- Object 클래스의 기본 구현은 == 와 동일하게 주소값 비교
- String 클래스는 equals()를 오버라이딩하여 문자열 내용 비교
- 다른 클래스들도 필요에 따라 equals()를 오버라이딩하여 객체의 내용 비교 가능
8) 클래스, 객체, 인스턴스의 차이
클래스, 객체, 인스턴스의 차이를 설명하자면,
클래스는 객체를 생성하기 위한 템플릿이나 설계도이고,
객체는 클래스를 기반으로 만들어진 실체이며,
인스턴스는 이 객체가 메모리에 할당되어 실제로 사용될 때를 지칭합니다.
9) static과 non-static의 차이
1. 메모리 생성 시점
- static 멤버: 클래스가 로딩될 때 생성되어 프로그램이 종료될 때까지 유지됩니다
- non-static 멤버: 객체가 생성될 때마다 새로운 메모리가 할당됩니다
2. 공유 특성
- static 멤버: 모든 객체가 같은 메모리를 공유합니다 (예: 자동차의 총 생산량)
- non-static 멤버: 각 객체마다 독립적인 메모리를 가집니다 (예: 각 자동차의 모델명)
3. 사용 방법
- static 멤버: 객체 생성 없이 클래스명으로 직접 접근 가능
- non-static 멤버: 반드시 객체를 생성한 후에만 사용 가능"
이러한 특성 때문에 보통 static은 여러 객체가 공유해야 하는 데이터나 유틸리티 메서드에 사용됩니다.
10) 싱글 스레드와 멀티 스레드
싱글 스레드 - 하나의 프로세스에서 하나의 스레드로만 실행하는 방식
단순성과 안정성
멀티 스레드 - 하나의 프로세스 안에서 여러 스레드가 동시에 작업을 수행
성능과 응답성
프로세스는 실행 중인 프로그램을 의미하며 독립된 메모리 공간을 할당받습니다.
반면, 스레드는 프로세스 내에서 실행되는 작업 단위로, 프로세스의 메모리 공간을 공유
11) 컬렉션의 종류
List
- 순서가 있는 데이터의 집합으로 데이터의 중복을 허용
대표적인 구현 클래스:
ArrayList: 동적 배열로 빠른 조회가 가능합니다
LinkedList: 이중 연결리스트로 빠른 삽입/삭제가 가능합니다
Set
- 순서가 없는 데이터의 집합으로 데이터의 중복을 허용하지 않음
대표적인 구현 클래스:
HashSet: 해시 알고리즘을 사용한 빠른 검색이 가능합니다
TreeSet: 이진탐색트리 구조로 데이터가 정렬되어 저장됩니다
Map
- 키(Key)와 값(Value) 쌍으로 이루어진 데이터의 집합입니다
- 키는 중복 X, 값은 중복이 가능
대표적인 구현 클래스:
HashMap: 해시 알고리즘을 사용한 빠른 검색이 가능합니다
TreeMap: 이진탐색트리 구조로 키를 기준으로 정렬되어 저장됩니다
12) JVM이란?
JVM(Java Virtual Machine)은 자바 코드를 바이트코드로 컴파일하고 이를 실행하는 가상 머신으로, 'Write Once, Run Anywhere'를 가능하게 하는 자바의 핵심 구성요소
Write Once, Run Anywhere이란
개발자가 한 번 작성한 자바 코드를 다양한 플랫폼(윈도우, 리눅스, 맥 등)에서 수정 없이 실행할 수 있다는 의미
13) staic 변수와 지역변수가 저장되는 메모리 위치
1. 코드(Code) 영역
실행할 프로그램의 코드가 저장되는 영역입니다
텍스트(Text) 영역이라고도 불립니다
CPU가 이 영역에서 명령어를 하나씩 가져와 처리합니다
2. 데이터(Data) 영역
전역 변수와 정적(static) 변수가 저장되는 영역입니다
프로그램 시작 시 할당되고 종료 시 소멸됩니다
3. 스택(Stack) 영역
함수 호출과 관련된 정보가 저장되는 영역입니다
지역 변수와 매개변수가 저장됩니다
함수 호출 시 할당되고 함수 종료 시 소멸됩니다
후입선출(LIFO) 방식으로 동작합니다
4. 힙(Heap) 영역
프로그래머가 직접 관리하는 동적 메모리 할당 영역입니다
malloc() 또는 new 연산자로 메모리를 할당하고, free() 또는 delete 연산자로 해제합니다
결과적으로 정적(static) 변수는 데이터 영역에 저장되고, 지역변수와 매개변수는 스택 영역, 생성된 객체는 힙 영역에 저장된다.
'면접준비' 카테고리의 다른 글
Network 기술 면접 준비 (2) | 2024.10.31 |
---|---|
Spring 기술 면접 준비 (0) | 2024.10.29 |
DB 기술면접 준비 (0) | 2024.10.29 |