질문 출처 : https://github.com/jjuyeon/Tech-Interview-Study/blob/main/java/README.md [JAVA]
객체지향이란?
개념
Object-Oriented Programming, OOP. 컴퓨터 프로그래밍의 패러다임 중 명령형 프로그래밍의 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 객체란 클래스라는 틀에서 생겨난 instace를 의미하는데, 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다.
특징과 장단점
객체 지향 프로그래밍은 다형성, 객체, 캡슐화 등 소프트웨어의 재사용을 지향하기 때문에 프로그램을 유연하고 변경이 쉽게 만들어 개발과 유지보수를 간편하게 만들어준다. 또한 소프트웨어의 응집력을 강화하고 결합력을 약하게 하여, 소프트웨어 공학적으로 아주 이상적인 디자인이라고 할 수 있다. 단 절차지향 프로그래밍에 비해 속도가 느리고 메모리와 연산에 대한 비용이 더 들어간다는 단점이 있다.
객체지향의 SOLID 원칙
개념
객체지향의 SOLID 원칙이란, 객체지향 개발 5대 원리를 의미한다. 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다.
- S (Single responsibility principle, 단일 책임 원칙)
◻ “한 클래스는 하나의 책임만 가져야 한다.”
◻ 사람이라는 클래스에 자식, 애인, 회사원, 고객 등 너무 많은 역할을 쥐어줘서는 안된다는 뜻. 저런 짬뽕 클래스를 만들지 말고, 각각의 클래스를 만들어서 하나의 역할만을 수행할 수 있도록 만들어줘야 한다.
- O (Open/closed principle, 개방-폐쇄 원칙) ✨
◻ “소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.”
◻ 나를 파생시켜서 여러가지 기능을 확장하는 것은 항상 괜찮지만, 다른 클래스를 수정한다고 나를 수정하는 일을 없어야 한다.
◻ 객체지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성과 밀접한 관련이 있는 원칙으로, 다른건 몰라도 얘는 반드시 지켜야 한다.
- L (Liskov substitution principle, 리스코프 치환 원칙)
◻ “프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.”
◻ 하위 클래스 is kind of 상위 클래스, 구현 클래스 is able to 인터페이스 를 잘 지켜야한다.
- I (Interface segregation principle, 인터페이스 분리 원칙)
◻ “특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.”
◻ 단일 책임 원칙과 비슷하다.
- D (Dependency inversion principle, 의존관계 역전 원칙)
◻ “프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.”
◻ 자동차 클래스가 바퀴라는 클래스에 의존한다고 생각해보자. 이 때 '바퀴'라는 인터페이스나 상위 클래스에 의존하는 것이 바람직하지, '한국 타이어'나 '넥센 타이어', '흥아 타이어'등 구현 클래스, 하위 클래스에 의존해서는 안된다는 뜻이다.
쓰레드란?
개념
스레드(thread)는 어떠한 프로그램, 프로세스 내에서 실행되는 흐름의 단위를 말한다. 실제로 작업을 수행하는 주체가 되며 한순간에 하나의 스레드만 실행할 수 있다.
스레드는 프로세스가 운영체제로부터 할당받은 자원을 이용(+공유)하며, 자신만의 스택과 PC(Program Counter) 레지스터 공간을 가진다. 이는 각각의 스레드가 독립적인 작업을 수행하므로 스케줄링 과정에서 자신의 이전 수행 과정을 기억해야하기 때문이다.
스레드는 프로세스보다 생성 및 종료시간, 스레드간 전환 시간이 짧다. 그리고 프로세스의 메모리나 자원을 공유하기 때문에 커널의 도움 없이 상호간의 통신이 가능하다.
종류
- 사용자 레벨 스레드
◻ 커널 위에서 동작. 스레드 중 하나가 시스템 호출로 중단되면 나머지 모든 스레드도 같이 중단됨.
- 커널 레벨 스레드
◻ 운영체제가 지원하는 스레드 기능. 스레드가 시스템 호출로 중단 되어도 나머지 스레드를 중단시키지 않음.
싱글쓰레드와 멀티쓰레드
일반적으로 한 프로그램은 하나의 스레드(싱글스레드)를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드라고 한다.
싱글톤 패턴
개념
소프트웨어 디자인 패턴 중 하나. 싱글턴 패턴을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로는 최초 생성시에만 객체가 생성되고 이후에 호출된 생성자는 최초의 생성 때 만들어진 객체를 리턴한다(=getInstance()). 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
지하수를 긷고자 할 때 매 순간 우물을 뚫을 필요 없이 처음 한번만 뚫어놓으면 그 뒤로는 뚫어둔 우물을 사용하면 되는 것과 마찬가지이다.
public class 우물 {
private static 우물 마을우물 = null;
// 외부에서 매 순간 우물을 뚫지 않도록 접근 제한
private 우물() { }
public static 우물 getInstance(){
// 마을에 우물이 없으면 새로 뚫고
if (마을우물 == null) {
마을우물 = new 우물();
}
// 뚫은 우물 반환
return 마을우물;
}
}
solid 원칙을 위배할 수 있다..? 보통 사용하지 말라는 분위기인..
추가)