OOP란 무엇인가?
OOP(객체지향 프로그래밍)
c언어 같은 절차 지향적 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것이다.
즉 , 실제 사물을 프로그래밍으로 옮겨와 모델링하는 것으로
사물(Object) = 속성(Variable) + 행위(Method)
OOP란 객체를 기준으로 코드를 나누어 구현
자바의 경우 그 구성 부분 단위가 클래스이다.
클래스는 설계도이고 직접 일을 하는 구현체는 인스턴스다.
요약)
- OOP는 객체의 관점에서 프로그래밍하는 것을 의미
- C언어는 절차 지향 프로그래밍 , 절차지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는 것을 말한다.
- OOP는 절차 지향에 비해 사람의 사고방식과 더 가깝다.
- OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다.
- 자바 프로그래밍하면 객체지향 프로그래밍 OOP(Object-Oriented Programming)이라 해도 무방하다.
OOP의 특징
가장 큰 특징으로 나누면 캡슐화 , 다형성 , 상속 , 추상화 이다.
1. 첫 번째 특징 캡슐화(Encapsulation)
캡슐화란?
하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메서드를 하나로 묶는 것을 의미한다.
따라서 클래스를 우리가 만들 때 훗날 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야 할 변수와 그 변수를 가지고 특정한 액션 즉 메서드를 관련성 있게 클래스에 구성해야 함
정보은닉
캡슐화를 하는 중요한 목적은 바로 정보은닉이다.
유저 정보를 가지고 있는 User라는 객체에 유저의 정보가 public으로 선언되어 있으면 누구든 접근해서 정보 변경을
할 수 있다. 그렇게 때문에 private로 해서 데이터를 보호해서 접근을 제한해야 한다.
보호된 변수는 getter 나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것
이것의 캡슐화의 중요한 목적이다.
참고로!
캡슐화랑 정보은닉은 동일한 개념이 아니다
캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에 , 정보은닉을 할 수 있다는 특징이 있다는 것이다.
예) 리모컨을 사용 -> 리모콘 내부 회로(private으로 정의된 속성) -> 알 필요가 없다
사용자 입장 리모컨의 조작 기능 , 즉 public으로 정의된 속성만 알면 됨
2. 두 번째 특징 추상화(Abstraction)
추상화 목적과 관련이 없는 부분을 제거 필요한 부분만을 표현하기 위한 개념
개념 설명을 하자면
세상에 있는 것을 본떠 클래스를 만들고 , 그 클래스의 상태와 행동을 부여한 객체를 만든다.
세상에 모든 것을 다 클래스에 담고 객체를 만드는 것 은 불가능하다.
그래서 추상적으로 생각해 일단 큰 틀을 클래스로 구현하고 거기에 최소 이러한 공통적인 요소나 필수 요소는
들어갔으며 하는 바람으로 만드는 것이 바로 추상 클래스이다.
인터페이스와 추상 클래스
공통적인 요소 나 특징을 추출하는 과정이 추상화
예) 벤츠 아우디, 티코 등등 우리가 생각하는 여러 종류의 자동차가 있다. 이것을 다 클래스화 하고 변수와 메서드를
개별적으로 만드는 것은 무모한 짓
(즉 , 확장성 때문에 추상화할 필요가 있다)
나열한 자동차들의 공통적인 요소 or 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어낸다.
바퀴 + 핸들 + 차문 + 유리창 등 필수적인 부품
바퀴는 굴러감 , 차문은 열려야 한다. -> 공통적인 행위 즉 어떤 차든 필수적으로 필요한 메서드를 추출한다.
이러한 과정이 추상화 과정이다.
개념들을 큰 틀에서 클래스로 만드는 것이 바로 추상 클래스이다.
객체들은 실제 그 모습이지만 , 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념
추상화는 객체들의 공통적인 특징을 파악해서 정의해 놓은 설계기법이다.
3. 세 번째 특징 다형성(Polymorphism)
다형성은 상속을 통해 기능 확장하거나 변경하는 것을 가능하게 해 준다.
즉 다형성은 형태가 같은데 다른 기능을 하는 것을 의미한다.
(같은 동작이지만 다른 결과물이 나올 때 다형성이라고 한다.)
이를 통해 코드의 재사용 , 코드 길이 감소가 되어 유지보수가 용이하도록 도와준다.
개념 설명
예를 들어 고양이 클래스에는 울음이라는 속성이 정의되어 있다면
사자는 고양이 고가이기 때문에 사자 클래스는 고양이 클래스를 상속받는다고 하면
사자 클래스에는 울음이라는 속성이 자동으로 추가됨
이것을 상속이라고 한다.
그런데 고양이와 사자는 울음소리가 다르다.
울음 속성임에도 실제 울음소리가 다르므로 이런 것이 다형성이라고 할 수 있다.
Overriding & Overloading
OOP에서 다형성의 개념을 녹여내는 방법은 두 가지
바로 오버 라이딩과 오버 로딩이다.
- 오버 라이딩 : 부모 클래스에서 상속받은 자식클래스에서 부모클래스에서 만들어진 메서드를 자식 클래스에서 자신의 입맛대로 다시 재정의 해서 사용하는 것을 말함
- 오버 로딩 : 같은 이름의 메서드를 사용하지만 메서드마다 다른 용도로 사용됨 그 결과물도 다르게 구현할 수 있게 만드는 개념이다.
오버 로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 다르며 오버 로딩이 적용됨
메서드 이름이 같아도 문법 에러가 생기지 않는다.
// Overriding
public class Employee{
public String name;
public int age;
public void print(){
System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
}
}
//Emplyee 상속
public class Manager extends Employee{
String jobOfManage;
//overriding Employee의 pirnt() 메소드 오버라이딩
public void print(){
System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
System.out.println("관리자 "+this.name+"은 "+this.jobOfManage+" 담당입니다.");
}
}
//Overloading
public class OverloadingTest{
public void test(){
System.out.println("사용자 없음");
}
public void test(String name){
System.out.println("사용자 이름 = " +name);
}
public void test(String name, int money){
System.out.println("사용자 이름 = "+name+" , 사용료 = "+money);
}
}
다형성을 사용하면 좋은 점은?
같은 이름의 속성을 유지함으로써 속성을 사용하기 위한 인터페이스를 유지 , 메서드 이름을 낭비하지 않는다는 것
예를 들면 고양이와 사자의 울음소리 호출하기 위해 각 객체에서 roar() 메서드를 호출하면 됨
roraCat() , roarLion()으로 각각을 정의할 필요가 없다
API가 많을수록 복잡성은 증가하기 때문에 다형성은 매우 유용하다.
4. 네 번째 특징 상속 성, 재사용(Inheritance)
상속은 객체지향의 꽃이다.
상속이란 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념
기존 클래스에서 기능을 가져와서 재사용할 수 있으면서 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 됨
자바에서는 상속은 단일 상속 밖에 안됨 C++ 에선 다중 상속이 가능
다중상속이 안되므로 대비책으로 인터페이스를 다중 상속(구현) 할 수 있게 해서 임시적인
다중 상속에 대한 활로는 뚫어줌
그러나 인터페이스의 존재 이유가 다중 상속을 지원하기 위함이다라고 생각하면 안 된다.
개념 정리
실제 세계에서는 부모로부터 여러 가지 상속을 받는다.
이것은 OOP에서도 가능
OOP에서는 이를 부모 클래스 , 자식 클래스라고 표현한다.
상속이 필요한 이유
가장 큰 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 유지보수가 힘들어진다. 개발을 할 때 코드의 중복은 피해야 된다.
OOP에서는 상속을 통해서 코드의 중복 문제를 해결한다.
상속관계를 맺으면 자식 객체를 생성할 때 부모의 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없어진다.
이것이 상속이 필요한 이유이다.
자료 출처
https://kim-hoya.tistory.com/37
https://limkydev.tistory.com/30
https://velog.io/@walker/OOP% EB% 9E%80
https://goodgid.github.io/What-is-OOP/
'개발자 면접준비' 카테고리의 다른 글
기술 면접 CS 질문 (1) | 2023.12.11 |
---|---|
[개발자 면접준비] DOM 과 XML은 무엇인가 ? (0) | 2022.03.16 |
[개발자 면접준비] DTO 와 VO의 차이는 ? (1) | 2022.03.15 |
[개발자 면접준비] 쿠키와 세션이란 ? (0) | 2022.03.15 |
[개발자 면접준비] MVC를 지키면서 코딩하는 방법 (0) | 2022.03.15 |