본문 바로가기
Programming/Java

[Java] 0 - (1). 객체 지향 프로그래밍이란 무엇인가

by Rayched 2022. 9. 13.

앞에서 자바의 정의와 특징들을 설명할 때, 자바의 특징인 '객체지향 언어'라는 부분에 대해 설명하지 않고 넘어갔었다.

이번에는 객체 지향 언어, 객체 지향 프로그래밍에 대해 정리해보겠다.

 

우선 내가 RPG 게임을 만드는 개발자라고 가정해보자.

캐릭터 하나를 만들어야 한다면, 해당 캐릭터의 직업과 스킬, 체력, 공격력 등의 여러 속성을 입력해줘야 한다.

이를 Java를 사용해서 코드를 만든다면 아래와 같이 만들 수 있다.

public class Main {
	public static void main (String[] args){
    	String 직업 = "전사";
        String 스킬 = "내려치기";
        int 체력 = 100;
        int 공격력 = 60;
    }
}

'전사' 캐릭터 하나를 만든다면 이렇게 만들 수 있다.

이번엔 게임을 플레이하는 유저가 다른 직업을 만들어달라는 요청을 받고, 다른 직업을 만든다면 아래와 같이 만들 것이다.

public class Main{
	public static void main(String[] args){
    	//캐릭터 1
    	String 직업 = "전사";
        String 스킬 = "내려치기";
        int 체력 = 100;
        int 공격력 = 60;
        
        //캐릭터 2
        String 직업2 = "마법사";
        String 스킬2 = "파이어볼";
        int 체력2 = 60;
        int 공격력2 = 80;
    }
}

이런식으로 코드를 순서대로 작성하는것을 절차 지향 프로그래밍 방식이라고 한다.

 


절차 지향 프로그래밍 (Procedure Oriented Programming, POP)

  • 프로그램이 실행되면 코드를 작성한 순서대로 진행하고, 모든 순서가 종료되면 프로그램도 종료된다.
  • C, VB, Pascal 등이 절차 지향 프로그래밍 방식을 사용한다.

절차 지향 프로그래밍 방식은 다음과 같은 특징들을 가지고 있다.

① 기능을 우선시하여 프로그래밍을 한다. 

② 데이터 접근이 용이하다.

- 대부분의 함수가 전역 데이터를 사용하기 때문에, 데이터 접근이 용이하다.

③ 데이터의 모듈화가 어렵다.

 - 모듈화: 프로그램의 코드를 기능 별로 나눠서 독립된 파일에 저장하여 관리하는 방식

 - 데이터의 모듈화가 어렵다는 것은 기존 프로그램에서 데이터나 기능을 추가해야 할 때

   기존에 작성한 코드를 수정해야 하고, 코드의 길이가 늘어날수록 유지보수가 어려워진다.

 

앞에서 작성했던 코드를 다시 살펴보자.

public class Main{
	public static void main(String[] args){
    	//캐릭터 1
    	String 직업 = "전사";
        String 스킬 = "내려치기";
        int 체력 = 100;
        int 공격력 = 60;
        
        //캐릭터 2
        String 직업2 = "마법사";
        String 스킬2 = "파이어볼";
        int 체력2 = 60;
        int 공격력2 = 80;
        
        //캐릭터 3
        String 직업3 = "사제";
        String 스킬3 = "힐링";
        int 체력3 = 70;
        int 공격력3 = 50;
    }
}

게임 개발이 진행될수록, 추가해야할 직업의 개수는 계속해서 늘어날 것이고

늘어난 직업에 비례해서 코드의 길이도 늘어날 것이고, 중간에 오류가 발생하면 긴 코드 속에서 원인을 찾아내는 작업이

여간 쉽지는 않을 것이다.

이런 식으로 절차 지향 프로그래밍 방식의 단점을 보완하기 위해서 고안된 것이 객체 지향 프로그래밍 방식이다.

 


객체 지향 프로그래밍 (Object Oriented Programming, OOP)

 

① 프로그래밍의 방식 중 하나, 데이터에 대한 생각이나 구조 방식

 

② 절차 지향의 단점을 보완하여 개발된 언어, 기능 위주의 절차 지향과 달리

    '객체'라는 것을 통해서 데이터와 함수를 모듈화하여 프로그램의 유지 보수와 보안성을 강화했다.

 

③ 'C#', 'Java'와 같은 대기업 등에서 사용하는 프로그래밍 언어도 객체 지향 언어이고,

     'JavaScript,' 'Python' 같은 객체 지향 방식이  아닌 언어들도 객체 지향 방식을 지원한다.

 

