객체지향 프로그래밍에 대해 정리해본다.
IT기업 신입사원 기술면접에서 면접자들 긴장을 풀어줄 겸 워밍업으로 자주 나오는 가장 기본 질문 개념이라고 하는데 정말...? 😭
컴퓨터 프로그래밍 패러다임 중 하나이다.
하는 프로그래밍 방법
▶ 코드 재사용성 높음
▶ 유지 보수가 쉬움
절차지향 프로그래밍 (반대 개념)
수정해야 할 코드를 흐르는 코드 속에서(?) 찾아 수정해야 함
▶ 모듈화 개발 가능 -> 대형 프로젝트에 적합
▶ 처리 속도가 상대적으로 느림
▶ 객체가 많으면 용량이 커질 수 있음
▶ 설계 시 많은 시간과 노력 필요
예: 커피 머신 생각해보기 ☕
기계 안에서는 많은 일이 일어나고 소리가 시끄럽지만
사람이 해야 할 일은 커피를 넣고 버튼을 누르는 것이 전부
즉, 객체지향 프로그래밍이란 추상화된 집합들이 모여 만들어진 것
즉, 자녀 클래스는 부모 클래스의 모든 필드와 메소드(= 공통되는 부분)를 재사용하고, 자체적인 것(= 독립 부분)만 자신 쪽에 구현해서 사용
다중 상속은 불가
- 클래스의 상속 관계에서 혼란을 줄 수 있기 때문에
- 상속은 반드시 하나만 가능
- 필요에 따라 인터페이스를 사용하도록 함
즉, 객체는 자신의 상태를 메소드를 통해 관리한다.
어떤 다른 클래스라도 (예외적으로 허용되지 않는 이상) 상태를 직접 변경할 수 없음
1. 코드를 수정 없이 재활용
2. 접근 제어자를 통한 정보 은닉
절차 지향 프로그래밍에서도 변수와 함수 재활용이 가능하지만, 코드의 수정이 일어났을 때 영향 범위를 예상하기 어렵다.
객체 지향 프로그래밍에서는 캡슐화를 통해 객체가 외부에 노출하지 않아야 할 정보나 기능을 접근 제어자를 통해 제어 권한이 있는 객체에서만 접근하도록 할 수 있다.
따라서 코드의 수정이 일어났을 때 책임이 있는 객체만 수정하면 되어서 영향의 범위를 예측하는데 수월하고 재사용도 쉬워졌다.
즉, 기능과 특성을 "클래스"라는 "캡슐"에 분류해서 넣는 것
=> 객체가 맡은 역할을 수행하기 위해 하나의 목적을 한데 묶음 (SRP)
멤버 변수에 직접 접근할 수 없도록
private으로 접근 지정자를 설정(= 캡슐화)하고
getter, setter 메서드는 public으로 만든다.
🤔 public 메서드면 아무나 접근 가능할텐데 왜 private?
=> getter, setter를 사용하여 메서드를 통해서 접근하는 과정에서
잘못된 매개변수와 같은 올바르지 않은 입력에 대해
메서드 내부에서 사전에 처리(제한 및 조절)가 가능하기 때문
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것
부모 클래스부터 상속된 몇 개의 자녀 클래스가 있다고 가정해보자.
이러한 클래스들이 모두 혼합되어 담겨있는 컬렉션(예: 리스트)를 사용하고 싶거나
부모 클래스를 위해 구현된 메소드를 자녀 클래스를 통해서도 사용하고 싶을 때
=> 다형성을 사용하여 해결 가능
어떤 클래스를 부모 클래스와 정확히 동일하게 사용하여
혼합된 타입에 대한 혼란이 발생하지 않도록 함
그림 예시가 있었다 😊
도형들은 면적과 둘레를 계산하기 위해 일반 인터페이스를 재사용
삼각형과 원, 사각형 도형이 모여 각자 Figure 인터페이스를 참조
부모 Figure Interface를 가지고 triangles, circles, rectangles 등의 도형을 생성 가능
이 도형들의 면적을 계산하려 하면 인터페이스에서 올바른 메소드가 찾아지고 실행됨
구성 요소가 삼각형이라면 삼각형의 CalculateSurface()가 호출되고 원이라면 원의 CalculateSurface()가 호출되는 식
도형이 자신의 매개 변수(parameter)를 이용하여 동작하는 함수를 상위(인터페이스)에서 사용할 수 있음
=> 같은 함수를 세 번(삼각형, 원, 사각형 각각) 정의할 필요가 없음
정의는 Figure를 인터페이스에서 한 번만 하고
삼각형, 원, 사각형 어떤 것이든 해당 함수를 필요로 하는 객체를 만들 수 있다.
오버라이딩
부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것
오버로딩
같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것
[ 프리온보딩 수업 내용 👸 ]