일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- BFS
- 알고리즘
- 동적 계획법
- Redux
- DP
- java
- Data Structure
- vscode
- 백준
- frontend
- 리트코드
- 안드로이드
- CS
- db
- Javascript
- LeetCode
- Python
- DFS
- 프로그래머스
- 그레이들
- 자바
- 다이나믹 프로그래밍
- git
- TypeScript
- react
- Graph
- network
- Database
- VIM
- Algorithm
- Today
- Total
늘 겸손하게
CS - Software Engineering - 객체 지향 프로그래밍 본문
OOP 이전
OOP 이전에는 주로 절차 지향 프로그래밍 (Procedural Programming) 이론으로 프로그램들이 개발되었습니다.
절차 지향 프로그래밍 방식은 프로그램을 명령어들의 목록으로 보며 각 명령어들이 유기적으로 상호작용하도록 코드를 작성합니다.
이 방식의 장점은 컴퓨터 실행구조와 비슷한 구조라 속도가 매우 빠르다는 점이 있습니다.
대표적인 절차 지향 프로그래밍 언어로는 c언어가 있습니다. 하지만 절차 지향 프로그래밍은 여러 단점들이 있습니다.
절차 지향 언어 단점
1. 유지보수의 어려움
모든 코드가 유기적으로 상호작용하며 실행되므로 코드의 일부분만 수정하는것이 불가능합니다.
코드의 일부분만 고장이 나도 전체 프로그램이 작동하지 않거나 원하지 않는 결과를 출력하게됩니다.
이 때문에 코드의 작은 부분을 고치기거나 새로운 기능을 추가하려면 전체 코드를 수정해야하는 어려움이 존재합니다.
2. 실행 순서가 엄격함
실행 순서가 엄격하여 순서가 조금만 달라져도 실행되지 않거나 결과가 달라집니다.
3. 대형 프로젝트에 부적합
코드량과 기능이 많은 대형 프로젝트에서 모든 기능들이 서로 유기적으로 잘 맞도록 구현하는 일이 어렵습니다.
이런 단점들을 보완하기 위해 객체 지향 프로그래밍(Object-Oriented Programming)이라는 개념이 등장하였습니다.
OOP - 객체 지향 프로그래밍
영어로는 OOP ( Object-Oriented Programming )으로 부르며
프로그램을 명령어들의 목록으로 보는것이 아닌 객체들의 상호작용으로 보는 프로그래밍 이론입니다.
Object - 객체
OOP에서 객체란 실제로 존재하는 사물, 동물, 사람이 될 수도 있고 추상적인 개념이 될 수 있습니다.
자동차를 예로 들자면, 문, 바퀴, 엔진, 와이퍼, 클락션, 브레이크 과 같은 자동차의 특징들이 객체의 속성이되고 전진, 후진, 정차 등 자동차의 행위들이 객체의 행동을 담당하는 메소드가 될 수 있습니다.
위와 같은 객체들의 속성을 변수로 저장하고 객체의 행위들은 메소드로 구현합니다.
객체 속성 - 클래스 변수
객체 행위 - 클래스 메소드
객체 지향 언어의 장점
1. 코드의 재사용성이 높다
상속, 인터페이스 등의 방식으로 한번 작성한 코드를 재사용하는 재사용성이 뛰어납니다.
2. 유지보수가 뛰어남
다른 코드에 영향을 주지 않고 새로운 기능, 데이터를 추가하거나 제거 가능합니다.
3. 코드 이해가 쉽다.
클래스명과 메소드명만으로 어떤 객체인지, 어떤 작업을 하는 함수인지 이해하는것이 쉽습니다.
객체 지향 언어의 단점
1. 처리 속도가 상대적으로 느림
2. 설계하는데 많은 시간과 노력이 필요함
3. 객체가 많으면 용량이 커질 수 있다.
OOP의 특징
객체 지향 언어의 가장 큰 특징은 클래스 입니다.
이 클래스 안에 객체의 속성과 행동을 각각 변수와 메소드로 정의하여 구현할 수 있습니다.
OOP 4대원칙
Encapsulation - 캡슐화
Inheritance - 상속
Polymorphism - 다형성
Abstraction - 추상화
1. Encapsulation - 캡슐화
캡슐화는 객체의 데이터를 내부에 숨겨 다른 사용자로부터의 원하지 않는 접근을 막는 방식입니다.
클래스 내부에서 기능할 데이터는 private 데이터로 선언하고 해당 데이터의 접근 가능한 메소드는 public으로 선언하여 클래스 내부 데이터의 접근을 제한하고 원하는 방식으로만 데이터를 다룰 수 있도록 강제합니다.
이 방식으로 정보 은닉이 가능해집니다.
Information hiding - 정보 은닉
정보 은닉은 객체의 사용자가 객체 내부 작동 방식이나 객체의 데이터를 모르게하여 원하지 않는 접근을 막는 방식입니다.
이 방식을 통해 객체 사용자가 임의로 객체 데이터에 접근하여 오작동을 발생시키는 일을 막습니다.
비슷한 실제 예로, 자전거의 부품인 피스톤을 자전거 제작자만 접근하고 자전거를 구매하여 탑승하는 사람은 건들지 못하게 하는 일입니다.
이를 통해 자전거 탑승자가 임의로 피스톤을 건드려서 기능 고장을 일으키는 일을 막아 원치 않는 기능고장을 막을 수 있습니다.
2. Inheritance - 상속
상속이란 상위 클래스의 특징을 물려받고 새로운 기능까지 추가할 수 있는것을 말합니다.
상속을 통해 코드의 재사용성을 높일 수 있고, 전체 코드량과 중복되는 코드량을 줄일 수 있습니다.
3. Polymorphism - 다형성
다형성은 같은 이름을 가지고 여러 형태를 띄는 일을 말합니다.
다형성을 이루는 방법은 두 가지가 있습니다.
1. Method overloading
클래스 안의 메소드가 하나의 이름으로 경우에 따라서 다른 작업을 하도록 하고 싶을때 메소드 오버로딩을 사용할 수 있습니다.
메소드 오버로딩을 통해 메소드명은 같지만 파라미터가 다른 메소드, 반환값이 다른 메소드 등 서로 다른 작업을 하도록 할 수 있습니다.
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class Main {
public static void main(String [] args) {
Overload overload = new Overload();
overload.printHello(); // Hello
overload.printHello("world"); // Hello world
overload.printHello("world", "class"); // Hello world class
}
}
class Overload {
public void printHello() {
System.out.print("Hello");
}
public void printHello(String name1) {
System.out.print("Hello " + name1);
}
public void printHello(String name1, String name2) {
System.out.print("Hello " + name1 + ", " + name2);
}
}
|
cs |
2. Method overriding
자식 클래스가 부모 클래스를 상속받으면 부모 클래스의 메소드도 사용 가능하게 됩니다.
하지만 경우에 따라서 자식 클래스에서는 상속받은 메소드에 수정을 가하여 사용하고 싶을 수 있는데, 메소드 오버라이딩을 통해 상속받은 메소드를 수정하여 사용 가능합니다.
하지만 메소드 오버라이딩을 할때 지켜야할 규칙이 있습니다. 오버라이딩할 메소드는 상속받은 메소드와 아래 규칙을 지켜야합니다.
- 파라미터가 동일해야함
- 반환값이 동일해야함
- 부모 클래스보다 더 엄격한 접근자가 존재해야함
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Main {
public static void main(String [] args) {
Language l = new JavaLanguage();
l.Introduce(); // Hi I am Java
}
}
class Language {
public void Introduce() {
System.out.print("Hi I am Language");
}
}
class JavaLanguage extends Language {
public void Introduce() {
System.out.print("Hi I am Java");
}
}
|
cs |
4. Abstraction - 추상화
- 공통적인 속성이나 기능을 묶는것
- 추상화하려는 대상을 클래스로 정의하는 것
예로 치타, 곰, 여우 객체가 있다고 가정하자. 이 객체들을 하나로 묶으려한다면 동물, 포유류로 묶을 수 있을것이다.
이렇게 동물, 포유류와 같이 공통적인 속성으로 묶는것을 추상화라고 한다.
'Computer Science' 카테고리의 다른 글
CS - URI , URL 차이 (0) | 2022.06.16 |
---|---|
CS - REST API (0) | 2022.06.16 |
CS - HTTP 메소드 (0) | 2022.06.15 |
CS - Ajax 비동기(async) 방식이란? (0) | 2022.06.14 |
브라우저 기초 + 브라우저 작동 원리 (0) | 2022.05.29 |