포도가게의 개발일지

OOP(객체지향프로그래밍)? 본문

CS

OOP(객체지향프로그래밍)?

grape.store 2022. 1. 4. 23:20
반응형

객체지향프로그래밍이란?

- OOP (Object-Oriented Programming)이란 객체 지향적인 프로그래밍. 즉, C언어같은 절차 지향적인 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것이다.

- 객체의 관점이 뭘까? 그 객체가 특정한 목적을 위해 필요한 데이터(필드)나 기능(메소드)를 하나로 묶는 것을 의미한다.

 

객체가 뭘까?

- 객체는 컴퓨터 자원인 데이터(필드)와 기능(메서드)를 class로 캡슐화(묶어)한것

 

why? 개발자가 방대해진 코드를 좀 더 간편하게 유지보수하기 위해

캡슐화

  • 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미한다.
  • 따라서 클래스를 우리가 만들 떄 훗날 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야할 변수와 그 변수를 가지고 특정한 액션 즉 메서드를 관련성 있게 클래스에 구성해야한다.

* 캡슐화와 정보은닉은 동일한 개념이 아니다. 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다는 것이다.

추상화

  • 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법
  • 추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념이다.
  • 공통분모를 찾아내어 객체화 시킴
  • 과학실청소, 음악실청소 도 전부 교실청소처럼 바닥쓸기, 창문닦기, 칠판닦기를 해야한다.( 벤츠,아우디,Bmw의 바퀴, 핸들, 전진, 후진과 같다)

상속성, 재사용

  • 상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다.
  • 기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.

다형성

  • 다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다. 즉, 다형성은 형태가 같은데 다른 기능을 하는 것을 의미한다.
    이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하도록 도와준다.
  • 오버라이딩(메서드 재정의), 오버로딩(매개변수에 따른 같은이름의 다른 기능 메서드)

 

how?

예를들어

## 아래와 같은 코드에서는 동일한 데이터와 기능이 반복되며 코드의 유지보수를 위해서는 다 바꿔줘야됨 ##

철수_쓰레받기 = 0;
철수_교실 = 101호;

영수_쓰레받기 = 0;
영수_교실 = 102호;

희수_쓰레받기 = 0;
희수_교실 = 103호;

while(철수청소){ code }
while(영수청소){ code }
while(희수청소){ code }
## 하지만 중복되는 데이터(필드) 및 기능(메서드)를 캡슐화함으로써 코드의 유지보수와 재활용이 쉬워진다 ##

class 바닥청소{
	private Room 교실;
    private int 쓰레받기 = 0;
    
    public 바닥청소(Room 교실이름){
    	교실 = 교실이름;
    }
    
    public void 바닥쓸기(){
    	while(){
        	code
        }   
    }
}

바닥청소 철수 = new 바닥청소(101호);
바닥청소 영수 = new 바닥청소(102호);
바닥청소 희수 = new 바닥청소(103호);

철수.바닥쓸기(); 영수.바닥쓸기(); 희수.바닥쓸기();

 

바닥청소 목적만 아니라, 칠판청소, 창문청소를 더 간편하게 쓸 수 없을까?

## interface나 abstract class를 이용하여 청소라는 기능을 오버라이드하여 묶어 줄 수 있다 ##

Public interface 청소구역(){
	public void 청소();
}

class 칠판청소 implements 청소구역{
	private Room 교실;
    private int 지우개 = 10;
    
    public 칠판청소(Room 교실이름){
    	교실 = 교실이름;
    }
    
    public void 칠판닦기(){
    	while(){
        	code
        }   
    }
    
    @Override()
    puliic void 청소(){
    	칠판닦기();
    }
    
}

class 창문청소 implements 청소구역{
	private Room 교실;
    private int 윈덱스 = 10;
    
    public 창문청소(Room 교실이름){
    	교실 = 교실이름;
    }
    
    public void 창문닦기(){
    	while(){
        	code
        }   
    }
    
    @Override()
    puliic void 청소(){
    	창문닦기();
    }
    
}
## 청소 기능(메서드)로 묶어줌으로써 좀 더 간편하게 코드를 유지보수할수 있다 ##
## 바닥청소의 쓰는순서를 바꾸고싶으면 바닥청소 객체에서 바닥쓸기 메서드만 수정하면 되게 된다 ##

바닥청소 철수 = new 바닥청소(101호);
바닥청소 영수 = new 칠판청소(102호);
바닥청소 희수 = new 창문청소(103호);

list = [철수, 영수, 희수]
for x in list:
	x.청소();

'CS' 카테고리의 다른 글

정규 표현식  (0) 2022.03.26
Solid 원칙  (0) 2022.01.31
Mutex vs Semaphore vs Monitor  (0) 2021.12.27
Web Server  (0) 2021.12.25
동적 메모리 할당 분리가용 리스트  (0) 2021.12.23
Comments