1. OOP 개념
객체지향 프로그래밍(Object Oriented Programming)은 문제를 여러 개의 객체 단위로 나눠 작업하는 방식을 말합니다.
상태와 행위를 가진 객체들을 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것을 객체 지향 프로그래밍이라고 할 수 있다.
이 방식은 오늘날 가장 많이 사용하는 대표적인 프로그래밍 방식이고 JAVA, C# 등이 대표적인 객체지향 프로그래밍 언어입니다.
* 객체 : 세상에 존재하는 모든것, 프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹
[EX] 컴퓨터(객체) = 데이터(본체, 모니터, 키보드) + 기능(화면, 소리, 입력, 출력)
2. OOP 특징
객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리 부분(함수)과 데이터 부분(변수)을 하나의 객체(인스턴스)로 묶어 생성해 사용한다는 점이다.
클래스를 통해 생성된 인스턴스들은 서로 다른 각자의 이름을 가지고 있고 속성과 기능을 독립적으로 갖는다.

클래스를 통해 생성된 인스턴스들은 서로 다른 각자의 이름을 가지고 있고 속성과 기능을 독립적으로 갖는다.
객체 지향 프로그래밍은 캡슐화, 추상화, 상속성, 다형성 네 가지 특성을 지닌다.
1) 추상화(자료의 추상화)
불필요한 정보는 놔두고, 중요한 정보만을 표시함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것.
물고기, 사자, 토끼, 뱀이라는 이름을 가진 객체가 각각 있고 이 객체들을 하나로 묶으려고 할 때, 동물 또는 생물이라는 추상적인 객체로 크게 정의하여 묶는 것을 추상화라고 한다.
객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.
정리하면 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.
2) 캡슐화
데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것이다.
=> 변수와 함수를 하나로 묶는 것을 뜻한다.
캡슐화를 통해 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 재활용이 원활한 효과가 있으며,
데이터와 코드의 형태를 외부로부터 알 수 없게하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법이다.
캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근을 허용하는 것 이다.
캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다.
* 캡슐화와 정보은닉은 동일한 개념은 아니다.
3) 상속
상속이란 기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다.
(기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있다.)
즉, 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식에게 모두 물려준다.
OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다.
상속이 필요한 이유는 코드의 중복을 없애기 위해서다.
(코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 된다.)
상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.
4) 다형성
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것.
쉽게 말하면 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 것이다.
오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예라 할 수있고,
이것을 구현하는 걸 오버로딩(Overloading)과 오버라이딩(Overriding)이라고 한다.
- 오버라이딩 : 부모클래스의 메소드와 같은 이름, 매개변수를 재정의 하는 것.
하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다. - 오버로딩 : 같은 이름의 함수를 여러개 정의하고 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있도록 하는 것.
하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현하는 것을 말한다
예시)
1. 오버로딩 (Overloading)
오버로딩은 앞서 말씀드린 것 처럼
"이름은 같지만 그냥 다른 함수"입니다.
|
class Overloading{
public void same(int param){
System.out.println("숫자를 출력하는 함수입니다.");
}
public void same(String param){
System.out.println("문자를 출력하는 함수입니다.");
}
}
public class OverloadingDemo {
public static void main(String[] args) {
Overloading o = new Overloading();
o.same(1);
o.same("one");
}
}
|
Overloading이라는 클래스 안에 "same"이라는 같은 이름의 함수 2개를 만들었습니다.
그러나 첫번째는 int 형태의 인자를 받으며, 두번째는 String 형태로 받습니다.
그렇게 때문에 그냥 함수 이름만 같을 뿐,
컴퓨터가 보기에는 전혀 다른 함수입니다.
참고로, Java에서 함수를 구분하는 조건은 다음과 같습니다.
1. 메소드의 이름
2. 메소드 매개변수의 숫자와 데이터 타입 그리고 순서
3. 메소드의 리턴 타입
이 3가지 중에 하나라도 다르면 그냥 전혀 다른 함수인것이죠.
우리가 보기에 비슷할 뿐입니다.
앞선 예제에서는 메소드 이름이 동일하지만,
2번 매개 변수의 타입이 달랐기에 전혀 다른 함수가 되는것입니다.
그렇기에 아래의 출력 결과는 다음과 같습니다.
| o.same(1); // "숫자를 출력하는 함수입니다."
o.same("one"); // "문자를 출력하는 함수입니다."
|
즉 same이라는 겉보기에 같은 함수를 호출하였지만,
실제로는 전혀 다른 함수를 호출한것이라, 그냥 각각의 기능을 수행한 것이다.
2. 오버라이딩 (Overriding)
오버라이딩은 앞서 말씀드린 것 처럼
"부모에게 물려받아 변형한 함수"입니다.
부모로부터 물려받은 동일한 함수를 사용하였지만, 자식이 변형하여 새로 정의한게 더 중요시 된다.
즉, Overriding은 같은 함수인데, 변형에 따른 우선 순위를 따지는 것이다.
|
// 부모 클래스
class Calculator {
public void sum(int left, int right) {
System.out.println(left + right);
}
}
// 자식 클래스
class OverridingCalculator extends Calculator {
public void sum(int left, int right) {
System.out.println(left + right + "입니다.");
}
}
// 실행
public class Demo {
public static void main(String[] args) {
OverridingCalculator c1 = new OverridingCalculator(); // 자식 인스턴스 생성
c1.sum(10,20); // 결과 : "30입니다."
}
}
|
부모 클래스에서 sum이라는 함수를 left + right 로 정의하였고,
자식이 그 부모를 상속받아 동일한 sum이라는 함수를 사용하였습니다.
(앞서 언급한 java가 인식하는 같은 함수의 조건을 모두 만족합니다.)
그러나 "입니다."라는 새로운 문장을 출력값에 추가해주는 변형을 하였죠!
그렇기에 이것을 Overriding이라고 부르며 java는 자식이 변형한 함수에 우선순위를 줍니다.
그렇기에 결과값으로 "30입니다."가 출력되는 것이지요.
다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다.
API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념이다.
OOP는 위 네 가지 특성들을 통해서 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한 군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다. 상속받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있다.
3. OOP 장점 및 단점
장점
- 코드 재사용성 증가
상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있다.
- 생산성 향상
잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다.
- 자연적인 모델링
우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
- 유지보수의 우수성
프로그램 수정시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기때문에 유지보수가 쉬워서 매우 경제적이라할 수 있다.
단점
- 개발속도가 느린점
객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모 된다.
- 실행속도가 느린점
객체지향언어는 대체적으로 실행속도가 느리다.
- 코딩 난이도 상승
다중 상속이 지원되는 C++ 같은 경우에 너무 복잡해져 코딩의 난이도가 상승할 수 있다.
객체 지향적 설계 원칙이란?(SOLID)
다른페이지에서 상세하게..(클릭)!!
https://developerdk.tistory.com/6
'개발공부 > 개념정리' 카테고리의 다른 글
| 브라우저에서 서버까지의 응답에 대한 흐름 이해하기! (0) | 2022.06.14 |
|---|---|
| SOLID - 객체지향적 설계 원칙 (0) | 2022.06.14 |
| Redis (Remote Dictionary Server) (2) | 2022.06.08 |
| HTTP, HTTPS, SSL, TLS (0) | 2022.06.07 |
| @Annotation 개념 및 사용방법 (0) | 2022.04.20 |