https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Development_common_sense
내 답변
다른 사람들과의 협업 또는 문서화할때 좋기위해 가독성이 좋고 효율성을 생각하여 시간 복잡도와 공간 복잡도를 고려한 코드가 좋은 코드라고 생각한다.
최선의 답변
가독성: 코드는 읽기 쉽고 이해하기 쉬워야 합니다. 의미 있는 변수명, 명확한 주석, 들여쓰기와 같은 가독성을 향상시키는 요소들을 사용해야 합니다. 다른 사람이나 자신이 나중에 코드를 다시 볼 때 이해하기 쉬워야 합니다.
일관성: 코드는 일관성을 유지해야 합니다. 코드 스타일, 네이밍 규칙, 들여쓰기 등은 일관성 있게 작성되어야 합니다. 이는 코드를 이해하기 쉽고 유지보수하기 쉽게 만들어줍니다.
모듈화: 코드는 기능을 작은 모듈로 분할하는 것이 좋습니다. 모듈화를 통해 코드를 재사용할 수 있고, 유지보수가 용이해집니다. 잘 정의된 함수와 클래스를 사용하여 코드를 모듈화하는 것이 좋습니다.
효율성: 코드는 효율적이어야 합니다. 불필요한 반복문, 복잡한 알고리즘, 비효율적인 자료구조 등을 최소화해야 합니다. 효율적인 코드는 실행 시간과 메모리 사용량을 줄여 성능을 향상시킵니다.
확장성: 좋은 코드는 쉽게 확장될 수 있어야 합니다. 새로운 기능이나 요구사항이 추가되었을 때 코드를 수정하거나 확장하기 쉬워야 합니다. 모듈화와 추상화를 통해 확장성을 높일 수 있습니다.
안정성: 코드는 오류를 최소화하고 예외 상황을 처리해야 합니다. 적절한 오류 처리와 예외 처리를 통해 안정성을 확보해야 합니다. 특히 보안과 관련된 코드는 안전하게 작성되어야 합니다.
테스트 가능성: 좋은 코드는 테스트하기 쉬워야 합니다. 단위 테스트와 같은 자동화된 테스트를 지원하고, 코드의 각 부분이 독립적으로 테스트 가능하도록 작성되어야 합니다. 테스트 가능한 코드는 버그를 예방하고 디버깅을 용이하게 만들어줍니다.
문서화: 코드는 충분한 문서화가 필요합니다. 함수와 클래스에 대한 설명, API 문서, 주석 등을 통해 코드의 의도와 사용 방법을 명확하게 전달해야 합니다. 문서화는 코드를 이해하고 사용하는 개발자들에게 큰 도움을 줍니다.
내 답변
객체지향프로그래밍으로서 현실세계의 물건들을 현실 세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것.
최선의 답변
객체지향프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발 방법론 중 하나로, 현실 세계의 개념을 컴퓨터 프로그램에 반영하기 위해 객체라는 개념을 중심으로 프로그래밍하는 방법입니다. 객체는 데이터와 그 데이터를 처리하는 메서드를 하나의 단위로 묶은 것으로, 프로그램의 구성 요소입니다.
객체지향프로그래밍에서는 다음과 같은 개념과 원칙이 중요합니다:
1. 클래스(Class): 클래스는 객체의 설계도 또는 템플릿으로, 객체를 생성하기 위한 상태(속성)와 행위(메서드)를 정의합니다. 클래스는 객체의 공통된 특성을 나타내는 변수와 해당 변수를 처리하는 메서드를 포함합니다.
2. 객체(Object): 클래스의 인스턴스로, 클래스를 기반으로 실제로 메모리에 할당된 데이터입니다. 객체는 각자 고유한 상태를 가지며, 클래스에서 정의된 메서드를 사용하여 데이터를 처리하고 상호작용합니다.
3. 캡슐화(Encapsulation): 캡슐화는 관련된 데이터와 메서드를 하나의 단위로 묶는 것을 말합니다. 객체는 자신의 내부 상태를 외부에서 직접 접근하지 못하도록 보호하고, 메서드를 통해 상태를 조작하도록 합니다. 이를 통해 객체의 내부 구현을 감추고 외부에 공개할 인터페이스만 노출시킴으로써 모듈화와 정보은닉을 실현할 수 있습니다.
4. 상속(Inheritance): 상속은 기존 클래스를 확장하여 새로운 클래스를 정의하는 개념입니다. 상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 재사용할 수 있습니다. 상속은 코드의 재사용성을 높이고 클래스 간의 계층 구조를 형성하는 데 사용됩니다.
5. 다형성(Polymorphism): 다형성은 같은 이름의 메서드가 다른 형태로 동작하는 능력을 말합니다. 다형성은 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 다른 동작을 수행할 수 있게 합니다. 다형성은 유연하고 확장 가능한 코드를 작성하는 데 도움을 줍니다.
객체지향프로그래밍은 코드의 재사용성, 유지보수성, 확장성 등을 향상시키는 장점을 가지고 있으며, 현실 세계를 모델링하는 데에 적합합니다. 많은 프로그래밍 언어들이 객체지향프로그래밍을 지원하고 있으며, 객체지향적인 개념과 원칙을 잘 이해하고 활용하는 것은 좋은 소프트웨어를 개발하는 데 중요합니다.
내 답변
SOLID라 부르는 객체 지향적 설계 원칙은 단일 책임의 원칙, 개방-폐쇄의 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 역전 원칙이다.
최선의 답변
SRP (Single Responsibility Principle, 단일 책임 원칙): 클래스는 단 하나의 책임을 가져야 합니다. 하나의 클래스가 여러 가지 책임을 가지면 코드의 이해와 유지보수가 어려워집니다. 따라서 클래스는 한 가지 책임만을 가지고 있어야 합니다.
OCP (Open-Closed Principle, 개방-폐쇄 원칙): 확장에는 열려 있고, 변경에는 닫혀 있어야 합니다. 새로운 기능이 추가되어도 기존 코드는 수정되지 않아야 합니다. 대신에 기존 코드에 영향을 주지 않고 새로운 기능을 추가할 수 있는 확장 가능한 설계가 되어야 합니다. 이를 위해 추상화와 다형성을 활용할 수 있습니다.
LSP (Liskov Substitution Principle, 리스코프 치환 원칙): 자식 클래스는 언제나 부모 클래스로 대체될 수 있어야 합니다. 즉, 어떤 클래스의 인스턴스를 사용하는 코드는 그 클래스의 서브클래스의 인스턴스를 사용해도 동작에 문제가 없어야 합니다.
ISP (Interface Segregation Principle, 인터페이스 분리 원칙): 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 합니다. 인터페이스는 클라이언트에 필요한 기능에만 집중되어야 하며, 여러 개의 작은 인터페이스가 하나의 큰 인터페이스보다 선호됩니다.
DIP (Dependency Inversion Principle, 의존성 역전 원칙): 의존 관계를 형성할 때는 추상화에 의존해야 하며, 구체적인 구현에 의존해서는 안 됩니다. 즉, 의존성은 상위 수준 모듈과 하위 수준 모듈 모두 추상화에 의존해야 합니다.