우노
[Java] 객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란? 본문
- "객체 지향 프로그래밍에 대해 설명 한 번 해주세요."
- 여러 SW기업 신입사원 기술면접에서 워밍업 느낌으로 면접자들의 긴장을 풀어줄 겸 처음으로 자주 나오는 질문이다.
- 가장 기본이면서 이것마저 대답을 명확하게 못하면 첫인상이 안 좋아지는(?) 결과를 만드는 질문이며,
- 워밍업 같지만 꼬리에 꼬리를 무는 모든 질문의 시작(?)이다.
객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란?
- 객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로,
- 프로그래밍에서 필요한 데이터를 추상화시켜, 상태와 행위를 가진 객체를 만들고
- 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 이다.
- 이러면, 이제 꼬리에 꼬리를 무는 질문이 시작된다.
- "객체 지향 프로그래밍을 했을 때 장점이 뭐에요?"
- "객체 지향 프로그래밍의 특징을 말씀해주세요."
- "객체(또는 클래스)가 뭐에요?"
- => 결국 객체 지향의 5가지 키워드와 관련된 내용과 장단점을 알고 있는지에 대한 질문이다.
객체 지향 프로그래밍의 장, 단점을 간단하게 설명해주세요.
장점
- 코드 재사용이 용이
- 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.
- 유지보수가 쉬움
- 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.
- 대형 프로젝트에 적합
- 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.
- 코드 재사용이 용이
단점
- 처리속도가 상대적으로 느림
- 객체가 많으면 용량이 커질 수 있음
- 설계 시 많은 시간과 노력이 필요
객체 지향 프로그래밍의 5가지 키워드
- 클래스 + 인스턴스(객체)
- 추상화
- 캡슐화
- 상속
- 다형성
클래스와 인스턴스(객체)는 무엇인지 설명해주세요.
- 클래스
- 어떠한 문제를 해결하기 위해 필요한 속성(attribute)과 행위(behavior)를, 변수와 메서드로 정의해 묶어둔 것이다.
- 인스턴스(객체)
- 클래스에서 정의한 것을 토대로 실제 메모리상에 할당하는 것으로, 실제 프로그램에서 사용되는 데이터이다.
추상화가 무엇인지 설명해주세요.
- 불필요한 정보는 숨기고, 중요한 정보만을 표현함으로써, 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
캡슐화가 무엇인지 설명해주세요.
- 캡슐화의 목적
- 코드를 재수정 없이 재활용하는 것
- 기존의 프로그램 코드에서는 변수와 함수가 분산되어 있기 때문에 재활용이 어려웠으나,
- 캡슐화를 통해 관련된 특성과 기능을 한 곳에 모으고 분류하기 때문에 재활용이 원할해졌다.
- 객체 지향 프로그래밍에서 특성과 기능의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는 것이 캡슐화이다.
- 객체가 맡은 역할을 수행하기 위한 하나의 목적을 하나로 묶는다.
상속이 무엇인지 설명해주세요.
- 절차 지향 프로그래밍에서도 "라이브러리"를 통해서 남이 짜놓은 소스 코드를 가져와 사용할 수 있었다.
- 하지만 내 의도에 맞게 수정하면 다른 라이브러리가 되어, 버전에 따라 동작하지 않을 수도 있고 불필요한 코드수정작업을 해야한다.
- 이런 문제를 해결하기 위해 "상속"이라는 것을 도입하였다.
- 상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고,
- 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것이다.
- 하지만, 다중상속은 불가하다.
- 클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하다.
- 하지만 필요에 따라 여러 인터페이스를 상속하는 방법이 있다.
다형성이 무엇인지 설명해주세요.
- 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다.
- 즉, 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.
- 오버라이딩 : 부모클래스의 메소드를 재정의해서 사용하는 것.
- 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여, 필요에 따라 다르게 호출할 수 있게 하는 것.
getter, setter를 사용하는 이유를 설명해주세요.
- getter, setter를 사용하면 메서드를 통해 멤버변수에 접근하기 때문에,
- 메서드 안에서 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있다.
- 예를 들면, setter에서 유효범위를 넘은 정수가 들어왔을 때, 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것이다.
- getter도 마찬가지로 굳이 예를 들자면, 자료에 무언가를 더하거나 빼고 준다든지가 가능하다.
참고
'Language > Java' 카테고리의 다른 글
[Java] 오버로딩(Overloading)과 오버라이딩(Overridding)의 차이 (0) | 2021.03.12 |
---|---|
[Java] extends, implements의 차이 (2) | 2021.03.12 |
[Java] Superinterface란? (0) | 2021.03.12 |
[Java] 컴파일과 빌드의 차이점 (0) | 2020.07.17 |
[Java] JAR 란? (0) | 2020.07.17 |
Comments