④ 객체 지향 프로그래밍 언어를 배우면, 해당 언어의 기술을 다른 언어를 사용할 때도 활용할 수 있음


객체 지향 프로그래밍 방식이 가지는 특징은 다음과 같다.

 

① 캡슐화 Encapsulation

- 데이터나 데이터를 활용하는 함수를 '캡슐' 안에 넣어두는 것

  여기서 캡슐은 'class'를 의미한다.

- 데이터를 캡슐화함으로써, 상황에 따라 프로그램 외부에서 접근 가능한 데이터를 지정하는 것이 가능함.

  클래스의 표시할 속성과 숨길 속성을 선택할 수 있음.

 

② 추상화 Abstraction

- 구현 세부 정보를 숨기는 일반 인터페이스를 지칭

예시) 추상화에 대한 개념을 자동차 운전으로 대입한 예시

- 핸들, 가속/브레이크 페달, 그 외 각종 버튼들 → 일반 인터페이스

- 자동차를 핸들, 페달등의 일반 인터페이스를 통해서 운전할 수 있지만

  엔진, 브레이크와 같은 부품들의 세부적인 동작 원리는 감춰져 있는 것

 

③ 상속 Inheritance

- 객체 지향 프로그래밍 언어에서 제공하는 함수/데이터의 모듈화의 일종으로

   피상속 객체(부모 클래스)의 데이터 및 함수를 상속 객체(자식 클래스)로 그대로 이어받아서 쓸 수 있는 기능  

- 상속을 통해서 코드를 더 작은 단위로, class로 나누고 더 작은 단위로 나누고 재사용할 수 있다.

- 자식 클래스는 부모 클래스로 부터 물려받은 함수를 재정의해서 사용하는 것이 가능한데

  이 기능을 'Overriding'이라고 한다.

 

④ 다형성 Polymorphism

- 객체가 다양한 형태로 표현될 수 있다는 개념

- 추상화된 객체와 같이 '틀'을 가진 객체가 구체화된 객체로 표현하는 것이 가능하다는 의미이다.

 

앞에서 OOP에 대해 설명할 때 '객체'를 통해서 데이터와 함수를 모듈화한다고 설명했었다.

그렇다면 객체는 어떻게 만들까? 객체는 'class'라는 것을 통해서 만들 수 있다.

'class', 클래스는 객체를 만들기 위한 설계도이다.

일종의 금형 설계도로 볼 수 있으며, 클래스를 통해서 동일한 속성이지만 각기 다른 데이터를 가진 객체를 생성하는 것이 가능하다.

그러면 이제 클래스를 활용해서 앞에서 작성한 코드를 새로 정리해보자.

public class Main {
	public static void main(String[] args){
    	캐릭터 캐릭터a = new 캐릭터(); //캐릭터a 객체 생성
        //캐릭터a 객체에 이하의 속성들을 입력
        캐릭터a.직업 = "전사";
        캐릭터a.스킬 = "내려치기";
        캐릭터a.체력 = 100;
        캐릭터a.공격력 = 60;
        
        캐릭터 캐릭터b = new 캐릭터(); //캐릭터b 객체 생성
        //캐릭터b 객체에 이하의 속성들을 입력함
        캐릭터b.직업 = "마법사";
        캐릭터b.스킬 = "파이어";
        캐릭터b.체력 = 60;
        캐릭터b.공격력 = 80;
    }
}

class 캐릭터 { //'캐릭터'라는 이름의 설계도를 만들었다.
//이를 통해서 '전사', '마법사' 등의 캐릭터 객체를 생성할 수 있다.
    String 직업;
    String 스킬;
    int 체력;
    int 공격력;
}

캐릭터 설계도가 존재하니, 앞에서 했던 것처럼 속성을 집어넣기 위해서 직업1, 직업2, 스킬1, 스킬2, ... 처럼 일일히

변수를 만들지 않고, 객체를 선언하고 데이터만 입력해주면 된다.

나머지 상세한 설명들은 이후 '클래스와 객체'에 대해 공부를 하게 될 때 상세하게 설명하기로 하고 지금은 이런게 있다 정도로

넘어가도록 하자.

마지막으로 클래스에 대해 정리하자면

 

클래스란 객체를 만들기 위한 일종의 설계도이며, 클래스를 만든다고 객체를 생성한 것은 아니다.

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

[Java] 4. 조건문  (1) 2022.10.05
[Java] 3. 연산자  (0) 2022.09.23
[Java] 2. 데이터 타입과 형변환  (1) 2022.09.21
[Java] 1. 변수와 상수  (0) 2022.09.13
[Java] 0. 자바 개요  (0) 2022.08.19