본문 바로가기

CS/Java

객체지향 프로그래밍

 

 

 

프로그래밍을 하기 위한 언어는 여러 가지가 있는데,

이 언어들을 크게 2가지로 나눌 수 있다.

 

" 절차지향 또는 객체지향 "

 

그런데 나는 절차지향과 객체지향이 어떤 것인지도 모르고 언어를 사용하고 있어서,

이번 포스팅에서는 자바를 공부하는 겸

객체지향이 무엇인지, 어떤 특징들을 가지고 있는지에 대해서 알아볼 것이다.

 

 

 

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

 

여러 개의 독립된 단위, 즉 객체들이 주어지고

이 객체들끼리 메시지를 주고받아 데이터를 처리할 수 있게 하는

컴퓨터 프로그래밍의 패러다임 중 하나이다.

 

 

이렇게 말하면 무슨 뜻인지 정확히 안 와 닿을 수 있으니,

객체지향의 특징을 통해 설명해볼것이다.

 

먼저, 객체지향의 특징들을 나열해보자면

추상화, 캡슐화, 상속성, 다형성이 있다.

 

 

 

추상화란?

어떤 실체(객체)들에서 내가 관심 있는 공통적인 부분을 추출하여 하나의 분류로 만드는 것이다.

 

예를 들어, 한 패스트푸드점의 주문 앱을 만든다고 가정해보자.

주문을 하려면 메뉴가 표시되어야 하는데,

메뉴를 표시하려면 메뉴의 이름, 가격, 인기 메뉴를 표시하기 위한 판매량 등이 필요하다.

 

이때, 메뉴의 이름, 가격,  판매량은 각 메뉴(실체들)마다 공통적으로 필요한 것이므로

내가 관심 있는 공통적인 부분이라 할 수 있고,

이것들을 포함한 food라는 클래스를 만드는 것을 추상화라고 하는 것이다.

 

밑에는 앞서 설명한 예시를 코드로 나타낸 것이다.

 

public class food {
	String name;
    int price;
    int sales;
}

 

그렇다면, 이번에는 캡슐화에 대해서 알아보자.

 

위의 예시에서 치즈버거가 메뉴에 포함되어 있다고 가정하면,

치즈버거를 메뉴에 표시하기 위해서는 이름과 가격, 판매량을 세팅해줘야 한다.

그러므로 필요한 정보들을 각각 세팅하는 함수가 필요한데,

이를 추가한 코드는 다음과 같다.

 

public class food {
	String name;
    int price;
    int sales;
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public void setPrice(int price) {
    	this.price = price;
    }
    
    public void setSales(int sales) {
    	this.sales = sales;
    }
}

 

위의 코드에서 볼 수 있듯이 food라는 클래스에는

name, price, sales 변수와 setName, setPrice, setSales 함수가 존재하는데

이처럼 변수와 메서드를 하나의 추상화된 클래스로 묶는 것을 바로 캡슐화라고 한다.

 

 

그렇다면 상속성은 무엇일까?

 

앞에서 가정했듯이, 치즈버거라는 메뉴가 있다면,

치즈버거 메뉴의 이름, 가격, 판매량을 세팅하기 위해

food라는 클래스의 변수들과 메서드들이 필요하게 될 것이다.

 

따라서 cheeseburger 클래스는 food 클래스를 물려받아야 하고 이것을 바로 상속이라고 한다.

 

다음 코드는 food 클래스를 상속받은 cheeseburger 클래스의 모습이다.

 

public class cheeseburger extends food {
	
    pubic static void main(String[] args) {
    	cheeseburger cheese = new cheeseburger();
        cheese.setName("딥치즈버거");
        cheese.setPrice(5400);
        cheese.setSales(5000);
    }
}

 

상속을 받을 땐 extends라는 것을 이용하며,

상속 받음으로써, cheeseburger 클래스에

변수와 메서드들을 따로 정의해주지 않아도 사용할 수 있는 것이다.

 

객체지향의 이러한 특징은 코드를 재사용할 수 있게 함으로써

생산성을 훨씬 높일 수 있게 된다.

 

 

그렇다면, 마지막으로 다형성에 대해 알아보자.

 

다형성이란?

하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.

 

먼저, food라는 클래스에 메뉴 이름을 출력하는 함수를 추가해보자.

 

public class food {
	String name;
    int price;
    int sales;
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public void setPrice(int price) {
    	this.price = price;
    }
    
    public void setSales(int sales) {
    	this.sales = sales;
    }
    
    public void printName() {
    	System.out.println(this.name);
    }
 }

 

그리고, 치즈버거는 어린이용이어서 이도 메뉴에 표시해야 된다고 해보자.

 

어떻게 표시해야 할까..?

 

만약에 food class에 printName 메서드를 이용한다고 한다면,

"딥치즈버거" 까지만 표시가 될 것이다.

 

그렇다면, 다른 방법을 이용해야 하는데...

바로 메서드 오버라이딩이라는 것을 이용하면 된다.

 

메서드 오버라이딩이란?

부모 클래스의 메서드를 자식클래스가 동일한 형태로 또다시 구현하는 행위

 

로, 부모클래스의 메소드를 조금만 변경하여 구현할 수 있다.

 

public class cheeseburger extends food {
	public void printName() {
    	System.out.println(this.name + "(어린이용)");
    }
    
    public static void main(string[] args) {
    	cheeseburger cheese = new cheeseburger();
        cheese.setName("딥치즈버거");
        cheese.setPrice(5400);
        cheese.sales(5000);
        cheese.printName();
    }
}

 

위 코드처럼 작성하게 되면, 

cheeseburger 클래스의 printName 메서드가 food 클래스의 printName 메서드보다

더 높은 우선순위를 갖게 되어 cheeseburger 클래스의 printName 메서드가 호출되게 된다.

 

그럼 아마 이러한 결과가 나오게 될 것이다.

"딥치즈버거(어린이용)"

 

이렇게 다형성이란 앞에서도 말했지만

 메서드나 클래스(위의 예시에서는 printName) 를 다양한 방법으로 동작하는 것을 의미한다.

 

 

지금까지 객체지향의 특징 4가지에 대해 알아보았다.

위 4가지 특징들이 바로 객체지향이라고 할 수 있다.

이 특징들을 이용하여 객체들끼리 메시지를 주고받아 데이터를 처리할 수 있게 되는 것이다.

 

 

 

끝!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'CS > Java' 카테고리의 다른 글

Interface  (2) 2020.06.07
Toast  (0) 2020.05.14
Scanner  (0) 2020.05.07
BufferedReader  (0) 2020.05.07
InputStreamReader  (0) 2020.05.07