기술면접 대비 : 객체 지향 프로그래밍
객체 지향 프로그래밍(Object Oriented Programming)
: 컴퓨터 프로그래밍 패러다임 중 하나로써 , 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직 을 구성하는 프로그래밍 방법
장점은 코드 재사용 용이, 유지 보수 용이, 대형 프로젝트에 적합하다는 게 있습니다.
(코드 재사용 용이)다른 사람이 만든 클래스를 가져와 이용하거나 상속을 통해 확장시켜 사용할 수 있습니다.
(유지 보수 용이)절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하지만, 객체 지향에선 수정해야할 부분이 클래스 내부에 멤버 변수 혹은 메서드 로 존재하기 때문에 해당 부분만 수정하면 됩니다.
(대형 프로젝트에 적합) 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러 회사에서 프로젝트 개발할 때 분담하기 쉽다. 단점으로는 처리 속도가 상대적으로 느리고 객체가 많으면 용량이 커질 수 있으며 설계 시 많은 시간과 노력이 필요하다는 것입니다. ->독립적인 객체를 활용함으로써 생산성을 높일 수 있다.
객체 지향 프로그래밍의 단점은 실행 속도가 느림, 프로그램 용량이 큼, 설계에 많은 시간이 소요된다는 점입니다.
(실행속도가 느림) 절차 지향언어는 컴퓨터의 처리구조와 비슷해 실행속도가 빠르지만 상대적으로 객체 지향 언어는 느리다.
(프로그램 용량이 큼)객체 단위로 프로그램을 만들다 보면 불필요한 정보들이 삽입될 수 있고, 용량 증가 될 수 있다.
(설계 시간 소요)클래스별, 객체 별, 상속 등 구조 또한 설계해야 하기 때문에 절차에 비해 시간 소요가 많다.
객체 지향 프로그래밍의 키워드 5개 : 클래스+인스턴스 / 추상화 / 캡슐화 / 상속 / 다형성
#.클래스, 인스턴스 , 객체
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른것과 식별 가능 한 것 프로그램은 여러개의 객체를 조합하여 만듭니다. 이때 이러한 객체를 만들기 위한 일종의 설계도가 클래스입니다. 클래스에는 객체가 가지는 속성과 동작으로 이뤄져 있고,
배우는 용어로 표현하면 변수(필드, 객체의 데이 터가 저장되는 곳), 생성자(객체가 실제로 생성될 때 초기화 담당하는 것), 메소드(객체의 동작에 해당되는 실행블록)으로 이뤄져 있습니다. 이들은 생략이 가능합니다. 이러한 클래스에서 만들어진 각각의 객체를 인스턴스라 하고, 실제 프로그램에서 사용되는 데이터를 의미합니다.
#.추상화
추상 클래스, 추상 클래스가 갖는 추상 메서드를 의미하는 것보단 클래스를 설계하는 것 자체를 의미한다. 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
#.캡슐화
캡슐화는 oop에서 기능과 특성의 모음을 “클래스”라는 “캡슐”에 분류해서 넣는 것을 말한다. 객체가 맡은 역할을 수행하기 위한 하나의 목적을 하나로 묶음으로써 코드를 재 수정 없이 재활용하고, 접근 제어자를 통한 정보 은닉이 가능하다. 객체가 외부에 노출하지 않아야 할 정보 또는 기능을 접근 제어자를 통해 적절히 제어 권한이 있는 객체에서만 접근할 수 있기에 코드 수업이 일어났을 때 책임이 있는 개체만 수정하면 되어 영향 예측 범위가 수월하다. 또한 기능과 특성을 한 곳에 분류하기에 객체 재활용이 원할하다.
#.상속
부모 클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고 기능의 일부분을 변경해야 할 경우 상속 받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있 게 하는것이다. 단, 다중 상속은 불가하다. (클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용 할 수 있게 했다.)
#.다형성
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석 될 수 있다. 다형성엔 오버라이딩, 오버로딩이 있다. 오버라이딩은 (상속 받은 메소드를 다시 정의하고 싶을 때)부모 클래스의 메서드와 같은 이름, 매개 변수를 재정의 하는 것 -메소드 이름, 매개변수, 타입 , 리턴 타입 동일해야 하며 메소드의 static 예약어 붙이면 안됨
오버 로딩은 (같은 동작을 해야 하는 메소드를 작성하는데 매게변수가 다른경우) 같은 이름의 함수를 여러개 정의하고, 매개 변수의 타입과 개수를 다르게 하여 매개 변수 에 따라 다르게 호출할 수 있게 하는것. ->실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있음
-유연, 변경이 용이 / 확장 가능한 설계 / 클라이언트에 영향을 주지 않는 변경 가능 / 인터페이스를 안정적으로 잘 설계하는 것이 중요
#.getter, setter를 사용하는 이유는 무엇인가?
메서드를 통해서 접근하기 때문에, 메서드 안에서 매개 변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리 할 수 있게 제한하거나 조절할 수 있기 때문디다.
#.객체 지향의 설계 원칙
1. SRP(Single Responsibility Principle) : 단일 책임 원칙
클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것 예) UI 변경, 객체 생성과 사용을 분리
2. OCP(Open-Closed Principle) : 개방-폐쇄 원칙
확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다. 예)다형성, 구현 객체를 변경 하려면 클라이언트 코드를 변경해야 한다. -> 다형성을 사용했지만 OCP 원칙을 지킬 수 없다. => 스프링 ) 객체를 생성하고, 연관 관계를 맺어주는 별도의 조립, 설정자가 필요하다 (컨테이너)
3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다. 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 하위 클래스는 인터페이스 규약을 다 지켜야 한다. -> 인터페이스를 구현한 구현체를 믿고 사용하기 위해 이 원칙이 필요하다.
4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다. 클정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
5. DIP(Dependency Inversion Principle) : 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다. 구현 클래스에 의존하지 말고 인터페이스에 의존하라. 역할에 의존하게 해야 한다는 것과 같다. 객체 세상도 클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다
절차적 프로그래밍 장점
-객체나 클래스를 만들 필요 없이 바로 프로그래밍 코딩할 수 있다.
-필요한 기능을 함수로 만들기 때문에 같은 코드를 복사하지 않고 호출하여 사용할 수 있다.
-프로그래밍의 흐름을 쉽게 추적할 수 있다. 절차적 프로그래밍
단점
-각 코드가 매우 유기성이 높기 때문에 수정하기가 힘들다.(새로운 데이터 기능 추가가 어려움)
-프로그래밍 전체에서 코드를 재사용 할 수가 없어 프로젝트 개발 비용과 시간이 늘어날 수 있다.
-디버그 (오류 검사)가 어렵다